与使用常规配置文件相比,Hydra 的优势是什么

Ila*_*fen 4 python configuration-files hydra fb-hydra

我想知道使用 Hydra 管理我的配置文件与直接加载 .yaml 配置文件(使用 import yaml)相比有什么优势?

Ing*_*rik 14

TL; DR

\n

如果您正在开发一个具有许多可配置参数的项目,那么使用Hydra确实有意义。\n如果没有,那么它弊大于利,因为它是包含在其中的额外要求你的项目,需要其他开发人员学习如何使用它,而实例化配置文件有时是一件令人头疼的事情。对于较小的项目.py,使用 、“pure”.yaml甚至.ini文件通常更有意义。

\n

九头蛇主要特点

\n

除了Jasha 的回答中提到的几点之外,我个人还经常使用 Hydra 的两个附加功能。

\n

对象实例化

\n

第一个功能是能够实例化对象,例如classes,并functions通过将对象的导入路径指定为名为 的键_target_,以及对象所需参数的值。例如,考虑以下.yaml配置文件:

\n
# conf/config.yaml\ndefaults:\n  - db:\n    - base\n    - sqlite\n  - /hydra/callbacks:\n    - helper_callback\n  - override hydra/help: opt_help\n  - override hydra/job_logging: custom\n  - _self_\n\n# Same as using:\n# from dateutil.relativedelta import relativedelta, FR\n# relative_date = relativedelta(weeks=3, weekday=FR(1))\n\nrelative_date:\n  _target_: dateutil.relativedelta.relativedelta\n  weeks: 3\n  weekday:\n    _target_: dateutil.relativedelta.FR\n    n: 1\n
Run Code Online (Sandbox Code Playgroud)\n

然后你可以relative_date使用类似的方法实例化:

\n
from hydra import compose, initialize\nfrom hydra.utils import instantiate\n\n\ninitialize(config_path=\'./conf\')\ncfg = compose(config_name="config")\n\n# Same as: relative_date = relativedelta(weeks=3, weekday=FR(1))\nrelative_date = instantiate(cfg[\'relative_date\'])\n
Run Code Online (Sandbox Code Playgroud)\n

或者:

\n
# foo.py\nimport hydra\nfrom hydra.utils import instantiate\n\n\n@hydra.main(config_path="./conf", config_name="config", version_base=hydra.__version__)\ndef main(cfg):\n    print(instantiate(cfg[\'relative_date\']))\n\n\nif __name__ == \'__main__\':\n    main()\n\n
Run Code Online (Sandbox Code Playgroud)\n

并执行:

\n
$ python foo.py\nrelativedelta(days=+21, weekday=FR(+1))\n
Run Code Online (Sandbox Code Playgroud)\n
\n

注意:第一个选项适用于交互式 Python 环境,例如 Jupyter,而第二种方法则不适用于。

\n
\n

检索环境变量

\n

有些项目使用环境变量。这些变量是进程运行环境(即您的计算机)的一部分。环境变量也可以在项目级别的名为.env. Hydra使您能够使用此类变量,如下所示:

\n
main:\n  source: file\n  debug: True\n  testing: True\n  user: ${oc.env:USER}          # <-- Access an environment variable named "USER"\n  src_dir: ${oc.env:SRC_DIR}/   # <-- Access an environment variable named "SRC_DIR"\n
Run Code Online (Sandbox Code Playgroud)\n
\n

注意:公平地说,这是OmegaConf的一项功能,OmegaConf 是Hydra在后台使用的包。

\n
\n

真实项目示例

\n

下面的树视图显示了我开发的项目的示例,该项目具有大量可配置参数,并且使用了Hydra

\n
conf\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 config.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 optimization.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 maintenance.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 sentry_config.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 alignment_conf\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 extras.yaml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 alignment.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 constraints\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 air_capacity.yaml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 delivery.yaml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 handling.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 db\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 base.yaml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 hana_dev.yaml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 hana_prod.yaml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 sqlite.yaml\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 hydra\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 callbacks\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 helper_callback.yaml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 help\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 opt_help.yaml\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 job_logging\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 custom.yaml\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 solvers\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cbc_cmd.yaml\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 choco_cmd.yaml\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 cplex.yaml\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 glpk_cmd.yaml\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 gurobi.yaml\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 mosek.yaml\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 scip.yaml\n
Run Code Online (Sandbox Code Playgroud)\n