Hydra 配置值被覆盖时怎么用 _self_ 检查合成顺序
Hydra 里出现“我在主配置写了值,为什么最后变了”,通常不是字段没有读取,而是 Defaults List 的合成顺序决定了同名值的覆盖关系。先记住结论:默认情况下,主配置会覆盖 Defaults List 中的配置;把 _self_ 放到 Defaults List 开头,则让被选中的配置组覆盖主配置。
官方地址:https://hydra.cc/
排查时按“选了哪些配置”与“同名字段谁最后写入”两层看:先用--info defaults看最终 Defaults List,再用--cfg job看最终配置值。不要只盯着config.yaml文件本身。
先看 defaults 和 _self_ 的覆盖规则
把问题缩小到一个配置组最容易判断。假设 db/mysql.yaml 提供数据库默认值,而主配置还想固定 db.user:
# conf/config.yaml
# _self_ 放在末尾,表示主配置字段在配置组之后合入
defaults:
- db: mysql
- _self_
db:
user: root
# conf/db/mysql.yaml
# 配置组提供一组可复用的数据库默认值
driver: mysql
user: omry
password: secret
此时最终的 db.driver、db.password 来自 db/mysql.yaml,db.user 取 config.yaml 的 root。Hydra 的规则是:多个配置贡献同一个字典时会合并;同名值按照顺序由后者覆盖。
如果把顺序改成下面这样:
# _self_ 放在开头,表示主配置字段先合入
defaults:
- _self_
- db: mysql
db:
user: root
那么 db/mysql.yaml 后合入,db.user 会变成 omry。因此,_self_ 不是普通业务字段,而是“主配置自身在 Defaults List 中位于哪里”的显式标记。省略它时,Hydra 会自动把它追加到列表末尾,也就是主配置默认覆盖配置组。

把同名字段拆成可判断的覆盖表
遇到训练参数或推理参数被覆盖时,不要先改很多 YAML。先列出“字段、来源、期望最终值”三列,通常马上能看出问题属于选择错误还是顺序错误:
| 字段 | 主配置 | 配置组 | _self_ 在末尾 | _self_ 在开头 |
|---|---|---|---|---|
db.driver | 未定义 | mysql | mysql | mysql |
db.user | root | omry | root | omry |
db.password | 未定义 | secret | secret | secret |
这张表还有一个实用边界:只有路径相同的值才会发生覆盖,不同键会合并保留。比如主配置只写 db.user,不会把配置组中的 db.driver 和 db.password 一起抹掉。若整段字典都被换掉,应该继续检查配置组的 package、路径和是否存在其他 Defaults List 项,而不是把所有现象都归因于 _self_。
用 Hydra 诊断信息定位覆盖来源
当文件越来越多,肉眼按 YAML 顺序推断会变得不可靠。Hydra 官方提供了三个互补视图:Defaults Tree 看输入配置树,--info defaults 看展开后的最终 Defaults List,--cfg job 看应用最终拿到的配置对象。
# 先查看配置树,确认嵌套配置组从哪里进入
python train.py --info defaults-tree
# 再查看展开后的最终 Defaults List,确认同一组是否被替换
python train.py --info defaults
# 最后查看任务配置,确认字段的最终值
python train.py --cfg job
如果 --info defaults 里根本没有预期的配置组,问题在 Defaults List 选择或配置搜索路径;如果配置组存在,但 --cfg job 的同名字段值不对,再回到 _self_ 的相对位置和其他同名定义。这个顺序能把“没选中”和“选中了但被覆盖”区分开。

把覆盖规则写进发布前检查
在训练或批量推理任务中,建议把覆盖意图固定下来:主配置负责环境级基线,就把 _self_ 放在末尾;配置组负责强制替换某些字段,就把 _self_ 放在开头。不要一边依赖默认位置,一边在多个嵌套配置里重复写同名键。
# 发布前检查使用同一套入口,避免只看源文件
# --info defaults 关注“选了谁”,--cfg job 关注“最后是多少”
python train.py --info defaults > defaults.txt
python train.py --cfg job > resolved.yaml
最终可以把检查规则压缩成四句话:
defaults负责选择配置输入,不等于最终字段值。_self_负责声明主配置的合成位置。- 同名值由后合入的配置覆盖,不同键仍会合并。
- 先看
--info defaults,再看--cfg job,不要凭文件直觉排障。
相关问题
不写 _self_ 会怎样?
Hydra 会把它自动追加到 Defaults List 末尾,因此主配置通常会覆盖配置组中的同名字段。为了让覆盖意图清楚,建议在主配置同时包含业务字段和 Defaults List 时显式写出。
为什么配置组存在但最终值仍然不对?
先看 --info defaults 确认最终列表中是否有其他同名配置,再检查 _self_ 的位置。配置组“被加载”与它的某个字段“最终获胜”是两个不同判断。
Hydra 怎么在命令行切换配置组并允许缺省配置
- 上一篇
- Hydra 怎么在命令行切换配置组并允许缺省配置
- 下一篇
- Pydantic validate_call 为什么默认不校验函数返回值
-
- 科技周边 · 人工智能 | 25分钟前 |
- OpenAI 后台响应被取消后客户端怎么保存最终状态
- 165浏览 收藏
-
- 科技周边 · 人工智能 | 27分钟前 | Pipeline ·
- Haystack Pipeline 组件连接类型不匹配怎么办
- 383浏览 收藏
-
- 科技周边 · 人工智能 | 27分钟前 | 人工智能 · openai · Webhook · WebHook OpenAI Responses API background response response.completed
- OpenAI 后台响应怎么用 webhook 接收完成事件
- 499浏览 收藏
-
- 科技周边 · 人工智能 | 31分钟前 |
- Gradio 并发请求怎么设置 concurrency_limit
- 305浏览 收藏
-
- 科技周边 · 人工智能 | 33分钟前 |
- OpenAI webhook 事件失败后怎么区分完成取消和失败状态
- 356浏览 收藏
-
- 科技周边 · 人工智能 | 36分钟前 | 人工智能 · A2A Agent Card Agent Card capabilities supportedInterfaces
- A2A Agent Card 怎么声明代理能力和服务地址
- 165浏览 收藏
-
- 科技周边 · 人工智能 | 11小时前 | Hugging Face Datasets rename_columns 列名冲突
- Hugging Face Datasets 批量重命名列遇到重名怎样处理
- 468浏览 收藏
-
- 科技周边 · 人工智能 | 16小时前 | python · 人工智能 · Hugging Face Transformers tokenizer max_length truncation 句子对分词 only_second
- Transformers 对句子对分词时怎样只截断第二段
- 471浏览 收藏
-
- 科技周边 · 人工智能 | 16小时前 | Transformers 标签对齐 word_ids 词级标注 token分类
- Transformers 怎样用 word_ids 对齐词级标注
- 378浏览 收藏
-
- 科技周边 · 人工智能 | 17小时前 |
- Transformers 怎样取得特殊 token 的位置掩码
- 367浏览 收藏
-
- 科技周边 · 人工智能 | 17小时前 | Hugging Face 向量检索 FAISS Datasets 索引保存
- Hugging Face Datasets 怎样单独保存与载入 FAISS 索引
- 403浏览 收藏
-
- 科技周边 · 人工智能 | 18小时前 | Hugging Face Datasets batch_size to_dict batched 数据集导出
- Hugging Face Datasets 怎样分批导出字典而不一次读取全量
- 241浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 976次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 982次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 1098次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 1068次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 906次使用
-
- Go中的应用配置管理详解
- 2023-02-16 218浏览
-
- golang配置管理神器Viper使用教程
- 2022-12-27 266浏览
-
- go格式“占位符”输入输出 类似python的input
- 2023-01-19 346浏览
-
- Golang如何调用Python代码详解
- 2023-01-07 235浏览
-
- Go项目配置管理神器之viper的介绍与使用详解
- 2023-02-25 303浏览

