Hydra是Facebook Research开发的开源Python配置管理框架,旨在解决复杂项目中配置混乱、多环境与多参数组合管理的难题。该框架采用分层配置与动态组合设计,支持以YAML文件实现结构化配置。Hydra尤其适用于简化机器学习实验、软件开发及其他复杂应用的配置管理。它的名字来源于希腊神话中的九头蛇,寓意其能够灵活管理多种配置组合。Hydra的核心特性包括支持多源分层配置组合、可通过命令行直接覆盖配置、提供动态命令补全功能,同时支持本地与远程运行,并能通过单命令执行批量参数作业。
Hydra的官方仓库地址为:hydra,详细文档可参阅:hydra-doc。Hydra功能全面,本文主要介绍其基本使用方法,更多高级功能请参考官方文档。截至本文撰写时,Hydra的稳定版本为1.3,该版本兼容Python 3.6至3.11,并全面支持Linux、macOS和Windows操作系统。安装命令如下:
pip install hydra-core --upgrade
目录
- 1 基础教程
- 1.1 快速入门
- 1.2 整合应用
- 1.3 信息管理
- 2 结构化配置
- 3 参考
1 基础教程
1.1 快速入门
简单示例
以下代码是一个简单的Hydra应用示例,它会打印出配置信息,其中my_app函数是编写业务逻辑的入口。- from omegaconf import DictConfig, OmegaConf
- import hydra
- @hydra.main(version_base=None)
- def my_app(cfg: DictConfig) -> None:
- print(OmegaConf.to_yaml(cfg))
- if __name__ == "__main__":
- my_app()
复制代码 如果你直接执行这段代码(没有任何命令行参数),程序会输出一个空的配置对象:这是因为,当运行my_app.py时,@hydra.main装饰器会自动拦截对 my_app()的调用。此时Hydra会初始化一个空的DictConfig对象(类似于Python字典),并将其作为参数cfg 传递给函数。由于当前配置为空,OmegaConf.to_yaml(cfg)将其转换为YAML格式后,仅输出一个空对象。OmegaConf是Hydra的底层配置引擎,Hydra基于OmegaConf实现上层的复杂应用配置与运行管理,且OmegaConf可独立使用。
此外默认情况下,Hydra会创建以下目录结构以追踪和管理程序的运行结果:- outputs/
- ├── yyyy-mm-dd/ # 按日期分组
- │ └── hh-mm-ss/ # 按时间精确到秒
- │ └── .hydra/ # 保存本次运行的配置
- │ ├── config.yaml # 完整的配置
- │ ├── hydra.yaml # Hydra 自身的配置
- │ └── overrides.yaml # 命令行覆盖的参数
- │ └── my_app.log # 日志文件(如果配置了日志)
- │ └── 其他输出文件 # 你的程序生成的文件
复制代码 可以通过以下方式为配置添加内容:
<ol>通过命令行添加:- # 不支持直接在 +key=value 语法中传入非 ASCII 字符
- python my_app.py +name="zhangsan" +age=25
复制代码 输出:创建配置文件:
创建一个config.yaml文件,然后运行:- python my_app.py --config-path=. --config-name=config
复制代码 在代码中设置默认配置:
可以修改代码,为@hydra.main装饰器添加配置参数:- from omegaconf import DictConfig, OmegaConf
- import hydra
- @hydra.main(version_base=None, config_path=".", config_name="config")
- def my_app(cfg):
- print(OmegaConf.to_yaml(cfg))
- if __name__ == "__main__":
- my_app()
复制代码 可以通过命令行覆盖已加载配置中的值,但是注意无需添加+前缀:- python my_app.py name="lisi"
复制代码 使用++前缀可实现若配置中已存在该参数则覆盖,若不存在则新增:- python my_app.py ++name="wangwu" ++password=1234
复制代码 要注意
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |