☰
H2O AutoML 参数详解:max_runtime_secs_per_model 单模型训练时间预算控制
2026/10/15 16:41:01 网站建设 项目流程
  • 机器学习
  • 深度学习
  • AutoML
  • 大数据
  • 后端

【免费下载链接】h2o-3

H2O is an Open Source, Distributed, Fast & Scalable Machine Learning Platform: Deep Learning, Gradient Boosting (GBM) & XGBoost, Random Forest, Generalized Linear Modeling (GLM with Elastic Net), K-Means, PCA, Generalized Additive Models (GAM), RuleFit, Support Vector Machine (SVM), Stacked Ensembles, Automatic Machine Learning (AutoML), etc.

项目地址:https://gitcode.com/gh_mirrors/h2/h2o-3
点击查看免费下载

导读

max_runtime_secs_per_model是 H2O AutoML 提供的单模型级时间预算参数,用于限制 AutoML 运行中分配给每一个个体模型训练的最长秒数。当 AutoML 的总运行时间预算(max_runtime_secs)与单模型预算(max_runtime_secs_per_model)同时生效时,AutoML 引擎会优先保证单个模型不占用过多时间,从而让训练过程覆盖更多候选算法与超参数组合。本文基于 H2O-3 官方文档与仓库源码,完整说明该参数的语义、默认值、与max_runtime_secs/max_models的配合方式、底层实现原理,并给出 R 与 Python 双语言的可运行示例。

参数总览

  • 适用对象:AutoML
  • 是否超参数(Hyperparameter):否(该参数属于 AutoML 构建控制层的停止条件,而非某个具体算法的模型参数)
  • 默认值:0,表示禁用(不对单个模型设置时间上限)
  • 可用语言:R(h2o.automl)、Python(H2OAutoML)、以及底层 REST API / Java(AutoMLBuildSpec)

功能说明

使用此选项可以指定在 AutoML 运行过程中,专门用于训练每个个体模型的最大秒数。

关键语义要点如下:

  1. 作用于个体模型而非整个 AutoML 过程:max_runtime_secs_per_model只约束"一个模型"的训练时长,而max_runtime_secs约束整个 AutoML 运行的总时长。
  2. 默认禁用:该选项默认值为0,即不限制单个模型的训练时间。
  3. 可复现性警告:受时间预算约束的模型不保证可复现("models constrained by a time budget are not guaranteed reproducible")。这一点与max_runtime_secs的警告一致——时间预算属于资源受限条件,若两次运行的集群资源或数据加载耗时不同,模型在时间截断点之前能完成的迭代轮数就可能不同。从 R 包文档(h2o-r/h2o-package/R/automl.R)中同样可以看到对应的注释:"Note that models constrained by a time budget are not guaranteed reproducible.",并且建议:"Always setmax_modelsto ensure AutoML reproducibility: all models are then trained until convergence and none is constrained by a time budget."——即追求可复现性时,应优先固定max_models并让模型训练至收敛,而不是依赖时间截断。

与相关参数的配合关系

该参数在官方文档中与以下两个参数互为关联:

  • max_runtime_secs:AutoML 整体运行的最大秒数。它是 AutoML 的两个主要停止条件之一,详细说明见 h2o-docs/src/product/data-science/algo-params/max_runtime_secs.rst。当max_runtime_secs与max_models都未指定时,max_runtime_secs会动态默认为 3600 秒(1 小时)。
  • max_models:AutoML 过程中构建的最大模型数量(不包含 Stacked Ensembles),详细说明见 h2o-docs/src/product/data-science/algo-params/max_models.rst。

在实际使用中,三者可以组合出不同的停止策略:

参数组合停止行为
仅设置max_runtime_secs_per_model单个模型按此秒数截断;AutoML 仍按其他条件(如默认的 1 小时总时长)运行
max_runtime_secs+max_runtime_secs_per_model总时长与单模型时长双重约束,先触达任一条件即触发对应截断
max_models+max_runtime_secs_per_model模型数量上限 + 每个模型的时间上限,适合在固定数量模型下限制每个模型的训练成本
三者同时设置最严格的控制:总时长、模型数、单模型时长全部受限

注意max_runtime_secs_per_model与max_runtime_secs的侧重点不同:前者解决"单个模型训练时间过长、挤占其他模型训练机会"的问题,后者解决"AutoML 整体运行时间失控"的问题。

底层实现原理(源码级解析)

1. 默认值与参数存储

在 Java 后端中,该参数定义在 AutoML 构建规格(build spec)的停止条件对象里。查看 h2o-automl/src/main/java/ai/h2o/automl/AutoMLBuildSpec.java:

  • AutoMLStoppingCriteria持有一个_max_runtime_secs_per_model字段,初始默认值为0;
  • 构造器中对三个时间/数量类停止条件统一初始化:set_max_models(0)(无限制)、set_max_runtime_secs(0)(无限制)、set_max_runtime_secs_per_model(0)(无限制),这与文档中"默认 0(禁用)"的描述完全一致。

该字段还通过AutoMLBuildSpecV99暴露为 REST 请求的一部分(见 h2o-automl/src/main/java/water/automl/api/schemas3/AutoMLBuildSpecV99.java),因此客户端(Python/R)传入的参数最终会落回服务端的停止条件对象。

2. 单模型时间约束的注入逻辑

max_runtime_secs_per_model真正发挥作用的位置在ModelingStep(建模步骤)中。查看 h2o-automl/src/main/java/ai/h2o/automl/ModelingStep.java,initTimeConstraints方法实现了核心的约束注入:

protected void initTimeConstraints(Model.Parameters parms, double upperLimit) { AutoMLBuildSpec buildSpec = aml().getBuildSpec(); if (parms._max_runtime_secs == 0) { double maxPerModel = buildSpec.build_control.stopping_criteria.max_runtime_secs_per_model(); parms._max_runtime_secs = upperLimit <= 0 ? maxPerModel : Math.min(maxPerModel, upperLimit); } }

逻辑解读:

  • 只有模型的max_runtime_secs参数尚未被设置(为 0)时,才把单模型预算注入进去;
  • 注入值取max_runtime_secs_per_model与upperLimit的较小者,其中upperLimit是上层传入的分配上限;
  • 换句话说,单模型预算是一个"上限中的上限":模型训练时间既不会超过单模型预算,也不会超过 AutoML 剩余可分配时间。

此外在ModelStep.trainModel中(同一文件 h2o-automl/src/main/java/ai/h2o/automl/ModelingStep.java),当 AutoML 启用了时间约束时,还会根据timeRemainingMs()(AutoML 剩余时间,见 h2o-automl/src/main/java/ai/h2o/automl/AutoML.java)与工作分配比例(getWorkAllocations().remainingWorkRatio)重新计算每个模型的实际可用秒数,并再次取min以保证总运行时间不超预期。训练事件日志会记录"Time assigned for <key>: Xs"或"No time limitation for <key>",方便排查每个模型实际分配到的预算。

3. 对网格搜索(Grid)步骤的传导

AutoML 的超参数搜索(如 GBM/XGBoost 网格)同样遵循这一预算逻辑。在GridStep.hyperparameterSearch与setSearchCriteria中(h2o-automl/src/main/java/ai/h2o/automl/ModelingStep.java),initTimeConstraints会被用于注入基础模型参数的时间约束,同时网格搜索的RandomDiscreteValueSearchCriteria.max_runtime_secs会被设置为剩余时间按工作占比分配的结果。这样,单个模型的时间预算也间接约束了网格中每个模型的训练时长。

4. 交叉验证(CV)模型与时间预算

AutoML 默认对模型进行交叉验证(nfolds相关)。从测试代码可以推断,单模型时间预算的"个体模型"语义包含与该模型绑定的交叉验证子模型。在 h2o-automl/src/test/java/ai/h2o/automl/AutoMLTest.java 的test_individual_model_max_runtime测试中:

  • 设置max_runtime_secs_per_model = 10,并排除了耗时波动较大的 GLM 与 DeepLearning;
  • 校验逻辑为:遍历 leaderboard 上所有模型,断言每个模型的_total_run_time(毫秒)换算成秒后,与单模型预算的差值小于容忍度;
  • 容忍度计算公式为(nfolds + 1) * max_runtime_secs_per_model / 3,即按"每个 CV 子模型 + 最终模型"(共nfolds + 1个模型)各留出 33% 的余量——这直接印证了单模型时间预算按 CV 折数放大计算的实现事实:每个 CV 折的子模型都会分得时间,因此总耗时可能接近(nfolds + 1)倍的单模型预算。

此外,同文件测试还验证了超时场景下最后一个训练步骤会被标记为cancelled(训练中超时)或success(模型间超时),且超时前无时间限制的模型其 CV 子模型_max_runtime_secs均为 0。

实战示例:R 与 Python 双语言

以下两个示例完整复现官方文档中的用例,使用 H2O 公开测试数据集 prostate,在总时长 200 秒、最多 5 个模型的前提下,将每个模型的训练时间限制为 40 秒。

R 示例

library(h2o) h2o.init() # 导入 prostate 数据集 prostate <- h2o.importFile("http://s3.amazonaws.com/h2o-public-test-data/smalldata/prostate/prostate_complete.csv.zip") # 设定预测变量与响应列 y <- "CAPSULE" x <- setdiff(names(prostate), c(p_y, "ID")) # 训练 AutoML:总时长 200 秒,每个模型最多 40 秒 aml <- h2o.automl(x = x, y = y, training_frame = prostate, seed = 1234, max_models = 5, max_runtime_secs = 200, max_runtime_secs_per_model = 40) # 查看 AutoML Leaderboard lb <- aml@leaderboard lb

输出示例(实际结果会随运行环境略有差异):

model_id mean_residual_deviance 1 StackedEnsemble_BestOfFamily_AutoML_20190321_110032 0.0009730593 2 StackedEnsemble_AllModels_AutoML_20190321_110032 0.0009730593 3 DRF_1_AutoML_20190321_110032 0.0012766064 4 XRT_1_AutoML_20190321_110032 0.0038347775 5 XGBoost_2_AutoML_20190321_110032 0.0064206276 6 XGBoost_1_AutoML_20190321_110032 0.0544174809 rmse mse mae rmsle 1 0.03119390 0.0009730593 0.02086672 0.02368844 2 0.03119390 0.0009730593 0.02086672 0.02368844 3 0.03572963 0.0012766064 0.01406001 0.02661268 4 0.06192558 0.0038347775 0.03330358 0.04958889 5 0.08012882 0.0064206276 0.06873394 0.06112533 6 0.23327555 0.0544174809 0.18390358 0.16640402

Python 示例

import h2o from h2o.automl import H2OAutoML h2o.init() # 导入二分类训练集 prostate = h2o.import_file("http://s3.amazonaws.com/h2o-public-test-data/smalldata/prostate/prostate_complete.csv.zip") # 设定响应列与预测变量 response = "CAPSULE" predictor = prostate.names[2:9] # 训练 AutoML:总时长 200 秒,每个模型最多 40 秒 aml = H2OAutoML(max_models=5, max_runtime_secs=200, max_runtime_secs_per_model=40, seed=1234) aml.train(x=predictor, y=response, training_frame=prostate) # 查看 AutoML Leaderboard lb = aml.leaderboard lb

输出示例:

model_id mean_residual_deviance rmse mse mae rmsle --------------------------------------------------- ------------------------ --------- ----------- --------- --------- StackedEnsemble_AllModels_AutoML_20190321_111608 0.000282073 0.016795 0.000282073 0.0103226 0.0129982 StackedEnsemble_BestOfFamily_AutoML_20190321_111608 0.000282073 0.016795 0.000282073 0.0103226 0.0129982 DRF_1_AutoML_20190321_111608 0.000334287 0.0182835 0.000334287 0.0076525 0.0140754 XRT_1_AutoML_20190321_111608 0.0015397 0.039239 0.0015397 0.0217268 0.0293752 XGBoost_2_AutoML_20190321_111608 0.0118094 0.108671 0.0118094 0.0888375 0.0804565 XGBoost_1_AutoML_20190321_111608 0.0675672 0.259937 0.0675672 0.213536 0.184793 GLM_grid_1_AutoML_20190321_111608_model_1 0.193551 0.439944 0.193551 0.397327 0.306996

客户端参数签名(供查阅)

  • Python 端:H2OAutoML(max_runtime_secs_per_model=None, ...),docstring 说明为"Controls the max time the AutoML run will dedicate to each individual model",类型为int,默认None(等价于服务端0,禁用)。定义见 h2o-py/h2o/automl/_estimator.py,内部通过_aml_property('build_control.stopping_criteria.max_runtime_secs_per_model', types=(None, int), freezable=True)映射到服务端字段(h2o-py/h2o/automl/_estimator.py)。
  • R 端:h2o.automl(..., max_runtime_secs_per_model = NULL, ...),帮助文档描述为"Maximum runtime in seconds dedicated to each individual model training process. Use 0 to disable. Defaults to 0.",参数赋值处见 h2o-r/h2o-package/R/automl.R,同样写入build_control$stopping_criteria$max_runtime_secs_per_model。

使用建议与注意事项

  1. 何时使用:当 AutoML 总预算有限、而你希望保证不止一两个模型能完成训练时,设置合理的max_runtime_secs_per_model可以避免某个难训练的模型"吃掉"大部分总预算。典型场景是max_models较大且数据量较大时。
  2. 取值策略:单模型预算应明显小于总预算除以期望模型数。例如总时长 600 秒、希望跑约 10 个模型时,单模型预算设为 30~60 秒比较合理。过大的单模型预算形同虚设,过小的预算会让模型在未收敛时就被截断,影响模型质量。
  3. 可复现性:若需要完全可复现的 AutoML 结果,官方推荐固定max_models让模型训练至收敛;一旦引入时间预算(包括本参数),由于资源、调度与数据加载耗时的不确定性,结果可能无法复现。另外,H2O DeepLearning 模型默认因性能原因不可复现,如需可复现还应从exclude_algos中排除"DeepLearning"。
  4. CV 放大效应:从源码与测试可知,AutoML 的模型默认带交叉验证,单模型时间预算会对每个 CV 子模型生效,整体耗时可能接近(nfolds + 1)倍预算,评估预期耗时时应计入这一放大系数。
  5. 测试验证:可参考仓库中的test_individual_model_max_runtime测试(h2o-automl/src/test/java/ai/h2o/automl/AutoMLTest.java)了解该参数的校验口径:它通过断言 leaderboard 上每个模型的_total_run_time不超过(nfolds + 1) * max_runtime_secs_per_model / 3容忍上限,来保证时间预算被真实执行。

小结

max_runtime_secs_per_model是 H2O AutoML 中精细控制训练节奏的重要参数:它以"每个个体模型"为粒度设置时间上限,与max_runtime_secs(整体)、max_models(数量)共同构成 AutoML 停止条件的完整控制面。从源码看,其实现通过AutoMLStoppingCriteria存储、ModelStep.initTimeConstraints注入、GridStep.setSearchCriteria传导,最终落地为每个模型(含 CV 子模型)的max_runtime_secs上限。在需要控制单模型成本或均衡多个候选模型训练机会的场景中,合理配置该参数能显著提升 AutoML 的资源利用率;而在追求结果可复现的场景中,则应改用max_models让模型训练至收敛。

  • 机器学习
  • 深度学习
  • AutoML
  • 大数据
  • 后端

【免费下载链接】h2o-3

H2O is an Open Source, Distributed, Fast & Scalable Machine Learning Platform: Deep Learning, Gradient Boosting (GBM) & XGBoost, Random Forest, Generalized Linear Modeling (GLM with Elastic Net), K-Means, PCA, Generalized Additive Models (GAM), RuleFit, Support Vector Machine (SVM), Stacked Ensembles, Automatic Machine Learning (AutoML), etc.

项目地址:https://gitcode.com/gh_mirrors/h2/h2o-3
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询