Ila*_*fen 4 python configuration-files hydra fb-hydra
我想知道使用 Hydra 管理我的配置文件与直接加载 .yaml 配置文件(使用 import yaml)相比有什么优势?
Ing*_*rik 14
如果您正在开发一个具有许多可配置参数的项目,那么使用Hydra确实有意义。\n如果没有,那么它弊大于利,因为它是包含在其中的额外要求你的项目,需要其他开发人员学习如何使用它,而实例化配置文件有时是一件令人头疼的事情。对于较小的项目.py,使用 、“pure”.yaml甚至.ini文件通常更有意义。
除了Jasha 的回答中提到的几点之外,我个人还经常使用 Hydra 的两个附加功能。
\n第一个功能是能够实例化对象,例如classes,并functions通过将对象的导入路径指定为名为 的键_target_,以及对象所需参数的值。例如,考虑以下.yaml配置文件:
# 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\nRun Code Online (Sandbox Code Playgroud)\n然后你可以relative_date使用类似的方法实例化:
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\'])\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n并执行:
\n$ python foo.py\nrelativedelta(days=+21, weekday=FR(+1))\nRun Code Online (Sandbox Code Playgroud)\n\n\n注意:第一个选项适用于交互式 Python 环境,例如 Jupyter,而第二种方法则不适用于。
\n
有些项目使用环境变量。这些变量是进程运行环境(即您的计算机)的一部分。环境变量也可以在项目级别的名为.env. Hydra使您能够使用此类变量,如下所示:
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"\nRun Code Online (Sandbox Code Playgroud)\n\n\n注意:公平地说,这是OmegaConf的一项功能,OmegaConf 是Hydra在后台使用的包。
\n
下面的树视图显示了我开发的项目的示例,该项目具有大量可配置参数,并且使用了Hydra:
\nconf\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\nRun Code Online (Sandbox Code Playgroud)\n