You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 20:12:33