训练模型

使用 Snowflake ML 结合流行的开源框架开发机器学习和深度学习模型。Snowflake ML 无需管理开销即可提供灵活的开发环境、高效的数据访问和强大的计算资源。

可以在 Snowflake 笔记本或 Snowflake ML 作业中训练模型。

Snowflake 笔记本是交互式环境,可用于机器学习。有关使用 Snowflake 笔记本进行机器学习工作流程的更多信息,请参阅 ML 的容器运行时的笔记本

Snowflake ML 作业允许您在任何环境中运行 ML 工作流程。有关使用 Snowflake ML 作业的更多信息,请参阅 Snowflake ML 作业

使用开源训练

使用 Snowflake 笔记本或 ML 作业时,您可以访问 ML 的容器运行时。ML 的容器运行时是一个具有常用包和框架的环境,您可以使用这些包和框架来训练模型。这些包包括 scikit-learn、numpy 和 scipy。有关更多信息,请参阅 ML 的容器运行时

以下示例使用 scikit-learn 训练逻辑回归模型:

import pandas as pd
from snowflake.ml.data.data_connector import DataConnector
from snowflake.snowpark.context import get_active_session
from sklearn.linear_model import LogisticRegression

# Get the active Snowpark session
session = get_active_session()

# Specify training table location
table_name = "TRAINING_TABLE"  # Replace with your actual Snowflake table name

# Load table into DataConnector
data_connector = DataConnector.from_dataframe(session.table(table_name))

# Convert to pandas DataFrame
pandas_df = data_connector.to_pandas()

# Assuming 'TARGET' is the label column in your Snowflake table
label_column_name = 'TARGET'

# Separate features (X) and target (y)
X, y = pandas_df.drop(label_column_name, axis=1), pandas_df[label_column_name]

# Initialize and fit a Logistic Regression model
logistic_regression_model = LogisticRegression(max_iter=1000)  # Increased max_iter for convergence
logistic_regression_model.fit(X, y)
Copy

除了 scikit-learn 之外,您还可以使用 XGBoost 和 LightGBM 库来开发强大的分类、回归和排名模型。

以下示例使用 Snowflake DataConnector 从 Snowflake 表加载数据,将其转换为 Pandas DataFrame,并训练 XGBoost 模型。DataConnector 加速了数据加载和 Pandas 数据框转换。有关 DataConnector 的更多信息,请参阅 从 Snowflake 表加载结构化数据

from snowflake.ml.data.data_connector import DataConnector
from snowflake.snowpark.context import get_active_session
import xgboost as xgb

session = get_active_session()

# Specify training table location
table_name = "TRAINING_TABLE"

# Load table into DataConnector
data_connector = DataConnector.from_dataframe(session.table(table_name))

pandas_df = data_connector.to_pandas()
label_column_name = 'TARGET'
X, y = pandas_df.drop(label_column_name, axis=1), pandas_df[label_column_name]

clf = xgb.Classifier()
clf.fit(X, y)
Copy

训练深度学习模型

您可以使用基于 GPU 容器运行时镜像来训练带有 PyTorch TensorFlow 和其他框架的深度学习模型。您可以使用预安装的库,也可以使用来自公共或私有存储库的包扩展基础镜像。

您可以从可用的计算池中按需进行 GPU 计算。您只需为所使用的资源付费。

使用 GPU 容器运行时镜像,您可以使用分布式训练等功能来加速大规模模型的开发。

有关 DataConnector 高效数据加载和分布式训练的示例,请参阅在 Snowflake 上 运行分布式 PyTorch 模型:端到端 ML 解决方案

以下示例高效地加载数据:

import torch
import torch.nn as nn
from torch.utils.data import DataLoader
from snowflake.ml.data.data_connector import DataConnector

example_snowpark_dataframe = session.table("EXAMPLE_TRAINING_DATA")

# Connector from a Snowflake table
data_connector = DataConnector.from_dataframe(example_snowpark_dataframe)

# Load as a torch dataset
torch_dataset = data_connector.to_torch_dataset(batch_size=32)
train_loader = DataLoader(torch_dataset, batch_size=None)

label_col = 'TARGET'
feature_cols = ['FEATURE1', 'FEATURE2']

for batch_idx, batch in enumerate(dataloader):
    y = batch_data.pop(label_col).squeeze()
    X = torch.stack(
        [tensor.squeeze() for key, tensor in batch.items() if key in feature_cols]
    )
Copy

以下示例训练模型:

# ------------------------
# Tiny MLP for binary classification
# ------------------------
input_dim = X.shape[1]

class MLP(nn.Module):
    def __init__(self, d_in):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(d_in, 64), nn.ReLU(),
            nn.Linear(64, 32), nn.ReLU(),
            nn.Linear(32, 1)  # logits
        )

    def forward(self, x):
        return self.net(x).squeeze(1)

DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = MLP(input_dim).to(DEVICE)
opt = torch.optim.Adam(model.parameters(), lr=1e-3)
criterion = nn.BCEWithLogitsLoss()

# ------------------------
# Train
# ------------------------
EPOCHS = 5

for epoch in range(1, EPOCHS + 1):
    model.train()
    for xb, yb in train_loader:
        xb, yb = xb.to(DEVICE), yb.to(DEVICE)
        logits = model(xb)
        loss = criterion(logits, yb)
        opt.zero_grad()
        loss.backward()
        opt.step()
    acc = evaluate(val_loader)
    print(f"epoch {epoch} val_acc={acc:.3f}")
Copy

处理复杂的训练任务

使用大型数据集、复杂的模型架构和超参数训练模型需要大量的时间、成本和对资源的访问权限,以促进此类复杂处理。使用 Snowflake ML,您可以放心地训练此类模型。

完全托管的训练基础架构

通过容器运行时上的笔记本和 ML 作业,Snowflake ML 提供完全托管的训练基础架构。您无需管理自定义图像或预置资源。您可以携带工作负载,从管理员确定的列表中选择相应的计算节点,然后开始训练。

高效、加速的数据移动

将大量数据加载到内存中以便使用训练包进行处理可能会很慢,当您尝试直接读取诸如 Pandas 数据框之类的对象时尤其如此。Snowflake ML 通过使用底层计算池的分布式处理来提高数据加载效率。使用数据连接器将 Snowflake 表和暂存区的数据加载到开源对象(如 Pandas 数据框、PyTorch 数据集和 TensorFlow 数据集)。

分布式训练和超参数调优

大型数据集上的训练 ML 模型可能会超过单个节点的资源。借助 Snowflake 的分布式 APIs,您可以跨多个节点扩展特征工程和训练工作流程,以提高性能。使用分布式 APIs,您可以执行以下操作:

  • snowflake.ml.modeling.preprocessing 中利用分布式预处理功能。

  • 使用 ML 的容器运行时 中经过优化的训练 APIs,将模型训练扩展到一个或多个节点。

  • 使用 MLSnowflake :doc:` 的分布式 HPO </developer-guide/snowflake-ml/container-hpo>` 加速超参数调整,该功能已为存储在 Snowflake 中的数据进行优化。您也可以使用开源库,例如 hyperoptoptuna

除了使用 Snowflake 的分布式 APIs 来扩展您的工作流程外,您还可以使用 Ray。Ray 是一个开源框架,它为扩展 Python 应用程序提供了一种简单而灵活的方式。它允许您在多个节点上并行运行代码。有关将 Ray 与 Snowflake ML 结合使用的更多信息,请参阅 Ray 入门指南 (https://docs.ray.io/en/latest/ray-overview/getting-started.html)。

与 MLOps 集成

Snowflake 提供了一个完全集成的 MLOps 平台,您可以通过 Snowflake 笔记本和 ML 作业来访问该平台。这使您能够使用生产就绪特征训练模型、管理实验和模型,并将经过训练的模型部署到生产环境中。

您可以对 MLOps 工作流程使用以下特征:

  • 通过特征商店创建和管理特征

  • 使用 OSS 和 SnowflakeML APIs 大规模运行特征预处理

  • 使用内置实验跟踪功能管理实验

  • 注册和管理经过训练的模型

  • 针对注册模型运行推理管道

  • 监控部署的模型的漂移和准确性

后续步骤

训练模型后,您可以:

语言: 中文