-
Notifications
You must be signed in to change notification settings - Fork 4
Customize Config
marsggbo edited this page Apr 18, 2022
·
4 revisions
Hyperbox Structure
- callbacks
- datamodules
yaml文件多路径设置
hydra支持多路径的参数文件 (yaml) 设置,这个路径其实就类似于PYTHONPATH
,不同路径是会有先后顺序的。
我们执行如下命令
python -m hyperbox.run --info searchpath
后可以得到下面的输出结果
| 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=config.yaml)
假设运行@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`的原理
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()
你可以直接通过以下方式运行你的代码
python -m hyperbox.run hydra.searchpath=[:file///path/to/your/configs] experiment=your_exp.yaml model=model1 data=data2
这样一来你的代码就可以和hyperbox彻底解耦了
如果你想自定义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
修改成绝对路径,但是这种方式不太优雅,因为你换个环境后就又得修改,所以另一种方式如下。
- 首先你需要在你的
new_app/configs
路径下新建和hyperbox.configs
一样的目录,即使是空的也需要创建,另外config.yaml
文件你直接拷贝过来就可以了。
new_app
|_ run.py
|_ configs
|_ callbacks
|_ datamodule
|_ experiment
|_ hparams_search
|_ hydra
|_ logger
|_ model
|_ trainer
|_ config.yaml
- 路径配置
run.py
里的配置文件路径可以保持不变,因为hydra
会自动补全这个相对路径, 即
@hydra.main(config_path="configs/", config_name="config.yaml")
def main(config: DictConfig):
...
- 运行方法
cd new_app
python run.py hydra.searchpath=[:pkg//hyperbox.configs]
此时main
路径就变成了你的新项目了,优先级最高,而hyperbox
次之,但是需要注意的是,你的配置项必须要兼容 hyperbox
的配置