
Hydra 插件配置指南直接覆盖与扩展插件默认配置两种模式【免费下载链接】hydraHydra is a framework for elegantly configuring complex applications项目地址: https://gitcode.com/GitHub_Trending/hyd/hydra本篇指南围绕 Hydra 的插件配置机制展开讲解定制任意 Hydra 插件Launcher、Sweeper、Config Source 等的两种主要方式——在主配置中直接覆盖以及通过扩展插件默认配置再在命令行中切换。读完本文你将掌握插件配置组如hydra/launcher、hydra/sweeper的完整用法、跨配置组扩展配置的绝对路径写法以及如何在多套插件参数方案之间自由切换。两种配置插件的方式Hydra 插件通常自带一套开箱即用的合理默认值大部分场景下无需任何配置即可工作。当需要定制插件行为时官方提供了两条主要路径在主配置中直接覆盖Overriding in primary config直接在应用的主配置文件的hydra.*节点下覆盖插件字段。扩展插件默认配置Extending plugin default config新建一个继承插件默认配置的配置文件从主配置或命令行引用它。两种方式的取舍非常直观维度直接覆盖扩展默认配置上手成本更简单改动集中在主配置稍复杂需要多建一个配置文件切换不同插件配置困难改一次主配置影响全局容易命令行一条覆盖即可切换主配置整洁度插件细节混入主配置插件细节独立成文件多模式插件的适配无法适配 schema 不同的模式天然支持不同 schema 的模式上述两种方法适用于所有 Hydra 插件。为了让说明更具体下文沿用官方文档中的虚构 Launcher 插件MoonLauncher作为例子它有两种模式falcon9会把应用真正发射到月球sim则只做发射模拟。MoonLauncher的配置 schema示意如下两种模式对应两套结构化配置dataclass class Falcon9Conf: ton_fuel: int 10 dataclass class Simulation: ton_fuel: int 10 window_size: width: 1024 height: 768可以看到falcon9模式只有ton_fuel一个字段而sim模式额外带有window_size宽 1024、高 768。这正是下文两种配置方式产生差异的根源。方式一在主配置中直接覆盖插件参数在应用的主配置中hydra节点下的launcher子节点即为当前 Launcher 插件的配置。直接对它赋值即可完成覆盖a: 1 hydra: launcher: ton_fuel: 2配合命令行覆盖选择插件模式# 选择 falcon9 模式 hydra/launcherfalcon9最终合成的 launcher 配置为hydra: launcher: ton_fuel: 2如果切换为模拟模式# 选择 sim 模式 hydra/launchersim最终合成结果为hydra: launcher: ton_fuel: 2 window_size: width: 1024 height: 768注意直接覆盖方式隐含一个前提假设——当前选用的插件必须包含你所覆盖的全部字段。以上面的window_size为例它只存在于sim模式的 schema 中如果主配置里写了hydra.launcher.window_size.width那么falcon9模式将无法再被选用字段不存在配置合成会失败。这正是方式二要解决的问题。从源码角度看hydra/launcher与hydra/sweeper是 Hydra 内置的“控制器”配置组。在 config_loader_impl.py 中可以看到它们被固定登记为(hydra/launcher, launcher)与(hydra/sweeper, sweeper)并且要求这两个组必须在 sweep 开始前选定不能在任务内部被改动。这就是为什么“直接覆盖”和“命令行覆盖”是官方推荐的插件定制入口。方式二扩展插件默认配置推荐这种方式假定你已经熟悉 扩展配置Extending Configs 这一通用模式其本质是新建一个配置文件在其defaults列表中引入插件的默认配置然后在当前文件中覆盖或新增字段。扩展插件默认配置的优势有三点分离配置关注点插件相关的配置独立成文件主配置保持干净。更容易在多种插件配置之间切换命令行一条覆盖即可完成切换。天然适配多模式插件当插件存在 schema 不同的多种模式时可以为每种模式分别准备扩展配置。沿用 MoonLauncher 的例子假设我们希望为不同模式覆盖不同参数。为falcon9模式创建一个扩展配置hydra/launcher/my_falcon9.yamldefaults: - falcon9 ton_fuel: 2为sim模式创建一个扩展配置hydra/launcher/my_sim.yaml配置的是 Launcher 插件因此放在hydra/launcher配置组目录下defaults: - sim window_size: width: 768然后通过命令行覆盖即可轻松拿到所需配置hydra/launchermy_falcon9合成结果ton_fuel被扩展配置覆盖为 2hydra: launcher: ton_fuel: 2hydra/launchermy_sim合成结果ton_fuel沿用sim默认值 10window_size.width被覆盖为 768height沿用默认值 768hydra: launcher: ton_fuel: 10 window_size: width: 768 height: 768与“方式一”对比这里的my_falcon9与my_sim是完全独立的两个配置文件分别只覆盖各自模式 schema 中存在的字段。想切换方案时只需改变命令行中的选项名my_falcon9/my_sim主配置完全不用动。仓库中的 extending_configs 示例应用 是这一模式的真实落地conf/db/mysql_extending_from_this_group.yaml通过defaults: [base_mysql]继承同一配置组内的基础配置再覆盖port、补充user、password、encoding等字段my_app.py 演示了运行效果——基础配置的字段被继承扩展字段被覆盖/新增。插件配置组如hydra/launcher与普通配置组遵循完全相同的机制这就是为什么扩展插件的默认配置与扩展普通配置毫无二致。跨配置组扩展绝对路径与_here_关键字如果插件默认配置与扩展配置不在同一个配置组内就需要用绝对路径以/开头引用它并通过_here_关键字把被引入配置的 package 锚定到当前配置所在的位置_here_的详细说明见 Overriding Packages。例如把db/mysql.yaml改为扩展另一个配置组db_schema中的base_mysqldefaults: - /db_schema/base_mysql_here_ user: omry password: secret port: 3307 encoding: utf8其余行为与同配置组内扩展完全一致。仓库中对应的真实文件是 mysql_extending_from_another_group.yaml被引入的 base_mysql.yaml 位于db_schema组。对于插件而言这意味着你完全可以把“插件默认配置”与“你的定制配置”放在不同的包/目录下只要用绝对路径加上_here_就能正确合并。从源码看插件配置的落地形态插件接口与配置组注册所有 Hydra 插件都继承自 Plugin 基类。以 Launcher 为例launcher.py 定义了两个抽象方法setup()负责装配启动器实例接收HydraContext、任务函数与完整配置launch()负责执行一批任务并返回JobReturn序列。插件提供方则通过ConfigStore把结构化配置dataclass注册到对应配置组。内置的 Basic Launcher 就是一个最小范例basic_launcher.py 中ConfigStore.instance().store(grouphydra/launcher, namebasic, ...)把basic选项注册进了hydra/launcher配置组——这正是hydra/launcherbasic命令行的数据来源。真实插件不同模式对应不同 schema仓库中的hydra_submitit_launcher插件完美印证了“插件有多种模式、各模式 schema 不同”的场景。它的 config.py 定义了BaseQueueConf所有执行器共享的基础字段如timeout_min默认 60 分钟、cpus_per_task、gpus_per_node、tasks_per_node、mem_gb、nodes、name、stderr_to_stdout等SlurmQueueConf继承基础字段并补充 Slurm 专属字段如partition、qos、account、max_num_timeout、additional_parameters等_target_指向SlurmLauncherLocalQueueConf同样继承基础字段_target_指向LocalLauncher。随后通过两次ConfigStore.instance().store(...)分别注册为hydra/launcher组下的submitit_slurm与submitit_local两个选项。于是# 使用 Slurm 模式 hydra/launchersubmitit_slurm # 使用本地模式 hydra/launchersubmitit_local而SlurmQueueConf与LocalQueueConf拥有不同的 schema——Slurm 模式才有partition、qos等字段。这种情况下如果像“方式一”那样在主配置里直接写hydra.launcher.partition: xxx切到submitit_local模式就会因为字段不存在而失败正确的做法就是“方式二”分别建立hydra/launcher/my_slurm.yamldefaults: [submitit_slurm] 覆盖partition、qos等和hydra/launcher/my_local.yamldefaults: [submitit_local] 覆盖本地相关参数再在命令行按需切换。类似地配置源Config Source插件的基类在 config_source.py 中定义了scheme()、load_config()、is_group()、is_config()、available()、list()等接口配置结构则通过ConfigResultprovider、path、config、header等字段返回。这些插件同样遵循“自带默认配置 可覆盖/可扩展”的模型。配置组的目录形态内置的 Hydra 配置组在仓库中对应 hydra/conf/hydra 目录包含help、hydra_help、hydra_logging、job_logging、output等子组。插件提供的配置既可以像内置插件那样以 dataclass 结构化配置注册也可以直接以 YAML 文件形式放在配置搜索路径下的hydra/launcher/、hydra/sweeper/等目录中。扩展插件的默认配置my_falcon9.yaml、my_sim.yaml正是在你自己的配置目录下新建这类文件机制与普通配置组完全一致。实践要点小结能用扩展就别直接覆盖当插件存在多种模式且 schema 不同如 Slurm 与 Local、falcon9 与 sim时直接覆盖会把主配置与某一模式强耦合失去切换能力扩展方式则让每种模式拥有一份独立配置。切换只改命令行hydra/launchermy_falcon9、hydra/sweepermy_sim这类覆盖既是选择模式也是选择整套参数配合多份扩展配置即可实现“一套代码、多套插件参数”。跨组扩展用绝对路径 _here_defaults: [- /other_group/base_here_]可以把其他配置组的默认配置合并到当前 package。插件选择必须发生在 sweep 之前由 config_loader_impl.py 保证hydra/launcher与hydra/sweeper必须在主配置或命令行中先行确定不能在任务内部动态修改。留意配置组归属扩展 Launcher 插件的文件应放在hydra/launcher配置组而非hydra/sweeper下填错配置组会导致命令行选项无法被解析。以上方法对所有 Hydra 插件Launcher、Sweeper、Config Source、Search Path、Completion 等通用。更进一步地hydra/launcher、hydra/sweeper等选项的默认行为由 The Defaults List 机制驱动熟悉 defaults list 的override、optional、null等关键字后你还可以对插件选项做更精细的组合编排。【免费下载链接】hydraHydra is a framework for elegantly configuring complex applications项目地址: https://gitcode.com/GitHub_Trending/hyd/hydra创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考