在 Ray Tune 中使用 BayesOptSearch 进行贝叶斯超参数优化 📅 发布时间:2026/9/20 8:37:43 👁 浏览次数: 在 Ray Tune 中使用 BayesOptSearch 进行贝叶斯超参数优化【免费下载链接】rayRay is an AI compute engine. Ray consists of a core distributed runtime and a set of AI Libraries for accelerating ML workloads.项目地址: https://gitcode.com/gh_mirrors/ra/ray导读本文围绕 Ray Tune 官方示例 bayesopt_example.py对应文档 bayesopt_example.rst 与配套 Notebook bayesopt_example.ipynb完整讲解如何将bayesian-optimization库的高斯过程贝叶斯优化集成到 Ray Tune 中用BayesOptSearch搜索算法自动寻找最优超参数。读完本文你将掌握环境安装与版本约束、目标函数与搜索空间的组织方式、BayesOptSearch全部核心参数utility 函数、并发限制、随机初始化步数、收敛提前终止等的语义与默认值以及与AsyncHyperBandScheduler调度器组合使用的完整可运行代码并能对照 搜索算法源码 理解底层实现原理。BayesOpt 与 Ray Tune 的集成方式什么是 BayesOptSearchBayesOptSearch是 Ray Tune 为bayesian-optimization库pip 包名bayesian-optimization类名为bayes_opt.BayesianOptimization封装的搜索算法Searcher代码位于 python/ray/tune/search/bayesopt/bayesopt_search.py。从原理上讲BayesianOptimization是一个基于高斯过程Gaussian Process的受限全局优化工具核心目标是用尽可能少的迭代次数逼近未知函数的最大值Ray Tune 内部通过_metric_op符号翻转支持最小化目标见源码第 205-208 行。它属于无导数derivative-free与黑盒black-box优化范畴特别适合目标函数评估代价高昂、需要权衡探索exploration与利用exploitation的场景。Ray Tune 的定位是优化任意显式或隐式目标函数——超参数调优只是最常见的应用。BayesOptSearch在 Tune 中扮演搜索算法Search Algorithm角色负责根据历史 trial 的结果建议下一组超参数配置它通常与调度器Scheduler如提前停止低效 trial 的AsyncHyperBandScheduler协同工作。在 doc/source/tune/key-concepts.rst 的搜索算法总览表中BayesOptSearch被归类为Bayesian Optimization类集成官方推荐示例即本文所讲的 bayesopt_example。安装与版本约束示例源码 docstring 与BayesOptSearch.__init__中的断言均明确要求先安装 BayesOpt 库pip install bayesian-optimization1.4.3需要说明的是仓库内不同文档记录的版本号并不完全一致bayesopt_search.py 与构造函数断言中推荐bayesian-optimization1.4.3配套 Notebook bayesopt_example.ipynb 中安装命令为!pip install -q bayesian-optimization1.2.0 ray[tune]该 Notebook 生成于 2022 年属于历史运行环境。实际使用时建议以当前仓库源码标注的1.4.3为准同时通过pip install ray[tune]安装 Ray Tune。若未安装 BayesOpt构造BayesOptSearch会直接抛出断言错误源码第 168-171 行提示安装命令。完整示例最小化一个简单目标函数以下代码来自 python/ray/tune/examples/bayesopt_example.py是官方文档通过literalinclude直接嵌入到 RST 中的正文见 bayesopt_example.rst它同时验证了BayesOptSearch可以与其他调度器此处为AsyncHyperBandScheduler组合使用This example demonstrates the usage of BayesOpt with Ray Tune. It also checks that it is usable with a separate scheduler. Requires the BayesOpt library to be installed (pip install bayesian-optimization). import time from ray import tune from ray.tune.schedulers import AsyncHyperBandScheduler from ray.tune.search import ConcurrencyLimiter from ray.tune.search.bayesopt import BayesOptSearch def evaluation_fn(step, width, height): return (0.1 width * step / 100) ** (-1) height * 0.1 def easy_objective(config): # Hyperparameters width, height config[width], config[height] for step in range(config[steps]): # Iterative training function - can be any arbitrary training procedure intermediate_score evaluation_fn(step, width, height) # Feed the score back back to Tune. tune.report({iterations: step, mean_loss: intermediate_score}) time.sleep(0.1) if __name__ __main__: import argparse parser argparse.ArgumentParser() parser.add_argument( --smoke-test, actionstore_true, helpFinish quickly for testing ) args, _ parser.parse_known_args() algo BayesOptSearch(utility_kwargs{kind: ucb, kappa: 2.5, xi: 0.0}) algo ConcurrencyLimiter(algo, max_concurrent4) scheduler AsyncHyperBandScheduler() tuner tune.Tuner( easy_objective, tune_configtune.TuneConfig( metricmean_loss, modemin, search_algalgo, schedulerscheduler, num_samples10 if args.smoke_test else 1000, ), run_configtune.RunConfig(namemy_exp), param_space{ steps: 100, width: tune.uniform(0, 20), height: tune.uniform(-100, 100), }, ) results tuner.fit() print(Best hyperparameters found were: , results.get_best_result().config)运行方式python python/ray/tune/examples/bayesopt_example.py # 完整运行 1000 次采样 python python/ray/tune/examples/bayesopt_example.py --smoke-test # 快速验证仅 10 次采样代码结构拆解示例由三部分构成每一部分都对应 Tune 的一个核心概念目标函数Trainableeasy_objective(config)接收 Tune 传入的配置字典在一个模拟训练循环中逐step计算evaluation_fn(step, width, height)的中间得分并通过tune.report(...)将iterations与mean_loss实时回报给 Tune。time.sleep(0.1)用于模拟真实训练中每步的耗时使贝叶斯优化在高代价目标上的价值更直观。注释也明确说明这里可以是任意训练过程如 PyTorch / TensorFlow 训练循环。搜索空间Search Spaceparam_space中steps是固定参数每次采样都是 100width与height是连续超参数分别采样自tune.uniform(0, 20)和tune.uniform(-100, 100)。关键假设是最优超参数位于该空间之内空间越大在有限时间内找到它们就越难。搜索算法 调度器BayesOptSearch负责建议下一组配置ConcurrencyLimiter(algo, max_concurrent4)将同时运行的 trial 数限制为 4AsyncHyperBandScheduler负责提前停止表现不佳的 trial。三者通过tune.TuneConfig(search_alg..., scheduler...)注入Tuner。运行结果解读示例以mean_loss为指标、modemin为目标方向运行num_samples次采样。Notebook 中记录了一次 10 trial 的实际运行输出见 bayesopt_example.ipynb最优 trialmean_loss-9.536507956046009对应参数width19.398197043239886、height-95.88310114083951日志目录~/ray_results/objective_2022-07-22_15-30-08每个 trial 均完整执行了 100 步迭代。结果表中neg_mean_loss列即-mean_loss这是因为 Tune 在最大化框架下跟踪最小化目标。trial 名称前缀objective_来自目标函数名RunConfig(namemy_exp)则用于自定义实验目录名。BayesOptSearch 核心参数详解对照 bayesopt_search.py 的类 docstring 与构造函数第 153-235 行BayesOptSearch的完整参数语义如下参数默认值含义与说明spaceNone连续搜索空间。若以 Tune 搜索空间如tune.uniform传入Tuner(param_space...)会被convert_search_space自动转换也可直接传入BayesianOptimization原生格式{width: (0, 20), height: (-100, 100)}metricNone目标指标名。缺省时若指定了mode则使用匿名指标_metricmodeNonemin或max决定目标是最小化还是最大化构造函数强制校验见第 172-173 行points_to_evaluateNone优先评估的初始参数建议dict 列表用于把已知较优的配置先跑一遍帮助 GP 更快给出后续建议utility_kwargs{kind: ucb, kappa: 2.576, xi: 0.0}效用函数参数与bayesian-optimization包默认值一致见第 196-203 行random_state42BayesOpt 的随机种子random_search_steps10初始随机搜索的 trial 数用于避免贝叶斯过程初始阶段在局部过拟合verbose0BayesOpt 包的日志详细程度patience5同一配置被重复建议的次数上限。GP 收敛后可能反复建议同一点超过patience后suggest返回Searcher.FINISHED实验提前结束可能少于num_samples。设patience1则配置首次重复即停止skip_duplicateTrue是否跳过已评估过的配置。False时允许重复建议适用于噪声目标或希望坚持跑到num_samplesanalysisNone可选的ExperimentAnalysis用于把历史实验结果注册进高斯过程实现 warm-startrepeat_float_precision5检测重复配置时对浮点数做哈希的小数精度。值越大查重越严格被判为重复的配置越少第 100-103 行示例中的utility_kwargs{kind: ucb, kappa: 2.5, xi: 0.0}显式选择了 UCBUpper Confidence Bound上置信界效用函数并微调kappa2.5默认 2.576。kappa控制探索强度xi用于 EIExpected Improvement类效用函数中的改善期望阈值。两种搜索空间传参方式BayesOptSearch同时支持自动转换与手动传参两种方式源码 docstring 第 105-146 行方式一Tune 搜索空间自动转换推荐与示例一致from ray import tune from ray.tune.search.bayesopt import BayesOptSearch config { width: tune.uniform(0, 20), height: tune.uniform(-100, 100), } bayesopt BayesOptSearch(metricmean_loss, modemin) tuner tune.Tuner( my_func, tune_configtune.TuneConfig(search_algbayesopt), param_spaceconfig, ) tuner.fit()方式二手动传入 BayesOpt 原生边界格式此时搜索空间经space参数传入Tuner不再传param_spacespace { width: (0, 20), height: (-100, 100), } bayesopt BayesOptSearch(space, metricmean_loss, modemin) tuner tune.Tuner( my_func, tune_configtune.TuneConfig(search_algbayesopt), ) tuner.fit()底层实现原理从源码看 BayesOptSearch 的工作流程阅读 bayesopt_search.py 的完整实现可以梳理出 Tune 与 BayesOpt 交互的完整闭环1. 初始化与搜索空间转换__init__/set_search_properties构造函数对mode做合法性校验仅允许min/max并通过_metric_op最小化取 -1.0最大化取 1.0把最小化问题翻转为底层库的最大化框架第 205-208 行内部用byo.UtilityFunction(**utility_kwargs)构建效用函数第 217 行若直接传入含tune.uniform等 Domain 对象的space会先parse_spec_vars解析检测到未解析搜索空间时给出警告并调用convert_search_space第 221-228 行若搜索空间在构造时尚未就绪例如由Tuner(param_space...)注入则推迟到set_search_properties中通过convert_search_space(config)完成转换并调用_setup_optimizer第 253-271 行最终构造byo.BayesianOptimization(fNone, pbounds..., verbose..., random_state...)第 242-247 行。convert_search_space静态方法第 448-493 行对搜索空间的约束很关键只支持连续Float域其他类型参数如整型、类别型会抛出ValueError第 481-484 行不支持网格搜索检测到grid_vars直接抛错第 452-456 行不支持量化Quantized采样器会被丢弃并警告第 464-469 行不支持自定义采样方法非Uniform采样器会被丢弃并警告第 471-478 行嵌套字典参数会以/连接路径作为参数名第 487 行。2. 建议下一个配置suggest每次需要新 trial 时Tune 调用suggest(trial_id)第 273-356 行若设置了points_to_evaluate先依次弹出这些初始点第 298-300 行否则调用self.optimizer.suggest(self.utility)让高斯过程给出下一个采样点第 302 行对配置做哈希查重_dict_hash第 31-38 行按repeat_float_precision精度格式化浮点数后 JSON 序列化同一配置重复建议次数超过patience时记录收敛警告并返回Searcher.FINISHED实验提前终止第 312-323 行已见过且skip_duplicateTrue时跳过该配置返回None第 325-338 行前random_search_steps个 trial 属于随机初始化阶段第 340-350 行。3. 结果反馈与高斯过程更新on_trial_complete/_register_resulttrial 结束后Tune 回调on_trial_complete第 373-410 行结果或参数缺失、出错时直接忽略第 394-395 行随机初始化阶段的 trial 结果先缓存到_buffered_trial_results攒够random_search_steps个后一次性注册给优化器第 398-410 行这是为了避免初始阶段 GP 过拟合_register_result会自动过滤 NaN、inf、-inf 结果is_nan_or_inf判断第 414-416 行再以_metric_op * result[self.metric]的符号将最小化目标注册进optimizer.register(...)第 416 行。4. 检查点与热启动save/restore/register_analysissave/restore用 pickle 序列化/反序列化整个 searcher 状态第 425-446 行用于实验容错恢复register_analysis(analysis)第 358-371 行可把上一次实验的ExperimentAnalysis结果注册进高斯过程实现 warm-start与analysis参数配合使用。组合调度器与 AsyncHyperBandScheduler 协同示例特意checks that it is usable with a separate scheduler——即验证BayesOptSearch可以与独立调度器组合。Tune 中搜索算法与调度器职责正交搜索算法决定下一个 trial 试什么超参数调度器决定正在跑的 trial 何时可以提前终止/暂停/分配更多资源。示例选用AsyncHyperBandScheduler它属于 HyperBand 的异步变体会在训练过程中持续淘汰表现不佳的 trial从而节省算力。二者组合后BayesOpt 负责智能探索参数空间调度器负责及时止损这在真实的高代价训练任务如大模型调参中收益尤其明显。相关的基础用法另见 async_hyperband_example.py。并发控制ConcurrencyLimiter 的作用BayesOptSearch本身是顺序建议下一个配置的当集群算力充足、希望并行跑多个 trial 时需要用 python/ray/tune/search/concurrency_limiter.py 中的ConcurrencyLimiter包装algo BayesOptSearch(utility_kwargs{kind: ucb, kappa: 2.5, xi: 0.0}) algo ConcurrencyLimiter(algo, max_concurrent4)max_concurrent4将同时运行的 trial 上限设为 4在任意时刻最多只有 4 个 trial 在跑已完成的 trial 结果会及时回填高斯过程用于更新后续建议。这样既充分利用并行资源又保证贝叶斯模型的采样建议始终基于最新观测。测试验证与常见问题排查仓库在 python/ray/tune/tests/test_searchers.py 中覆盖了BayesOptSearch的多种边界行为参数校验repeat_float_precision必须为非负整数传-1、字符串、浮点数或布尔值都会抛错第 827-839 行收敛检测专门测试了GP 收敛后应发出警告而非静默停止的行为——同一配置被反复建议且skip_duplicateTrue时实验会在提示后正常结束第 844-867 行。据此实际使用中可重点关注以下问题报错BayesOpt must be installed!bayesian-optimization未安装或版本不兼容按pip install bayesian-optimization1.4.3安装即可报错BayesOpt does not support parameters of type ...搜索空间里出现了非连续浮点类型参数。BayesOptSearch只接受连续域整型参数可改用其他搜索算法如 Optuna、HyperOpt或自行把整型表达为连续值后取整报错 grid search 不支持param_space中混入了tune.grid_search(...)需移除或改用连续分布运行很快结束、trial 数少于num_samples属于正常收敛行为——GP 反复建议同一最优区域触发patience提前终止。可通过增大patience、设置skip_duplicateFalse或扩大搜索空间继续探索源码第 314-321 行日志中有明确提示结果含 NaN 被静默忽略_register_result会自动丢弃 NaN/inf 观测若大量出现会拖慢收敛应检查目标函数。延伸阅读官方 API 文档doc/source/tune/api/suggestion.rst 中bayesopt锚点对应的BayesOptSearchautosummary 条目概念导读doc/source/tune/key-concepts.rst 中搜索算法章节含 BayesOpt 与其他搜索算法的横向对比表搜索算法入口python/ray/tune/search/bayesopt/init.py并发限制实现python/ray/tune/search/concurrency_limiter.py测试用例python/ray/tune/tests/test_searchers.py同类集成示例HyperOpthyperopt_example.py、Optunaoptuna_example.py、BOHBbohb_example.py以及示例索引页 doc/source/tune/examples/index.rst。【免费下载链接】rayRay is an AI compute engine. Ray consists of a core distributed runtime and a set of AI Libraries for accelerating ML workloads.项目地址: https://gitcode.com/gh_mirrors/ra/ray创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考