运行实验以比较和选择模型¶
借助 Snowflake ML Experiments,您可以设置 实验,对模型训练的结果进行有组织的评估。这使您能够以有条理的方式快速比较超参数调整的结果、不同目标指标以及不同模型类型的行为,从而选择最适合您需求的模型。每个实验都由一系列 运行 组成,这些运行包含训练过程中的元数据和工件。Snowflake 对您的运行工件不做任何限制,您可以提交对模型评估过程有用的任何内容。
完成实验后,可通过 Snowsight 查看结果。您还可以随时在 Python 或者 SQL 中检索运行工件。
备注
Snowflake Experiments 需要 snowflake-ml-python 版本 1.19.0 或更高版本。
访问控制要求¶
创建实验需要在存储运行工件的架构上拥有 CREATE EXPERIMENT 权限。创建实验需要在父数据库和架构上拥有 USAGE 权限。
创建实验¶
首先,创建一个实验。这需要一个现有的数据库和架构,用来存储运行信息。
实验支持可在 snowflake.ml.experiment.ExperimentTracking 类中使用。使用 set_experiment(name: Optional[str]) 方法可同时打开指定名称的实验,并将其设置为日志和工件的活动实验上下文。尚不存在的实验将被创建。
以下示例演示如何使用现有 session,在活动数据库和架构中创建或打开名为 My_Experiment 的实验,并将其设置为活动实验:
from snowflake.ml.experiment import ExperimentTracking
exp = ExperimentTracking(session=session)
exp.set_experiment("My_Experiment")
在导航菜单中,选择 AI & ML » Experiments。
选择 New Experiment。
输入实验的 Name。
选择用于存储实验运行工件的数据库和架构。
选择 Create 创建实验,或者选择 Cancel 以取消。
开始实验运行¶
实验中的每次运行都有自己的一组指标、参数和工件。此信息用于 Snowsight,提供有关模型训练及其结果的可视化和数据。
使用 start_run(name: Optional[str]) 方法,在 ExperimentTracking 实例上开始运行。此操作将返回一个新的 Run,可在 with 语句中使用。Snowflake 建议您使用 with 语句,以便运行可以干净完成,并更容易理解运行范围。
with exp.start_run("my_run"):
# .. Train your model and log artifacts
自动记录训练信息¶
您可以自动记录以下内容的训练信息:XGBoost、 LightGBM或模型训练期间的 Keras 模型。自动记录通过注册回调执行,该回调引用您的实验以及正在训练模型的相关信息。每次在 Model 实例上调用调整参数或指标的方法时,都会自动记录到活动运行的实验中。
以下示例展示了如何为每个受支持的模型训练器配置实验回调,然后开始基本训练运行以记录工件。
# exp: ExperimentTracking
from xgboost import XGBClassifier
from snowflake.ml.experiment.callback.xgboost import SnowflakeXgboostCallback
from snowflake.ml.model.model_signature import infer_signature
sig = infer_signature(X, y)
callback = SnowflakeXgboostCallback(
exp, model_name="name", model_signature=sig
)
model = XGBClassifier(callbacks=[callback])
with exp.start_run("my_run"):
model.fit(X, y, eval_set=[(X, y)])
# exp: ExperimentTracking
from lightgbm import LGBMClassifier
from snowflake.ml.experiment.callback.lightgbm import SnowflakeLightgbmCallback
from snowflake.ml.model.model_signature import infer_signature
sig = infer_signature(X, y)
callback = SnowflakeLightgbmCallback(
exp, model_name="name", model_signature=sig
)
model = LGBMClassifier()
with exp.start_run("my_run"):
model.fit(X, y, eval_set=[(X, y)], callbacks=[callback])
# exp: ExperimentTracking
import keras
from snowflake.ml.experiment.callback.keras import SnowflakeKerasCallback
from snowflake.ml.model.model_signature import infer_signature
sig = infer_signature(X, y)
callback = SnowflakeKerasCallback(
exp, model_name="name", model_signature=sig
)
model = keras.Sequential()
model.add(keras.layers.Dense(1))
model.compile(
optimizer=keras.optimizers.RMSprop(learning_rate=0.1),
loss="mean_squared_error",
metrics=["mean_absolute_error"],
)
with exp.start_run("my_run"):
model.fit(X, y, validation_split=0.5, callbacks=[callback])
手动记录训练信息和工件¶
对于不支持自动记录或已预训练的模型,您可以在 Python 中手动记录实验信息并上传工件。参数是训练模型的固定输入,而指标在模型 步骤 中进行评估。您可以选择将训练轮次表示为相应的步骤。以下示例展示了如何记录参数、记录指标和上传工件。
备注
默认步骤值为 0。
# Logging requires an active run for the exp: ExperimentTracker instance.
# Log model parameters with the log_param(...) or log_params(...) methods
exp.log_param("learning_rate", 0.01)
exp.log_params({"optimizer": "adam", "batch_size": 64})
# Log model metrics with the log_metric(...) or log_metrics(...) methods
exp.log_metric("loss", 0.3, step=100)
exp.log_metrics({"loss": 0.4, "accuracy": 0.8}, step=200)
# Log your model to the experiment's model registry with the log_model(...) method.
exp.log_model(model, model_name="my_model", signatures={"predict": model_signature})
exp.log_model(model, model_name="my_model", sample_input_data=data)
# Log local artifacts to an experiment run with the log_artifact(...) method.
exp.log_artifact('/tmp/file.txt', artifact_path='artifacts')
备注
仓库笔记本不支持工件记录。
完成一次运行¶
完成运行后,它将变为不可更改,并在 Snowsight 中显示为已完成。
如果您在 with 语句中启动了运行,退出作用域时运行将自动完成。否则,您可以通过调用实验的 end_run(name: Optional[str]) 方法,并提供要完成的运行名称来结束运行:
experiment.end_run("my_run")
比较实验中的运行¶
实验评估通过 Snowsight 完成。在导航菜单中,选择 AI & ML » Experiments 并从列表中选择要检查的实验。
实验视图包含以下信息:Run count over time、当前所选指标的显示,以及实验中可用运行的列表。右上角的下拉菜单提供可检查的指标列表,并用于填充实验视图中的 Metric Value Range 图表。
此页面上的运行列表包含 Run name、Status、运行时间 Created,以及实验中每个可用指标的附加列。参数和模型版本的信息可在运行比较视图中查看。
您最多可以在实验中选择五次运行,然后点击 Compare 按钮以显示比较视图,该视图展示运行元数据、参数、指标和模型版本信息。每个指标都以可视化方式显示,可在 Metrics 部分使用切换按钮在 Charts 与 Tables 之间切换。
从运行中检索工件¶
在运行期间或运行结束后,您都可以检索工件。以下示例演示如何在 logs 路径中列出运行可用的工件,并将实验 my_experiment 中运行 my_run 的工件 logs/log0.txt 下载到本地目录 /tmp:
# exp: ExperimentTracking
exp.set_experiment("my_experiment")
exp.list_artifacts("my_run", artifact_path="logs")
exp.download_artifacts("my_run", artifact_path="logs/log0.txt", target_path="/tmp")
LIST snow://experiment/my_experiment/versions/my_run/logs;
GET snow://experiment/my_experiment/versions/my_run/logs/log0.txt file:///tmp;
删除运行和实验¶
完成实验后,您可以删除实验及其所有关联的运行工件。以下示例删除了实验 my_experiment:
# exp: ExperimentTracking
exp.delete_experiment("my_experiment")
DROP EXPERIMENT my_experiment;
您还可以从实验中删除单次运行。以下示例移除了来自实验 my_experiment 的运行 my_run:
# exp: ExperimentTracking
exp.set_experiment("my_experiment")
exp.delete_run("my_run")
ALTER EXPERIMENT my_experiment DROP RUN my_run;
限制¶
Snowflake Experiments 受以下限制:
每个架构最多允许 500 次实验。
每个实验最多允许 500 次运行。
运行数据最多保存 1 年。
单个运行的参数和指标总数限制为 200 个 KB。
成本注意事项¶
使用 Snowflake 实验会产生基于 Snowflake 使用量的标准成本。这些对象包括:
存储运行工件的成本。有关存储成本的一般信息,请参阅 探索存储成本。