
Hydra 集成 Nevergrad 实现超参数自动搜索Nevergrad Sweeper 插件实战指南【免费下载链接】hydraHydra is a framework for elegantly configuring complex applications项目地址: https://gitcode.com/GitHub_Trending/hyd/hydra本文基于 Hydra 仓库中的 Nevergrad Sweeper 插件系统讲解如何借助 Nevergrad 无导数优化平台在 Hydra 应用中自动搜索与优化实验参数。读完本文你将掌握该插件的安装与启用方式、optim与params两大配置块的完整字段语义、通过命令行覆盖语法与配置文件两种方式定义搜索空间以及如何解读优化过程日志与最终的optimization_results.yaml结果文件。插件是什么Nevergrad 是一个无导数derivative-free优化平台内置了一批用于超参数搜索的高质量算法。Hydra 的 Nevergrad Sweeper 插件hydra-nevergrad-sweeper为 Hydra 应用提供了一套机制让应用可以使用 Nevergrad 的算法来优化实验/应用参数实现自动化的超参数搜索multirun sweep。在仓库中该插件的完整实现位于 plugins/hydra_nevergrad_sweeper核心代码包括config.py结构化配置dataclass定义并注册到 Hydra 的hydra/sweeper配置组nevergrad_sweeper.py对外暴露的NevergradSweeper继承hydra.plugins.sweeper.Sweeper是插件与 Hydra 的接合点_impl.py真正的优化循环实现NevergradSweeperImpl包括搜索空间解析、ask/tell 迭代、失败处理与结果序列化。安装插件作为独立 Python 包发布通过 pip 安装并升级即可pip install hydra-nevergrad-sweeper --upgrade从 setup.py 可以看到该插件的运行依赖为hydra-core1.1.0.dev7与nevergrad1.0.12安装时会被自动拉取。启用插件安装完成后有两种方式启用 Nevergrad Sweeper。方式一命令行指定。在运行 Hydra 应用时追加hydra/sweepernevergradpython your_app.py hydra/sweepernevergrad方式二在配置中覆盖hydra/sweeper。在应用的defaults列表中加入override条目defaults: - override hydra/sweeper: nevergrad插件示例应用 example/config.yaml 正是采用方式二启用的。启用后可随时查看插件的默认配置检查当前生效的优化器与搜索空间# package hydra.sweeper _target_: hydra_plugins.hydra_nevergrad_sweeper.nevergrad_sweeper.NevergradSweeper optim: optimizer: NGOpt budget: 80 num_workers: 10 noisy: false maximize: false seed: null max_failure_rate: 0.0 parametrization: db: - mnist - cifar lr: init: 0.02 step: 2.0 log: true dropout: lower: 0.0 upper: 1.0 batch_size: lower: 4 upper: 16 integer: true需要说明的是上面输出中的parametrization字段是 Hydra 1.2 时代的命名。查看当前仓库源码 config.pyNevergradSweeperConf中该字段已更名为params原来的parametrization被标记为 deprecated自 Hydra 1.4 起预计 1.5 移除见 news/1890.config 与 _impl.py 中的deprecation_warning。新应用中应统一使用hydra.sweeper.params定义搜索空间。优化器与搜索空间配置optim字段详解插件在hydra.sweeper.optim下集中管理优化器行为所有字段的默认值与语义均可在 config.py 的OptimConf中找到字段默认值含义optimizerNGOpt使用的 Nevergrad 优化器名称。示例注释给出几条选型经验OnePlusOne极其简单稳健尤其适合低预算但容易过早收敛CMA质量很高但可能需要显著预算120TwoPointsDE在广泛场景下表现良好适合较大预算120NGOpt会根据你的参数定义自动识别最优优化器会定期更新budget80总共要执行的函数评估job次数num_workers10并行执行评估的 worker 数量noisyfalse评估是否带噪声设置为true时优化器按噪声场景处理maximizefalse是否执行最大化而非最小化seednull优化随机种子用于复现结果max_failure_rate0.0单批参数中允许的最大失败率用于容错Hydra 1.2.0 起引入见 NEWS.md配置示例沿用插件 example/config.yamlhydra: sweeper: optim: # 低预算下表现好的优化器但可能过早收敛 optimizer: OnePlusOne # 总共执行的函数评估次数 budget: 100 # 并行 worker 数量 num_workers: 10 # maximize: true # 取消注释可改为最大化从实现看NevergradSweeper的构造函数直接接收optim: OptimConf参数nevergrad_sweeper.pyoptimizer最终通过ng.optimizers.registryopt实例化_impl.pyseed与noisy则分别作用于parametrization.random_state和parametrization.function.deterministic。完整示例用 Nevergrad 搜索最小化函数的最优参数仓库提供了一个开箱即用的示例应用 example/my_app.py。它用hydra.main()装饰了一个dummy_training(cfg) - float函数函数返回值是我们想要最小化的目标理论最小值是0在如下参数组合处达到db: mnist lr: 0.12 dropout: 0.33 batch_size4该目标函数混合了连续参数lr、dropout、离散整数参数batch_size与类别参数db很适合演示搜索空间的各种定义方式。注意my_app.py中还支持cfg.error开关置true时主动抛出RuntimeError用于验证插件的失败容错逻辑。运行超参数搜索克隆代码后在plugins/hydra_nevergrad_sweeper目录下执行python example/my_app.py -m其中-m即--multirun触发 Sweeper 接管执行。示例配置 example/config.yaml 使用OnePlusOne优化器、budget100、num_workers10并通过params定义搜索空间hydra: sweeper: params: # 二选一的离散类别 db: choice(mnist, cifar) # 对数分布的正标量平均按 2 的因子演进 lr: {init: 0.02, step: 2.0, log: true} # 0 到 1 之间的线性标量 dropout: interval(0, 1) # 4 到 16 的整数标量也可提供 init 和 step # 默认 init 取区间中点、step 取区间六分之一 batch_size: int(interval(4, 16))在命令行覆盖搜索空间除了使用配置文件还可以用 Hydra 的覆盖语法在命令行直接定义/覆盖搜索空间python example/my_app.py --multirun dbmnist,cifar batch_size4,8,16 \ lrtag(log, interval(0.001, 1)) dropoutinterval(0,1)运行日志解读初始化 sweep 与前 5 次评估共 100 次的日志大致如下[2020-10-08 20:13:53,592][HYDRA] NevergradSweeper(optimizerNGOpt, budget100, num_workers10) minimization [2020-10-08 20:13:53,593][HYDRA] with parametrization Dict(batch_sizeChoice(choicesTuple(4,8,16),weightsArray{(1,3)}),dbChoice(choicesTuple(mnist,cifar),weightsArray{(1,2)}),dropoutScalar{Cl(0,1,b)}[sigmaLog{exp2.0}],lrLog{exp3.162277660168379,Cl(0.001,1,b)}):{db: mnist, lr: 0.03162277660168379, dropout: 0.5, batch_size: 8} [2020-10-08 20:13:53,593][HYDRA] Sweep output dir: multirun/2020-10-08/20-13-53 [2020-10-08 20:13:55,023][HYDRA] Launching 10 jobs locally [2020-10-08 20:13:55,023][HYDRA] #0 : dbmnist lr0.03162277660168379 dropout0.5 batch_size16 [2020-10-08 20:13:55,217][__main__][INFO] - dummy_training(dropout0.500, lr0.032, dbmnist, batch_size16) 13.258 [2020-10-08 20:13:55,218][HYDRA] #1 : dbcifar lr0.018178519762066934 dropout0.5061074452336254 batch_size4 [2020-10-08 20:13:55,408][__main__][INFO] - dummy_training(dropout0.506, lr0.018, dbcifar, batch_size4) 0.278 [2020-10-08 20:13:55,409][HYDRA] #2 : dbcifar lr0.10056825918734161 dropout0.6399687427725211 batch_size4 [2020-10-08 20:13:55,595][__main__][INFO] - dummy_training(dropout0.640, lr0.101, dbcifar, batch_size4) 0.329 [2020-10-08 20:13:55,596][HYDRA] #3 : dbmnist lr0.06617542958182834 dropout0.5059497416026679 batch_size8 [2020-10-08 20:13:55,812][__main__][INFO] - dummy_training(dropout0.506, lr0.066, dbmnist, batch_size8) 5.230 [2020-10-08 20:13:55,813][HYDRA] #4 : dbmnist lr0.16717013388679514 dropout0.6519070394318255 batch_size4 ... [2020-10-08 20:14:27,988][HYDRA] Best parameters: dbcifar lr0.11961221693764439 dropout0.37285878409770895 batch_size4可以看到每轮先打印Launching 10 jobs locally随后按#0、#1……依次输出每批 10 个并行 job 的参数组合与目标值最后由Best parameters给出优化器推荐的全局最优参数。sweep 末尾两轮评估大致如下[HYDRA] #8 : dbmnist batch_size4 lr0.094 dropout0.381 [__main__][INFO] - my_app.py(dropout0.381, lr0.094, dbmnist, batch_size4) 1.077 [HYDRA] #9 : dbmnist batch_size4 lr0.094 dropout0.381 [__main__][INFO] - my_app.py(dropout0.381, lr0.094, dbmnist, batch_size4) 1.077 [HYDRA] Best parameters: dbmnist batch_size4 lr0.094 dropout0.381结果文件optimization_results.yamlsweep 结束后会在 sweep 目录下生成optimization_results.yaml记录优化器推荐的参数best_evaluated_result: 0.381 best_evaluated_params: batch_size: 4 db: mnist dropout: 0.381 lr: 0.094 name: nevergrad其中best_evaluated_params是实际评估过的参数中目标值最优的一组best_evaluated_result为对应目标值。该文件由 _impl.py 在优化循环结束后通过OmegaConf.save写入{hydra.sweep.dir}/optimization_results.yaml。测试 test_nevergrad_sweeper_plugin.py 会校验该文件的存在与字段完整性name nevergrad、恰好 3 个键。定义搜索空间参数插件支持两类 Nevergrad 参数Choices离散选择与Scalars标量。二者既可以在命令行通过 Hydra 覆盖语法定义也可以在配置文件中定义。通过命令行覆盖定义Hydra 自带覆盖解析器语法相当丰富建议先阅读 Override 语法基础 与 Override 语法扩展 再继续。Choices离散选择key1,5 keyshuffle(range(1, 8)) keyrange(1,5)如果给覆盖打上ordered标签则生成 Nevergrad 的TransitionChoice带顺序/转移结构的选择keytag(ordered, choice(1,2,3))对应实现中_impl.pychoices 类覆盖被转换为ng.p.Choice带ordered标签时转换为ng.p.TransitionChoicerange与shuffle(range(...))展开后同样是ng.p.Choice。Scalar标量keyinterval(1,12) # 默认是浮点区间 keyint(interval(1,8)) # 将区间边界转为整数标量 keytag(log, interval(1,12)) # 打上 log 标签后调用 ng.p.Log实现上_impl.pyinterval覆盖生成ng.p.Scalar(lowerstart, upperend)带log标签则生成ng.p.Log(...)当区间起点是整数时自动调用set_integer_casting()转为整数标量。此外命令行覆盖也可以是字典形式例如key{init: 0.02, step: 2.0, log: true}此时会走与配置文件相同的标量解析路径。通过配置文件定义Choices配置文件中用列表定义db: - mnist - cifarScalars配置文件中用映射定义支持的字段如下字段是否必填含义init可选初始值lower可选下界upper可选上界log可选设为true表示按对数log分布取值step可选搜索更优参数时的步长线性模式下是加性步长对数模式下是乘性步长integer可选设为true表示整数取值尽可能优先用浮点数而非整数对应的结构化定义见 config.py 的ScalarConfigSpec。默认值规则如果只提供lower和upper边界初始值init会自动取区间中点步长step取区间长度的六分之一若无界step默认退化为1。注意无界标量缺少upper和/或lower的标量只能通过配置文件定义无法用命令行interval覆盖表达——这一点从_impl.py的解析分支可以确认。底层优化循环与容错机制理解插件的底层行为有助于正确配置。从 _impl.py 的sweep()可以看出完整流程合并搜索空间先从配置的params解析出参数与 override 列表再追加命令行传入的覆盖参数统一经OverridesParser解析后构造ng.p.Dict参数化对象准备优化器根据maximize决定方向direction -1为最大化1为最小化按noisy/seed配置参数化对象然后实例化注册表中的优化器ask/tell 迭代在budget预算内每轮ask()取出min(num_workers, remaining_budget)个候选参数转换为 override 后交给 Launcher 并行启动所有 job 返回后统一tell()反馈目标值同时跟踪当前最优失败处理失败的 job非COMPLETED状态回报math.inf并计数若单批失败比例超过max_failure_rate则抛出首个失败 job 的原始异常并终止否则按max_failure_rate容错继续优化输出结果provide_recommendation()得到优化器推荐参数连同实际评估最优值一起序列化为optimization_results.yaml。测试 test_nevergrad_sweeper_plugin.py 对上述机制做了充分验证例如test_create_nevergrad_parameter_from_override逐一断言命令行语法到 Nevergrad 参数类型的映射test_nevergrad_example以budget32跑完整例并断言optimization_results.yaml与全部 job 目录0到budget-1存在test_failure_rate验证errortrue场景下失败率的两种行为max_failure_rate1.0时抛异常、1.0时容错继续。常见配置演进与迁移提示params取代parametrization如前面所述hydra.sweeper.parametrization已废弃请改用hydra.sweeper.params。二者不可同时配置——源码中若同时设置会直接抛出ValueError_impl.py测试test_params_and_parametrization_are_mutually_exclusive覆盖。旧式parametrization下 Choices 用列表、Scalars 用{lower, upper, init, step, log, integer}字典新式params则同时支持这些字典语法与更简洁的字符串语法如choice(...)、interval(...)、int(interval(...))、tag(log, ...)。关于配置插件的通用方法Hydra 插件的配置方式有多种标准模式命令行覆盖、配置文件覆盖等详见插件配置指南。复现与稳定性正式实验建议显式设置hydra.sweeper.optim.seed并合理设置num_workers不超过预算budget避免测试与线上结果抖动。【免费下载链接】hydraHydra is a framework for elegantly configuring complex applications项目地址: https://gitcode.com/GitHub_Trending/hyd/hydra创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考