Hydra入门级教程——一个简单易用的配置文件管理框架
摘要
Hydra是一个基于OmegaConf的开源项目配置框架,支持多配置源、模块化配置及动态加载,适用于机器学习项目。通过pip安装,利用装饰器@hydra.main配置项目,支持命令行参数传递与配置分组管理,方便复杂项目的配置维护。[本摘要由小猫AI生成]
什么是Hydra
Hydra
是Github
开源的项目配置框架,它基于OmegaConf
实现了对复杂项目配置文件的灵活管理。它支持多配置源、配置覆盖和模块化配置,使配置管理更加灵活和可维护。Hydra
的主要优势包括强大的配置组合能力、易于扩展和集成,以及支持动态配置加载,适用于机器学习和数据科学项目。
附:
安装Hydra
通过pip
来安装Hydra
库。
pip install hydra-core --upgrade
Hydra框架的使用
在同一路径下新建run.py
和config.yaml
文件,YAML
文件的内容如下:
version: 2.0
name: "test_yaml"
args:
epoch: 10
lr: 0.1
batchsize: ???
python
文件的内容如下:
from omegaconf import OmegaConf, DictConfig
import hydra
@hydra.main(version_base=None, config_path=".", config_name="config.yaml")
def run(cfg: DictConfig) -> None:
print(cfg)
if __name__ == "__main__":
run()
run.py
使用了hydra.main
的装饰器,在run
函数执行前,将先执行hydra
自带的主函数。在装饰器中,需要传入version_base
,config_path
,config_name
这三个参数。其中,version_base
指定了配置文件的版本基准,config_path
指定了配置文件的路径,config_name
指定了配置文件的文件名。通过这个框架,可以将DictConfig
类传入函数中进行使用。
运行结果:
{'version': 2.0, 'name': 'test_yaml', 'args': {'epoch': 10, 'lr': 0.1, 'batchsize': '???'}}
输出目录
在运行使用Hydra
框架的代码后,将生成一个输出目录,包含运行的日期、时间、配置文件等信息。用tree
命令查看运行后的目录结构:
D:.
│ config.yaml
│ run.py
│ tree.txt
│
└─outputs
└─2024-11-03
└─13-24-43
│ run.log
│
└─.hydra
config.yaml
hydra.yaml
overrides.yaml
可以看到,该输出目录以日期和时间分别生成子目录,这有利于我们在运行项目的时候对不同的配置文件和结果进行本地版本管理。在.hydra
文件夹中,记录了三个配置文件的信息,config.yaml
包含了原配置文件的内容,hydra.yaml
包含了Hydra
框架自带的一些参数配置信息,overrides.yaml
则保存通过CLI
命令行参数对原配置文件参数进行修改而新增的配置参数信息。
上述过程中,由于没有使用命令行参数进行修改,因此overrides.yaml
文件中没有保存信息。现在,我们可以通过命令行来运行同一段代码:
python run.py name=test_cli
运行后将会生成一个新的输出目录,同时在该目录下的overrides.yaml
中将会新增一条记录:
- name=test_cli
从命令行读入参数
当我们不需要配置文件来提供参数,而是希望使用命令行来传递参数时,可以在hydra.main
装饰器中不填写config_path
和config_name
参数的信息,代码修改如下:
@hydra.main(version_base=None)
def run(cfg: DictConfig) -> None:
print(cfg)
使用这种方法来读入命令行参数时,由于没有预先设定好的参数,不能直接进行赋值。我们可以在每个变量前加上++
从而来传递参数:
python run.py ++name=test_cli_add ++version=2.0
运行结果:
{'name': 'test_cli_add', 'version': 2.0}
我们可以发现输出目录自动生成了config.yaml
:
name: test_cli_add
version: 2.0
同时,overrides.yaml
文件也记录了命令行传递的参数信息:
- ++name=test_cli_add
- ++version=2.0
Hydra配置分组管理
以深度学习项目为例,在一个项目中可能包含了数据、模型、优化器等多种配置文件,倘若这些配置文件无法进行分组管理,那么配置文件的维护将是十分困难的任务。因此,Hydra
提供了配置文件的分组管理能力,能够很好地在大型项目管理中发挥必要的作用。
在python
文件中,我们指定config_path
的路径,之后我们便可以通过命令行,按照+文件夹=YAML文件名
的格式,对分组的配置文件进行运行。分别执行下面两个命令行语句:
python run.py +server=server_config
运行结果:
{'server': {'server': {'port': 80, 'host': 'localhost'}, 'username': 'ye', 'url': 'http://${server.host}:${server.port}/'}}
若存在多个分组,我们可以在根目录创建一个config.yaml
来配置每个分组的默认执行文件。使用YAML
文件中的default
关键字来指定每个分组的默认执行文件列表:
defaults:
- server: server_config
- models: parameters
修改run.py
如下:
from omegaconf import OmegaConf, DictConfig
import hydra
@hydra.main(version_base=None, config_path=".", config_name="config")
def run(cfg: DictConfig) -> None:
OmegaConf.resolve(cfg)
print(OmegaConf.to_yaml(cfg))
if __name__ == "__main__":
run()
通过命令行来运行这段代码:
python run.py models.args.batchsize=32
运行结果:
server:
server:
port: 80
host: localhost
username: ye
url: http://localhost:80/
models:
version: 2.0
name: test_yaml
args:
epoch: 10
lr: 0.1
batchsize: 32
可以看到,通过制定默认配置文件,我们对多个分组同时处理并运行。