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
预期输出如下所示:
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)
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)
限制¶
贝叶斯优化仅适用于均匀采样函数。贝叶斯优化依赖高斯过程作为代用模型,因此需要连续的搜索空间。它与使用 tune.randint
或 tune.choice
方法采样的离散参数不兼容。要绕过这一限制,要么使用 tune.uniform
并转换训练函数中的参数,要么改用可同时处理离散空间和连续空间的采样算法,如 tune.RandomSearch
。
故障排除¶
错误消息 |
可能原因 |
可能的解决方案 |
---|---|---|
无效的搜索空间配置:BayesOpt 要求所有采样函数都是“均匀”类型。 |
贝叶斯优化只适用于均匀采样,不适用于离散采样。(请参阅上面的 限制)。 |
|
CPU 资源不足。需要:16,可用:8。可参阅 CPU 或 GPU。所需资源和可用资源的数量可能有所不同。 |
|
完整的错误消息描述了可以尝试的几个选项。 |