-
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.pyrun.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的配置