Hydra如何引用conf目录下其他yaml文件覆盖输出目录配置
问题根因
两种写法失效的原因很明确:
- 直接写
hydra.run.dir: job_timestamp时,Hydra会把job_timestamp识别为普通字符串值,不会自动匹配同名配置文件,所以才会生成名为job_timestamp的输出文件夹。 - 把
job_timestamp.yaml放在conf/hydra/run/dir/路径下不符合Hydra的配置加载规则:hydra是Hydra框架的保留配置根,默认从框架内置配置库加载内容,你在自己的conf目录下建同名嵌套目录不会被识别为对应配置组的内容,所以defaults列表会报找不到hydra/run/dir项的错误。
符合DRY原则的实现方案
1. 调整配置目录结构
不要把自定义复用配置放在conf下的hydra目录里,单独建公共配置组目录存放可复用配置,调整后的目录结构如下:
conf ├── common │ └── run_dir │ └── job_timestamp.yaml ├── main.yaml ├── main2.yaml └── evaluate.yaml
job_timestamp.yaml内直接写路径规则即可,不需要额外套键名:
./outputs/${status}/${now:%Y-%m-%d}/${now:%H-%M-%S}
2. 主配置文件引用公共配置
在所有需要复用该输出路径规则的主配置文件(main.yaml、main2.yaml、evaluate.yaml等)中,通过Hydra的包定位语法引入公共配置,直接绑定到hydra.run.dir配置项,以main.yaml为例:
defaults: - common/run_dir/job_timestamp@hydra.run.dir - _self_ # 下方写该主配置对应的其他业务配置即可
这里的@语法作用是:将指定路径的配置文件内容,直接赋值给@后面对应的配置键,不需要重复写长串路径规则。后续如果要调整输出目录格式,只需要修改job_timestamp.yaml一个文件,所有引用它的主配置都会同步生效。
注意:defaults列表里的
_self_要放在公共配置项的后面,保证主配置内写的临时覆盖配置优先级更高,不会被引入的公共配置冲掉。
配置完成后重新运行任务,Hydra就会按照你定义的规则生成输出目录,不会再出现路径识别错误的问题。
内容的提问来源于stack exchange,提问作者Steven Zhang
相关产品推荐
相关产品推荐

