ML 的容器运行时的笔记本

概述

您可以在 ML 容器运行时中运行 Snowflake Notebooks。ML 容器运行时由 Snowpark Container Services 提供支持,为您提供灵活的容器基础设施,支持在 Snowflake 内部完全构建和操作各种工作流。ML 容器运行时提供软件和硬件选项,以支持高级数据科学和机器学习工作负载。与 虚拟仓库 相比,ML 容器运行时提供了一个更灵活的计算环境,您可以从多个源安装包并选择计算资源,包括 GPU 机器类型,同时仍然在仓库上运行 SQL 查询以获得最佳性能。

本文档描述了在 ML 容器运行时 中使用笔记本的一些注意事项。您还可以尝试 开始使用 Snowflake 笔记本容器运行时 (https://quickstarts.snowflake.com/guide/notebook-container-runtime/index.html) 快速入门,了解有关在您的开发中使用 ML 容器运行时的更多信息。

先决条件

在开始使用 ML 容器运行时中的 Snowflake Notebooks 之前,ACCOUNTADMIN 角色必须完成笔记本设置步骤,以创建必要的资源以及授予这些资源的权限。有关详细步骤,请参阅 管理员设置

在 ML 容器运行时中创建笔记本

当您在 ML 容器运行时中创建笔记本时,您需要选择仓库、运行时和计算池,以提供运行笔记本所需的资源。您选择的运行时根据您的用例提供对不同 Python 包的访问。不同的仓库大小或计算池具有不同的成本和性能影响。如果需要,所有这些设置可以稍后更改。

备注

具有 ACCOUNTADMIN、ORGADMIN 或 SECURITYADMIN 角色的用户无法直接在 ML 容器运行时中创建或拥有笔记本。这些角色创建或直接拥有的笔记本将无法运行。然而,如果笔记本被一个角色拥有,而该角色继承了 ACCOUNTADMIN、ORGADMIN 或 SECURITYADMIN 角色的权限,例如 PUBLIC 角色,那么您可以使用这些角色来运行该笔记本。

要创建在 ML 容器运行时中运行的 Snowflake 笔记本,请按照以下步骤操作:

  1. 登录 Snowsight。

  2. 选择 Notebooks

  3. 选择 + Notebook

  4. 输入笔记本的名称。

  5. 选择在其中存储笔记本的数据库和架构。创建笔记本后,这些内容便无法更改。

    备注

    数据库和架构仅用于存储您的笔记本。您可以从您的笔记本中查询您角色可以访问的任何数据库和架构。

  6. 选择 Run on container 作为您的 Python 环境。

  7. 选择 Runtime 类型:CPU 或 GPU。

  8. 选择 Compute pool

  9. 更改所选仓库以用于运行 SQL 和 Snowpark 查询。

  10. 要创建和打开笔记本,请选择 Create

Runtime

此预览版提供两种运行时类型:CPU 和 GPU。每个运行时图像包含一组由 Snowflake 验证和集成的基础 Python 包和版本。所有运行时图像支持使用 Snowpark Python、Snowflake ML 和 Streamlit 进行数据分析、建模和训练。

要从公共存储库安装额外的包,您可以使用 pip。需要一个外部访问集成 (EAI),以便 Snowflake Notebooks 从外部端点安装包。要配置 EAIs,请参阅 为 Snowflake Notebooks 设置外部访问。然而,如果包已经是基础镜像的一部分,那么您无法通过使用 pip install 安装不同版本来更改包的版本。有关预安装包的列表,请参阅 ML 的容器运行时

Compute pool

计算池为您的笔记本内核和 Python 代码提供计算资源。使用较小的基于 CPU 的计算池开始入门,并选择内存更大、基于 GPU 的计算池,以优化计算机视觉或 LLMs/VLMs 等密集型 GPU 使用场景。

请注意,每个计算节点每次仅限于为每个用户运行一个笔记本。在为笔记本创建计算池时,应将 MAX_NODES 参数设置为大于 1 的值。有关示例,请参阅 计算资源。有关 Snowpark Container Services 计算池的更多详细信息,请参阅 Snowpark Container Services:使用计算池

当笔记本电脑未被使用时,请考虑将其关闭以释放节点资源。您可以通过在连接下拉按钮中选择 End session 来关闭笔记本。

在 ML 容器运行时中运行笔记本

在创建笔记本后,您可以通过添加和运行单元格立即开始运行代码。有关添加单元格的信息,请参阅 在 Snowflake Notebooks 中开发和运行代码

导入更多包

除了预安装的包以便让您的笔记本启动和运行外,您还可以从已设置外部访问的公共源安装包。您还可以使用存储在暂存区或专用存储库中的包。您需要使用 ACCOUNTADMIN 角色或可以创建外部访问集成 (EAIs) 的角色来设置并授予您访问特定外部端点的权限。使用 ALTER NOTEBOOK 命令在您的笔记本上启用外部访问。授权后,您会在 Notebook settings 中看到 EAIs。在开始从外部通道安装之前,请切换 EAIs。有关说明,请参阅 创建外部访问集成 (EAI)

以下示例在代码单元格中使用 pip install 安装外部包:

!pip install transformers scipy ftfy accelerate
Copy

更新笔记本设置

您可以随时在 Notebook settings 中更新设置,例如使用哪个计算池或仓库,可以通过右上角的 工作表的更多操作 笔记本操作 菜单访问。

您可以在 Notebook settings 中更新的设置之一是空闲超时设置。空闲超时的默认值为 1 小时,您可以将其设置为最长 72 小时。要在 SQL 中设置此项,请使用 CREATE NOTEBOOKALTER NOTEBOOK 命令来设置笔记本的 IDLE_AUTO_SHUTDOWN_TIME_SECONDS 属性。

安装专用包

Pip 支持从具有 基本身份验证 (https://pip.pypa.io/en/stable/topics/authentication/#basic-http-authentication) 的私有源安装软件包,例如 JFrog Artifactory。配置笔记本以进行外部访问集成 (EAI),以便它可以访问存储库。

  1. 创建网络规则以指定您要访问的存储库。例如,此网络规则指定了一个 JFrog 存储库:

    CREATE OR REPLACE NETWORK RULE jfrog_network_rule
      MODE = EGRESS
      TYPE = HOST_PORT
      VALUE_LIST = ('<your-repo>.jfrog.io');
    
    Copy
  2. 创建一个外部访问集成,以允许访问存储库:

    CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION jfrog_integration
      ALLOWED_NETWORK_RULES = (jfrog_network_rule)
      ENABLED = TRUE;
    
    GRANT USAGE ON INTEGRATION jfrog_integration TO ROLE data_scientist;
    
    Copy
  3. 要访问外部访问配置,请选择笔记本右上角的 |vertical-ellipsis|(Notebook actions 菜单)。

  4. 选择 Notebook settings,然后选择 External access 选项卡。

  5. 选择 EAI 以连接到存储库。

    笔记本重新启动。

  6. 笔记本重新启动后,您可以从存储库安装:

    !pip install hello-jfrog --index-url https://<user>:<token>@<your-repo>.jfrog.io/artifactory/api/pypi/test-pypi/simple
    
    Copy

使用专用连接安装专用包

如果您的专用包存储库需要专用连接,请按照以下步骤配置账户。如果您需要帮助,可以与您的账户管理员协调以设置网络规则。

  1. 按照 使用专用连接的网络出口 中的步骤,使用专用连接设置网络出口。

  2. 从第 1 步,使用网络规则创建一个 EAI。例如:

    CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION private_repo_integration
      ALLOWED_NETWORK_RULES = (PRIVATE_LINK_NETWORK_RULE)
      ENABLED = TRUE;
    
    GRANT USAGE ON INTEGRATION private_repo_integration TO ROLE data_scientist;
    
    Copy
  3. 要访问外部访问配置,请选择笔记本右上角的 |vertical-ellipsis|(Notebook actions 菜单)。

  4. 选择 Notebook settings,然后选择 External access 选项卡。

  5. 选择 EAI 以连接到您的专用存储库。

    笔记本重新启动。

  6. 在笔记本重新启动后,您可以提供存储库的 --index-url

    !pip install my_package --index-url https://my-private-repo-url.com/simple
    
    Copy

运行 ML 工作负载

ML 容器运行时的笔记本非常适合运行 ML 工作负载,例如模型训练和参数调整。运行时预安装了常见的 ML 包。设置好外部集成访问后,您可以使用 !pip install 安装所需的任何其他包。

备注

Python 进程缓存已加载的模块。在导入代码中的包之前更改已安装包的版本。否则,您可能需要断开并重新连接到笔记本会话以加载新版本。

以下示例展示了如何使用一些可用库来处理您的 ML 工作负载。

使用新的容器优化库

ML 容器运行时集成了专门为容器环境中的 ML 开发量身定制的新 APIs。通过将处理分配到多个核心,这些 APIs 提供了优化的数据加载、模型训练和超参数优化。在 Snowflake ML 开发者指南的 容器运行时 部分了解更多有关这些 APIs 的信息。

使用 OSS ML 库

以下示例使用一个 OSS ML 库,xgboost,并且有一个活跃的 Snowpark 会话,以便直接将数据提取到内存中进行训练:

from snowflake.snowpark.context import get_active_session
import pandas as pd
import xgboost as xgb
from sklearn.model_selection import train_test_split

session = get_active_session()
df = session.table("my_dataset")
# Pull data into local memory
df_pd = df.to_pandas()
X = df_pd[['feature1', 'feature2']]
y = df_pd['label']
# Split data into test and train in memory
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15, random_state=34)
# Train in memory
model = xgb.XGBClassifier()
model.fit(X_train, y_train)
# Predict
y_pred = model.predict(X_test)
Copy

使用 Snowflake ML 建模 APIs

当 Snowflake 的 ML 建模 APIs 用于 ML 容器运行时的时候,所有执行(包括训练和预测)都直接发生在容器运行时中,而不是在查询仓库中。容器运行时中的 Snowflake ML 可以更快地拉取数据,并且推荐用于大规模训练。在 GPU 运行时,Snowflake ML 默认将使用所有 GPUs 来加速训练。

以下代码块示例使用 XGBoost 进行建模:

from snowflake.snowpark.context import get_active_session
from snowflake.ml.modeling.xgboost import XGBClassifier
from snowflake.ml.modeling.metrics import accuracy_score

session = get_active_session()
df = session.table("my_dataset")
feature_cols=['FEATURE1', 'FEATURE2']
label_col = 'LABEL'
predicted_col = [PREDICTED_LABEL]
df = df[features_cols + [label_col]]
# Split is pushed down to associated warehouse
train_df, test_df = df.random_split(weights=[0.85, 0.15], seed=34)

model = XGBClassifier(
    input_cols=feature_cols,
    label_cols=label_col,
    output_cols=predicted_col,
    # This will enable leveraging all GPUs on the node
    tree_method="gpu_hist",
)
# Train
model.fit(train_df)
# Predict
result = model.predict(test_df)

accuracy = accuracy_score(
df=result,
y_true_col_names=label_cols,
y_pred_col_names=predicted_col)
Copy

以下是使用轻量梯度提升机 (LightGBM) 的示例:

from snowflake.snowpark.context import get_active_session
from snowflake.ml.modeling.lightgbm import LGBMClassifier
from snowflake.ml.modeling.metrics import accuracy_score

session = get_active_session()
df = session.table("my_dataset")
feature_cols=['FEATURE1', 'FEATURE2']
label_col = 'LABEL'
predicted_col = [PREDICTED_LABEL]

df = df[features_cols + [label_col]]
# Split is pushed down to associated warehouse
train_df, test_df = df.random_split(weights=[0.85, 0.15], seed=34)

model = LGBMClassifier(
    input_cols=feature_cols,
    label_cols=label_col,
    ouput_cols=predicted_col,
    # This will enable leveraging all GPUs on the node
    device_type="gpu",
)

# Train
model.fit(train_df)
# Predict
result = model.predict(test_df)

accuracy = accuracy_score(
df=result,
y_true_col_names=label_cols,
y_pred_col_names=predicted_col)
Copy

使用新的容器优化库

ML 容器运行时预安装了专门为容器环境中的 ML 训练量身定制的新 APIs。

数据连接器 APIs

数据连接器 APIs 提供单一接口,用于将 Snowflake 数据源(包括表、DataFrames 和数据集)连接到最常用的 ML 框架(如 PyTorch 和 TensorFlow)。这些 APIs 可以在 snowflake.ml.data 命名空间中找到。

snowflake.ml.data.data_connector.DataConnector

将 Snowpark DataFrames 或 Snowflake ML 数据集连接到 TensorFlow 或 PyTorch DataSets 或 Pandas DataFrames。使用以下类方法之一实例化连接器:

  • DataConnector.from_dataframe: 接受 Snowpark DataFrame。

  • DataConnector.from_dataset:接受 Snowflake ML 数据集,按名称和版本指定。

  • DataConnector.from_sources:接受源列表,每个源可以是 DataFrame 或数据集。

您实例化了连接器(例如,调用实例 data_connector)之后,请调用以下方法以生成所需类型的输出。

  • data_connector.to_tf_dataset:返回适合与 TensorFlow 一起使用的 TensorFlow 数据集。

  • data_connector.to_torch_dataset:返回适合与 PyTorch 一起使用的 PyTorch 数据集。

有关这些 APIs 的更多信息,请参阅 Snowflake ML API 参考

分布式建模 APIs

分布式建模 APIs 提供 LightGBM、PyTorch 和 XGBoost 的并行版本,充分利用容器环境中的可用资源。这些可以在 snowflake.ml.modeling.distributors 命名空间中找到。分布式类的 APIs 与标准版本的类似。

有关这些 APIs 的更多信息,请参阅 API 参考

XGBoost

主要 XGBoost 类是 snowflake.ml.modeling.distributors.xgboost.XGBEstimator。相关类包括:

  • snowflake.ml.modeling.distributors.xgboost.XGBScalingConfig

要查看与此 API 搭配使用的示例,请参阅 Snowflake ML 容器运行时 GitHub 存储库中的 XGBoost on GPU (https://github.com/Snowflake-Labs/sfguide-getting-started-with-container-runtime-apis/blob/main/XGBoost_on_GPU_Quickstart.ipynb) 示例笔记本。

LightGBM

主要 LightGBM 类是 snowflake.ml.modeling.distributors.lightgbm.LightGBMEstimator。相关类包括:

  • snowflake.ml.modeling.distributors.lightgbm.LightGBMScalingConfig

要查看与此 API 搭配使用的示例,请参阅 Snowflake ML 容器运行时 GitHub 存储库中的 LightGBM on GPU (https://github.com/Snowflake-Labs/sfguide-getting-started-with-container-runtime-apis/blob/main/LightGBM_on_GPU_Quickstart.ipynb) 示例笔记本。

PyTorch

主要 PyTorch 类是 snowflake.ml.modeling.distributors.pytorch.PyTorchDistributor。相关类包括:

  • snowflake.ml.modeling.distributors.pytorch.WorkerResourceConfig

  • snowflake.ml.modeling.distributors.pytorch.PyTorchScalingConfig

  • snowflake.ml.modeling.distributors.pytorch.Context

  • snowflake.ml.modeling.distributors.pytorch.get_context

要查看与此 API 搭配使用的示例,请参阅 Snowflake ML 容器运行时 GitHub 存储库中的 PyTorch on GPU (https://github.com/Snowflake-Labs/sfguide-getting-started-with-container-runtime-apis/blob/main/PyTorch_on_GPU_Quickstart.ipynb) 示例笔记本。

限制

  • 在 ML 容器运行时中,Snowflake ML 建模 API 仅支持 predictpredict_probapredict_log_proba 推理方法。其他方法在查询仓库中运行。

  • 在容器运行时中,Snowflake ML 建模 API 仅支持 sklearn 兼容的管道。

  • 在 ML 容器运行时中,Snowflake ML 建模 API 不支持 preprocessingmetrics 类。这些在查询仓库中运行。

  • fitpredictscore 方法在 ML 容器运行时中执行。其他 Snowflake ML 方法在查询仓库中运行。

  • sample_weight_cols 不支持 XGBoost 或 LightGBM 模型。

成本/计费注意事项

在 ML 容器运行时中运行笔记本时,您可能会产生 :doc:` 仓库计算 </user-guide/cost-understanding-compute>` 和 SPCS 计算成本

Snowflake Notebooks 需要一个虚拟仓库来运行 SQL 和 Snowpark 查询以获得优化的性能。因此,如果您在 SQL 单元格中使用 SQL,并在 Python 单元格中执行 Snowpark 下推查询,您可能还会产生虚拟仓库计算成本。以下图表显示了每种类型的单元格计算发生的位置。

图表显示了笔记本单元格的计算分布。

例如,以下 Python 示例使用 xgboost (https://xgboost.readthedocs.io/en/stable/) 库。数据被拉入容器中,并在 Snowpark Container Services 中进行计算。

from snowflake.snowpark.context import get_active_session
import pandas as pd
import xgboost as xgb
from sklearn.model_selection import train_test_split

session = get_active_session()
df = session.table("my_dataset")
# Pull data into local memory
df_pd = df.to_pandas()
X = df_pd[['feature1', 'feature2']]
y = df_pd['label']
# Split data into test and train in memory
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.15, random_state=34)
Copy

要了解关于仓库成本的更多信息,请参阅 仓库概述

语言: 中文