如何在Hydra配置中通过拼接覆盖默认值,避免全路径重复编写?
Hydra配置路径覆盖的递归插值问题解决
配置结构
我的Hydra配置目录结构如下:
. ├── configs │ ├── experiment │ │ └── ml_experiment.yaml │ └── paths │ └── default.yaml
现有配置内容
configs/paths/default.yaml
data_dir: /path/to/data/nn_train_sets log_dir: /path/to/experiments output_dir: /path/to/experiments
configs/experiment/ml_experiment.yaml(当前版本)
run_name: ${model.net.model_name}-${now:%Y%m%d}-${now:%H%M%S}-other-options paths: output_dir: /path/to/experiments/qad/${run_name} log_dir: /path/to/experiments/qad/${run_name}
当前实验配置通过新增qad目录层级覆盖路径配置,但需要重复编写完整基础路径,希望优化写法。
问题与需求
我希望在ml_experiment.yaml中直接基于原有路径配置拼接qad和run_name,比如写成:
paths: output_dir: ${paths.output_dir}/qad/${run_name} log_dir: ${paths.log_dir}/qad/${run_name}
但这种写法会触发Recursive interpolation detected异常,尝试过${paths}、_here_、+=等方式都无效,需要在不新增配置键的前提下解决这个问题。
解决方案
使用Hydra的@original修饰符引用配置键的原始值(即从paths/default.yaml加载的初始值),即可避免递归引用问题。修改后的ml_experiment.yaml内容如下:
run_name: ${model.net.model_name}-${now:%Y%m%d}-${now:%H%M%S}-other-options paths: output_dir: ${paths.output_dir@original}/qad/${run_name} log_dir: ${paths.log_dir@original}/qad/${run_name}
@original的作用是跳过当前正在覆盖的配置值,直接引用该键最初加载的原始配置内容,这样既实现了路径拼接,又不会触发递归插值错误,完全符合需求。
内容的提问来源于stack exchange,提问作者wl2776
相关产品推荐
相关产品推荐

