如何在Hydra的datasets配置组中共享通用配置项?
Hydra配置组提取公共配置项方案
问题场景
现有两组Hydra数据集配置组,原始文件结构如下:
conf ├── datasets │ ├── A │ │ ├── a1.yaml │ │ └── a2.yaml │ └── B │ ├── b1.yaml │ └── b2.yaml └── config.yaml
可通过dataset=A/a1或dataset=B/b1这类命令选择对应数据集配置。目前A、B组内的各配置文件存在大量重复通用项,需要将这些通用项提取到对应组的公共配置文件中,预期文件结构如下:
conf ├── datasets │ ├── A │ │ ├── a_common.yaml # a1和a2的通用配置项 │ │ ├── a1.yaml │ │ └── a2.yaml │ └── B │ ├── b_common.yaml # b1和b2的通用配置项 │ ├── b1.yaml │ └── b2.yaml └── config.yaml
具体实现步骤
1. 编写组内公共配置文件
- 在
datasets/A/下创建a_common.yaml,将a1、a2中重复的通用配置项全部迁移到这里; - 在
datasets/B/下创建b_common.yaml,同理迁移b1、b2的通用配置项。
2. 子配置文件继承公共配置
修改组内的子配置文件,通过Hydra的默认配置继承语法引入公共配置:
- 以
a1.yaml为例,修改后内容如下(仅保留独有的配置项):defaults: - a_common # 加载同目录下的a_common.yaml # 以下是a1独有的配置项,覆盖公共配置中的同名项(如果有) batch_size: 64 a2.yaml、b1.yaml、b2.yaml按同样方式修改,分别引入对应组的公共配置文件。
3. 验证配置加载
保持原有命令不变,比如执行dataset=A/a1时,Hydra会自动加载a_common.yaml的内容,并与a1.yaml的内容合并。若子配置与公共配置存在同名项,子配置的内容会覆盖公共配置,符合常规的配置优先级逻辑。
额外说明
- 公共配置文件的命名可自定义,只要子配置的
defaults列表中对应正确即可; - 若公共配置需要继承更上层的全局配置,可在公共配置文件中添加
defaults,例如a_common.yaml:defaults: - _self_ # 确保自身配置被优先加载 - ../../global_dataset_config # 引入上层全局配置 # 这里是A组的通用配置项 data_root: "/data/A" num_workers: 8
内容的提问来源于stack exchange,提问作者Allaire Black
相关产品推荐
相关产品推荐

