ML 的容器运行时的并行超参数优化 (HPO)

Snowflake ML 超参数优化 (HPO) API 是一个与模型无关的框架,可使用常用的调整算法对模型进行高效、并行的超参数调整。

如今,此 API 可在配置为使用 Snowpark Container Services (SPCS) 上的容器运行时的 Snowflake 笔记本内使用。创建这样一个笔记本 之后,可以执行以下操作:

  • 使用任何开源包训练模型,并使用此 API 分配超参数调整过程

  • 使用 Snowflake ML 分布式训练 APIs 训练模型,并扩展 HPO,同时也扩展每个训练运行

HPO 工作负载由笔记本启动,在 Snowpark Container Services 内的 CPU 或 GPU 实例上执行,并扩展到 SPCS 计算池中单个节点上可用的核心(CPUs 或 GPUs)。

并行化的 HPO API 具有以下优势:

  • 单个 API 可自动处理在多个资源之间分配训练的所有复杂问题

  • 利用开源 ML 框架或 Snowflake ML 建模 APIs,几乎能使用任何框架或算法进行训练

  • 一系列调整和采样选项,包括贝叶斯和随机搜索算法,以及各种连续和非连续采样函数

  • 与 Snowflake 的其他功能紧密集成;例如,通过 Snowflake 数据集或数据帧高效引入数据,以及自动获取 ML 沿袭

示例

本例说明了典型的 HPO 用例,首先通过容器运行时 DataConnector API 从 Snowflake 表中引入数据,然后定义一个创建 XGBoost 模型的训练函数。Tuner 界面根据给定的训练函数和搜索空间提供调整功能。

from snowflake.ml.modeling.tune import get_tuner_context
from snowflake.ml.modeling import tune

# Define a training function, with any models you choose within it.
def train_func():
    # A context object provided by HPO API to expose data for the current HPO trial
    tuner_context = get_tuner_context()
    config = tuner_context.get_hyper_params()
    dm = tuner_context.get_dataset_map()

    model = xgb.XGBClassifier(**config, random_state=42)
    model.fit(dm["x_train"].to_pandas(), dm["y_train"].to_pandas())
    accuracy = accuracy_score(
        dm["y_train"].to_pandas(), model.predict(dm["x_train"].to_pandas())
    )
    tuner_context.report(metrics={"accuracy": accuracy}, model=model)

tuner = tune.Tuner(
    train_func=train_func,
    search_space={
        "n_estimators": tune.uniform(50, 200),
        "max_depth": tune.uniform(3, 10),
        "learning_rate": tune.uniform(0.01, 0.3),
    },
    tuner_config=tune.TunerConfig(
        metric="accuracy",
        mode="max",
        search_alg=search_algorithm.BayesOpt(),
        num_trials=2,
        max_concurrent_trials=1,
    ),
)

tuner_results = tuner.run(dataset_map=dataset_map)
# Access the best result info with tuner_results.best_result
Copy

预期输出如下所示:

accuracy  should_checkpoint  trial_id   time_total_s  config/learning_rate  config/max_depth  config/n_estimators
1.0       True               ec632254   7.161971      0.118617              9.655             159.799091

tuner_results 对象包含所有结果、最佳模型和最佳模型路径。

print(tuner_results.results)
print(tuner_results.best_model)
print(tuner_results.best_model_path)
Copy

API 概述

HPO API 属于 snowflake.ml.modeling.tune 命名空间。主要 HPO API 是 tune.Tuner 类。在实例化该类时,需要指定以下内容:

  • 适合模型的训练函数

  • 定义超参数采样方法的搜索空间 (tune.SearchSpace)

  • 调谐器配置对象 (tune.TunerConfig) 定义了搜索算法、要优化的指标和试验次数

在实例化 Tuner 后,使用数据集映射(为每个输入数据集指定一个 DataConnector)调用 run 方法,开始调整过程。

要了解更多信息,请执行以下 Python 语句来检索每个类的文档:

from snowflake.ml.modeling import tune

help(tune.Tuner)
help(tune.TunerConfig)
help(tune.SearchSpace)
Copy

限制

贝叶斯优化仅适用于均匀采样函数。贝叶斯优化依赖高斯过程作为代用模型,因此需要连续的搜索空间。它与使用 tune.randinttune.choice 方法采样的离散参数不兼容。要绕过这一限制,要么使用 tune.uniform 并转换训练函数中的参数,要么改用可同时处理离散空间和连续空间的采样算法,如 tune.RandomSearch

故障排除

错误消息

可能原因

可能的解决方案

无效的搜索空间配置:BayesOpt 要求所有采样函数都是“均匀”类型。

贝叶斯优化只适用于均匀采样,不适用于离散采样。(请参阅上面的 限制)。

  • 使用 tune.uniform 并将结果注入训练函数。

  • 切换到 RandomSearch 算法,该算法同时接受离散和非离散样本。

CPU 资源不足。需要:16,可用:8。可参阅 CPU 或 GPU。所需资源和可用资源的数量可能有所不同。

max_concurrent_trials 设置为高于可用核心的值。

完整的错误消息描述了可以尝试的几个选项。

语言: 中文