Skip to content

Hydra Q&A

marsggbo edited this page Apr 18, 2022 · 4 revisions
yaml文件多路径设置

1. yaml文件多路径设置

hydra支持多路径的参数文件 (yaml) 设置,这个路径其实就类似于PYTHONPATH,不同路径是会有先后顺序的。

我们先看下面的例子:

| Provider                         | Search path                                               |
------------------------------------------------------------------------------------------------
| hydra                            | pkg://hydra.conf                                          |
| main                             | file:///home/username/hyperbox/hyperbox/configs           |
| hydra-colorlog                   | pkg://hydra_plugins.hydra_colorlog.conf                   |
| hydra.searchpath in command-line | file:////home/username/hyperbox_app/mnist/configs         |
| schema                           | structured://                                             |
------------------------------------------------------------------------------------------------
  • 可以看到最优先的是hydra自身的pkg://hydra.conf模块,可以看到前面有pkg://标识,这个表示hydra.conf是以 python 模块的形式读取的,实现方式官方有给示例
  • 第二的是main,其实就是@hydra.main(config_path='/home/username/hyperbox/hyperbox/configs', , config_name=1config.yaml1) 假设运行@hydra.main的文件名是run.py,那么config_path一般来说就是要设置成相对于run.py的配置文件的路径,当然你也可以设置成绝对路径
  • 排在第四的是hydra.searchpath,你可以在命令后面手动设置这个参数来增加新的配置文件路径.

注意:

  • @hydra.main只能设置路径
  • hydra.searchpath即可以设置路径,也可以设置成一个python模块
    • 路径: [:file//+路径],注意事项双斜线。 例子:python run.py hydra.searchpath=[:file///home/username/hyperbox_app/mnist/configs]
    • 模块: [:pkg//+路径],例子: python run.py hydra.searchpath=[:pkg//hyperbox.configs]

将配置文件设置成python的可import模块的例子如下

your_app
|_configs
  |_ __init__.py
  |_ data
    |_ data1.yaml
    |_ data2.yaml
  |_ models
    |_ model1.yaml
|_models
  |_ model1.py
  |_ model2.py
...
`hyperbox.run`的原理

2. hyperbox.run的原理

2.1 hyperbox.run的原理

hyperbox本身实现了一个run.py文件,核心代码如下:

import hydra
...

@hydra.main(config_path="configs/", config_name="config.yaml")
def main(config: DictConfig):

    # Imports should be nested inside @hydra.main to optimize tab completion
    # Read more here: https://github.com/facebookresearch/hydra/issues/934
    from hyperbox.train import train
    from hyperbox.utils import utils

    return train(config)


if __name__ == "__main__":
    main()

2.2 如何使用 hyperbox.run

你可以直接通过以下方式运行你的代码

python -m hyperbox.run hydra.searchpath=[:file///path/to/your/configs] experiment=your_exp.yaml model=model1 data=data2

这样一来你的代码就可以和hyperbox彻底解耦了

2.3 如何自定义run.py

如果你想自定义run.py,假设你的新项目文件夹名字是new_app

注意这个文件夹一定要是可import的,所以你需要在你的项目下设置setup.py文件,并通过python setup.py develop命令将你的项目安装成一个可导入的包。

假设新项目框架如下

new_app
|_ run.py
|_ setup.py
|_ __init__.py
|_ configs
  |_ model
    |_ model3.yaml
|_ models
  |_ model3.py

run.py你唯一需要修改的地方就是把@hydra.main的路径改成hyperbox的路径,有几种方式

  • 方法1:路径 :file//
# run.py

@hydra.main(config_path="/path/to/hyperbox/configs/", config_name="config.yaml")
def main(config: DictConfig):
    ...

运行的时候参考命令如下

cd new_app
python run.py hydra.searchpath=[:file///path/to/new_app/configs] experiment=...
  • 方法2

直接把hyperbox的configs整个目录拷贝到你自己的新项目里

  • 方法3 模块 :pkg// (貌似不行)

注意该方法还是以hyperbox的默认config作为main,所以需要在run.py里把config_path修改成绝对路径,但是这种方式不太优雅,因为你换个环境后就又得修改,所以另一种方式如下。

  1. 首先你需要在你的new_app/configs路径下新建和hyperbox.configs一样的目录,即使是空的也需要创建,另外config.yaml文件你直接拷贝过来就可以了。
new_app
|_ run.py
|_ configs
  |_ callbacks
  |_ datamodule
  |_ experiment
  |_ hparams_search
  |_ hydra
  |_ logger
  |_ model
  |_ trainer
  |_ config.yaml
  1. 路径配置

run.py 里的配置文件路径可以保持不变,因为hydra会自动补全这个相对路径, 即

@hydra.main(config_path="configs/", config_name="config.yaml")
def main(config: DictConfig):
    ...
  1. 运行方法
cd new_app
python run.py hydra.searchpath=[:pkg//hyperbox.configs]

此时main路径就变成了你的新项目了,优先级最高,而hyperbox次之,但是需要注意的是,你的配置项必须要兼容 hyperbox的配置