ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Hydra Optuna Sweeper 插件实战:用 Optuna 为 Hydra 应用做参数优化

Hydra Optuna Sweeper 插件实战:用 Optuna 为 Hydra 应用做参数优化 Hydra Optuna Sweeper 插件实战用 Optuna 为 Hydra 应用做参数优化【免费下载链接】hydraHydra is a framework for elegantly configuring complex applications项目地址: https://gitcode.com/GitHub_Trending/hyd/hydra本文围绕 Hydra 仓库自带的hydra-optuna-sweeper插件展开系统讲解如何在 Hydra 多任务multirun模式下接入 Optuna 进行实验参数优化。你将学会插件的安装与启用、默认配置结构、单目标与多目标优化的完整实操流程、命令行与配置文件两种搜索空间定义方式以及实验性的自定义搜索空间custom search spaceAPI。文中所有示例均来自仓库真实代码可直接复制运行。插件概述hydra-optuna-sweeper是 Hydra 官方维护的 sweeper 插件它让 Hydra 应用能够利用 Optuna 的贝叶斯优化、随机搜索、CMA-ES、遗传算法NSGA-II等采样算法自动搜索最优实验参数。它的核心工作方式是由 Optuna 定义一个study每轮向 Hydra 启动器提交一组参数组合对应一个 multirun job用任务函数的返回值作为优化目标并持续迭代直到完成n_trials次评估。插件源码位于 plugins/hydra_optuna_sweeper核心实现为 optuna_sweeper.py对外入口与 _impl.py调度逻辑默认配置定义在 config.py。安装与启用该插件要求hydra-core1.1.0。先升级 Hydra 核心再安装插件pip install hydra-core --upgrade pip install hydra-optuna-sweeper --upgrade关于插件的几种标准配置方式可参考 配置插件的方法。启用方式有两种任选其一在配置文件YAML的defaults中覆盖 sweeperdefaults: - override hydra/sweeper: optuna在命令行追加hydra/sweeperoptuna。启用后插件的默认配置会注册到 Hydra 的配置存储中见 config.py 末尾的ConfigStore.instance().store(grouphydra/sweeper, nameoptuna, ...)你可以随时通过--cfg hydra -p hydra.sweeper查看解析后的完整 sweeper 配置。默认配置项详解下面以示例应用sphere.py为例运行以下命令可以查看完整的 Optuna sweeper 参数# package hydra.sweeper sampler: _target_: optuna.samplers.TPESampler seed: 123 n_startup_trials: 10 n_ei_candidates: 24 multivariate: false _target_: hydra_plugins.hydra_optuna_sweeper.optuna_sweeper.OptunaSweeper direction: minimize storage: null study_name: sphere n_trials: 20 n_jobs: 1 max_failure_rate: 0.0 params: x: range(-5.5,5.5,step0.5) y: choice(-5,0,5)对照源码 config.py 中的OptunaSweeperConf各字段含义如下配置项类型默认值说明_target_strOptunaSweeper类全路径实例化 sweeper 的 target一般不要修改samplerdataclassTPESampler采样算法可通过hydra/sweeper/sampler组切换directionstr 或 listminimize优化方向单目标填minimize/maximize多目标填二者构成的列表storageOptionalnullOptuna 持久化存储 URL如sqlite:///example.db为null时不持久化study_nameOptionalnull研究study名称用于在 storage 中定位或复用研究n_trialsint20总评估次数函数调用次数n_jobsint2并行 worker 数源码默认2示例配置中覆盖为1max_failure_ratefloat0.0单批实验中允许的最大失败比例0.0~1.0超过则抛出异常paramsDictnull配置文件形式定义的搜索空间custom_search_spaceOptionalnull实验性功能指向自定义搜索空间配置函数见后文其中n_jobs控制每批同时提交多少个任务_impl.py中batch_size self.n_jobs每轮调用study.ask()生成batch_size个 trial 后一次性交给 Hydra launcher 批量启动。max_failure_rate在_impl.py中被断言0.0 max_failure_rate 1.0当某批失败率超过阈值时会抛出异常通过 JobReturn 透传真实 traceback。示例一单目标优化仓库提供了完整示例 example/sphere.py其目标函数为x² y²hydra.main(config_pathconf, config_nameconfig) def sphere(cfg: DictConfig) - float: x: float cfg.x y: float cfg.y if cfg.get(error, False): raise RuntimeError(cfg.error is True) return x**2 y**2注意两点被hydra.main()装饰的函数必须返回一个 float或可被float()转换的值该返回值就是 Optuna 的优化目标配置里还内置了一个error开关见 conf/config.yaml置为true时可模拟任务失败用于验证max_failure_rate的行为。该函数的最小值为 0取到最优时x: 0 y: 0在plugins/hydra_optuna_sweeper目录下运行优化python example/sphere.py --multirun多目标/单目标优化完成后multirun日志目录下会生成optimization_results.yaml内容即最佳参数与最佳值name: optuna best_params: x: 0.0 y: 0 best_value: 0.0这一写入逻辑对应 _impl.py 中sweep()的收尾阶段单目标时序列化best_params/best_value多目标时序列化帕累托解集并通过OmegaConf.save(..., f{self.config.hydra.sweep.dir}/optimization_results.yaml)落盘。你还可以在命令行直接覆盖搜索空间的参数化方式例如改用连续区间python example/sphere.py --multirun xinterval(-5.0, 5.0) yinterval(0, 10)Sampler采样器配置插件完整支持 Optuna 的 samplers切换方式有两种覆盖hydra/sweeper/sampler组或直接改hydra.sweeper.sampler下的设置。从 config.py 可以看到插件通过ConfigStore注册了以下 sampler 配置组group 均为hydra/sweeper/sampler配置组名对应采样器关键参数默认值tpe默认optuna.samplers.TPESamplerseedNonen_startup_trials10n_ei_candidates24multivariateFalse等randomoptuna.samplers.RandomSamplerseedNonecmaesoptuna.samplers.CmaEsSamplersigma0、restart_strategy、use_separable_cmaFalse等nsgaiioptuna.samplers.NSGAIISamplerpopulation_size50、crossover_prob0.9、swapping_prob0.5等gridoptuna.samplers.GridSampler搜索空间由hydra.sweeper.params在运行时自动生成gpoptuna.samplers.GPSamplern_startup_trials10等qmcoptuna.samplers.QMCSamplerqmc_typesobol、scrambleFalse等motpe已移除指向raise_motpe_removed会报错提示改用tpeOptuna 4.0 起 TPESampler 已支持多目标切换示例在配置文件中defaults: - override hydra/sweeper/sampler: cmaessampler 在 optuna_sweeper.py 中通过hydra.utils.instantiate实例化并带_target_whitelist_白名单仅允许hydra_plugins.hydra_optuna_sweeper.*与optuna.samplers.*。搜索空间配置插件支持 Optuna 的 distributions 来定义搜索空间既可以通过命令行 override 定义也可以通过配置文件定义。参数解析与 distribution 转换的核心逻辑在 _impl.py 的create_optuna_distribution_from_override()中。通过命令行 override 配置Hydra 的 override 解析器支持丰富的语法可参考 OverrideGrammer/Basic 与 OverrideGrammer/Extended。三种核心写法如下。Interval override连续区间默认情况下interval被转换为FloatDistribution通过int(...)强制转换为整数区间时则使用IntDistribution。如果给区间加上logtag会构造 log 分布的 distribution。python example/sphere.py --multirun xint(interval(-5.0, 5.0)) ytag(log, interval(1, 10))运行输出大致如下[HYDRA] Study name: sphere [HYDRA] Storage: None [HYDRA] Sampler: TPESampler [HYDRA] Directions: [minimize] [HYDRA] Launching 1 jobs locally [HYDRA] #0 : x-3 y1.6859762540733367 [HYDRA] Launching 1 jobs locally [HYDRA] #1 : x1 y5.237816870668193 ... [HYDRA] Best parameters: {x: 0, y: 1.0929184723430116} [HYDRA] Best value: 1.1944707871885822对照源码可以看到转换规则interval下若首尾都是 int 且无logtag 则为IntDistribution否则为FloatDistribution带logtag 时则分别对应IntDistribution(..., logTrue)/FloatDistribution(..., logTrue)。Range override离散步进区间range默认转换为IntDistribution对range应用shuffle后会改为使用CategoricalDistribution把枚举到的每个值作为类别如果start、stop、step中有任何一个为 float则转换为FloatDistribution。python example/sphere.py --multirun xrange(-5.0, 5.0) yshuffle(range(-5, 5))[HYDRA] Study name: sphere [HYDRA] Storage: None [HYDRA] Sampler: TPESampler [HYDRA] Directions: [minimize] [HYDRA] Launching 1 jobs locally [HYDRA] #0 : x-3 y-4 [HYDRA] Launching 1 jobs locally [HYDRA] #1 : x1 y-1 ... [HYDRA] Best parameters: {x: 0, y: -1} [HYDRA] Best value: 1.0Choice override离散类别choice直接转换为CategoricalDistribution其中的值必须是 str、int、float、bool 或 None 类型源码中有显式断言。python example/sphere.py --multirun xchoice(-5.0, 0.0, 5.0) ychoice(0, 1, 2, 3, 4, 5)[HYDRA] Study name: sphere [HYDRA] Storage: None [HYDRA] Sampler: TPESampler [HYDRA] Directions: [minimize] [HYDRA] Launching 1 jobs locally [HYDRA] #0 : x5.0 y5 [HYDRA] Launching 1 jobs locally [HYDRA] #1 : x5.0 y2 ... [HYDRA] Best parameters: {x: 0.0, y: 0} [HYDRA] Best value: 0.0通过配置文件配置配置文件中的语法与命令行 override 完全一致。例如命令行写xrange(1,4)在配置文件中则放在hydra.sweeper.params节点下写作hydra: sweeper: params: x: range(1,4)运行时_impl.py 会先把params节点展平成 override 字符串_parse_sweeper_params_config()再与命令行参数合并统一走OverridesParser解析成 distribution因此两种定义方式可以混用且行为一致。示例二多目标优化仓库中的 example/multi-objective.py 实现了 Binh and Korn 基准函数同时最小化两个目标hydra.main(config_pathmulti-objective-conf, config_nameconfig) def binh_and_korn(cfg: DictConfig) - Tuple[float, float]: x: float cfg.x y: float cfg.y v0 4 * x**2 4 * y**2 v1 (x - 5) ** 2 (y - 5) ** 2 return v0, v1多目标模式下被装饰函数需要返回一个长度与direction列表一致的元组或列表源码中会校验len(values) len(directions)。查看该示例的 sweeper 配置python example/multi-objective.py hydra/sweeperoptuna --cfg hydra -p hydra.sweeper# package hydra.sweeper sampler: _target_: optuna.samplers.NSGAIISampler seed: 123 population_size: 50 mutation_prob: null crossover_prob: 0.9 swapping_prob: 0.5 constraints_func: null _target_: hydra_plugins.hydra_optuna_sweeper.optuna_sweeper.OptunaSweeper direction: - minimize - minimize storage: null study_name: multi-objective n_trials: 20 n_jobs: 1 params: x: range(0, 5, step0.5) y: range(0, 3, step0.5)可见多目标的关键差异是direction变为列表[minimize, minimize]采样器换成遗传算法NSGAIISampler完整配置见 multi-objective-conf/config.yaml。运行方式相同python example/multi-objective.py --multirun对于存在目标间权衡trade-off的问题往往没有同时最小化所有目标的单一解而是得到一组帕累托最优解Pareto optimal solutions。下图展示了优化结果中的帕累托前沿蓝色圆点源码层面多目标的结果序列化与单目标不同_impl.py中当len(directions) 2时取study.best_trials构造solutions列表每个元素含params与values写入optimization_results.yaml并在日志中打印帕累托解的个数与具体取值。EXPERIMENTAL自定义搜索空间优化除了声明式搜索空间Optuna Sweeper 还允许用户提供一个自定义搜索空间钩子直接操作optuna.trial.Trial对象来建议参数——这对应 Optuna 的 pythonic search spaces 用法。使用步骤定义一个 Python 函数签名为Callable[[DictConfig, optuna.trial.Trial], None]在配置中将hydra.sweeper.custom_search_space设为该函数的 dotpath通过get_method解析见 _impl.py。完整示例见 example/custom-search-space-objective.py 及其配置 custom-search-space/config.yaml。示例中部分搜索空间在配置文件里定义、部分写在 Python 中defaults: - override hydra/sweeper: optuna hydra: sweeper: sampler: seed: 123 direction: minimize study_name: custom-search-space storage: null n_trials: 20 n_jobs: 1 params: x: range(-5.5, 5.5, 0.5) y: choice(-5, 0, 5) # custom_search_space should be a dotpath pointing to a # callable that provides search-space configuration logic: custom_search_space: custom-search-space-objective.configure x: 1 y: 1 z: 100 max_z_difference_from_x: 0.5# example/custom-search-space-objective.py def configure(cfg: DictConfig, trial: Trial) - None: x_value trial.params[x] trial.suggest_float( z, x_value - cfg.max_z_difference_from_x, x_value cfg.max_z_difference_from_x, ) trial.suggest_float(w, 0.0, 1.0) # note w here, not w as w is a new parameter该示例把z的取值范围动态绑定到x的取值限制|z - x| max_z_difference_from_x并新增参数w。custom_search_space指向的函数必须能同时接收已经设好部分选项的DictConfig以及待进一步配置的Trial对象。注意custom_search_spaceAPI 目前仍标记为实验性EXPERIMENTAL后续版本可能发生变更使用时需关注升级说明。Trial 配置顺序_configure_trials()中一个 trial 的配置按以下顺序进行先设置hydra.sweeper.params中的搜索空间参数再应用命令行 override最后调用custom_search_space钩子补充参数。同时有一条硬性约束不允许在custom_search_space中为已被命令行 override 固定了值的参数重新设置搜索空间。可以通过 Trial.user_attrs 检查哪些参数已被固定。底层实现中固定参数与搜索空间参数一旦重叠会直接抛出ValueError(Overlapping fixed parameters and search space parameters found!)。小结与进一步阅读hydra-optuna-sweeper以极低的接入成本为 Hydra 应用补齐了自动超参优化的能力只需在defaults中覆盖hydra/sweeper: optuna让被装饰函数返回目标值即可在--multirun下获得贝叶斯优化、多目标进化、网格搜索等多种搜索能力并自动产出optimization_results.yaml供后续分析。如需继续深入可以阅读插件源码与配置optuna_sweeper.py、_impl.py、config.py插件测试test_optuna_sweeper_plugin.py覆盖了单目标、多目标、GridSampler、max_failure_rate 等场景插件发布说明NEWS.md、README.mdHydra 配置插件的通用模式配置插件的方法Hydra override 语法Basic 与 Extended【免费下载链接】hydraHydra is a framework for elegantly configuring complex applications项目地址: https://gitcode.com/GitHub_Trending/hyd/hydra创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表