Snowflake#

您可以通过 Snowpark Container ServicesSnowflake 上安装 RAPIDS。

注意

以下说明是 Snowflake 文档中《Snowpark Container Services 入门》指南的改编。

Snowflake 要求#

  • 在支持的AWS 区域中拥有非试用 Snowflake 账户。

  • 拥有 ACCOUNTADMIN 角色的 Snowflake 账户登录凭据。如果没有,您需要与您的 ACCOUNTADMIN 协作完成初始账户设置。

  • 可访问带有 NVIDIA GPU 的 INSTANCE_FAMILY。在本指南中,我们将使用 GPU_NV_S(1 个 NVIDIA A10G - Snowpark Containers 可用的最小 NVIDIA GPU 大小,用于快速入门)。

设置 Snowflake 环境#

在 Snowflake 的 SQL 工作表中,运行以下命令来创建开始所需的角色、数据库、仓库和阶段

-- Create an CONTAINER_USER_ROLE with required privileges
USE ROLE ACCOUNTADMIN;
CREATE ROLE CONTAINER_USER_ROLE;
GRANT CREATE DATABASE ON ACCOUNT TO ROLE CONTAINER_USER_ROLE;
GRANT CREATE WAREHOUSE ON ACCOUNT TO ROLE CONTAINER_USER_ROLE;
GRANT CREATE COMPUTE POOL ON ACCOUNT TO ROLE CONTAINER_USER_ROLE;
GRANT CREATE INTEGRATION ON ACCOUNT TO ROLE CONTAINER_USER_ROLE;
GRANT MONITOR USAGE ON ACCOUNT TO  ROLE  CONTAINER_USER_ROLE;
GRANT BIND SERVICE ENDPOINT ON ACCOUNT TO ROLE CONTAINER_USER_ROLE;
GRANT IMPORTED PRIVILEGES ON DATABASE snowflake TO ROLE CONTAINER_USER_ROLE;

-- Grant CONTAINER_USER_ROLE to ACCOUNTADMIN
grant role CONTAINER_USER_ROLE to role ACCOUNTADMIN;

-- Create Database, Warehouse, and Image spec stage
USE ROLE CONTAINER_USER_ROLE;
CREATE OR REPLACE DATABASE CONTAINER_HOL_DB;

CREATE OR REPLACE WAREHOUSE CONTAINER_HOL_WH
  WAREHOUSE_SIZE = XSMALL
  AUTO_SUSPEND = 120
  AUTO_RESUME = TRUE;

CREATE STAGE IF NOT EXISTS specs
ENCRYPTION = (TYPE='SNOWFLAKE_SSE');

CREATE STAGE IF NOT EXISTS volumes
ENCRYPTION = (TYPE='SNOWFLAKE_SSE')
DIRECTORY = (ENABLE = TRUE);

然后我们继续创建外部访问集成、计算池(包含 GPU 资源)和镜像仓库

USE ROLE ACCOUNTADMIN;

CREATE OR REPLACE NETWORK RULE ALLOW_ALL_RULE
  TYPE = 'HOST_PORT'
  MODE = 'EGRESS'
  VALUE_LIST= ('0.0.0.0:443', '0.0.0.0:80');

CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION ALLOW_ALL_EAI
  ALLOWED_NETWORK_RULES = (ALLOW_ALL_RULE)
  ENABLED = true;

GRANT USAGE ON INTEGRATION ALLOW_ALL_EAI TO ROLE CONTAINER_USER_ROLE;

USE ROLE CONTAINER_USER_ROLE;
CREATE COMPUTE POOL IF NOT EXISTS CONTAINER_HOL_POOL
MIN_NODES = 1
MAX_NODES = 1
INSTANCE_FAMILY = GPU_NV_S; -- instance with GPU

CREATE IMAGE REPOSITORY CONTAINER_HOL_DB.PUBLIC.IMAGE_REPO;

SHOW IMAGE REPOSITORIES IN SCHEMA CONTAINER_HOL_DB.PUBLIC;

通过 SnowCLI 推送 Docker 镜像#

流程的下一步是将您希望通过服务运行的 docker 镜像推送到镜像注册表。

本地构建 Docker 镜像#

在本指南中,我们构建一个从 RAPIDS notebook 镜像开始并添加一些额外 snowflake 包的镜像。

按如下方式创建一个 Dockerfile

FROM nvcr.io/nvidia/rapidsai/notebooks:25.04-cuda12.8-py3.11-amd64

RUN pip install "snowflake-snowpark-python[pandas]" snowflake-connector-python

注意

  • python=3.11 是 Snowflake 连接器包支持的最新版本。

  • Snowflake 要求使用 amd64 平台。

在 Dockerfile 所在的目录中构建镜像。请注意,构建此镜像不需要 GPU。

docker build --platform=linux/amd64 -t <local_repository>/rapids-nb-snowflake:latest .

安装 SnowCLI#

按照文档中您偏好的方法说明安装 SnowCLI。

安装完成后,配置您的 Snowflake CLI 连接,并按照向导进行操作

注意

按照向导操作时,您需要 <ORG>-<ACCOUNT-NAME>,您可以在 Snowflake SQL 工作表中运行以下命令获取它们。

SELECT CURRENT_ORGANIZATION_NAME(); --org
SELECT CURRENT_ACCOUNT_NAME();      --account name
snow connection add
connection name : CONTAINER_HOL
account : <ORG>-<ACCOUNT-NAME> # e.g. MYORGANIZATION-MYACCOUNT
user : <snowflake_user_name>
password : <snowflake_password>
role: CONTAINER_USER_ROLE
warehouse : CONTAINER_HOL_WH
database : CONTAINER_HOL_DB
schema : public
host:
port:
region:
authenticator: username_password_mfa # only needed if MFA and MFA caching are enabled
private key file:
token file path:

测试连接

snow connection test --connection "CONTAINER_HOL"

为了能够推送 docker 镜像,我们需要从仓库 URL 获取 snowflake 注册表主机名。在 Snowflake SQL 工作表中运行

USE ROLE CONTAINER_USER_ROLE;
SHOW IMAGE REPOSITORIES IN SCHEMA CONTAINER_HOL_DB.PUBLIC;

您会看到仓库 URL 是 org-account.registry.snowflakecomputing.com/container_hol_db/public/image_repo,其中 org-account 指的是您的组织和账户,SNOWFLAKE_REGISTRY_HOSTNAME 是直到 .com 的 URL,例如 org-account.registry.snowflakecomputing.com

首先我们通过终端登录 snowflake 镜像注册表

注意

如果您启用了 MFA,您会希望允许客户端 MFA 缓存,以减少连接和验证到 Snowflake 时必须确认的提示次数。

要启用此功能,您需要 ACCOUNTADMIN 系统角色并在 SQL 工作表中运行

ALTER ACCOUNT SET ALLOW_CLIENT_MFA_CACHING = TRUE;

如果您使用的是 Snowflake Connector for Python,则需要

pip install "snowflake-connector-python[secure-local-storage]"
snow spcs image-registry login --connection CONTAINER_HOL

我们标记并推送镜像,请确保将仓库 URL 替换为 org-account.registry.snowflakecomputing.com/container_hol_db/public/image_repo

docker tag <local_repository>/rapids-nb-snowflake:latest <repository_url>/rapids-nb-snowflake:dev

通过运行以下命令验证新的标记镜像是否存在

docker image list

将镜像推送到 Snowflake

docker push <repository_url>/rapids-nb-snowflake:dev

注意

此步骤需要一些时间,在此过程完成时,我们可以继续下一步来配置并推送 Spec YAML。

docker push 命令完成后,您可以在 Snowflake SQL 工作表中运行以下命令来验证镜像是否存在于您的 Snowflake 镜像仓库中

USE ROLE CONTAINER_USER_ROLE;
CALL SYSTEM$REGISTRY_LIST_IMAGES('/CONTAINER_HOL_DB/PUBLIC/IMAGE_REPO');

配置并推送 Spec YAML#

Snowpark Container Services 使用 YAML 文件定义和配置。支持多种参数配置,请参考Snowpark 容器服务规范参考获取更多信息。

在本地创建以下文件 rapids-snowpark.yaml

spec:
  containers:
    - name: rapids-nb-snowpark
      image: <org-account>.registry.snowflakecomputing.com/container_hol_db/public/image_repo/rapids-nb-snowflake:dev
      volumeMounts:
        - name: rapids-notebooks
          mountPath: /home/rapids/notebooks/workspace
      resources:
        requests:
          nvidia.com/gpu: 1
        limits:
          nvidia.com/gpu: 1
  endpoints:
    - name: jupyter
      port: 8888
      public: true
    - name: dask-client
      port: 8786
      protocol: TCP
    - name: dask-dashboard
      port: 8787
      public: true
  volumes:
    - name: rapids-notebooks
      source: "@volumes/rapids-notebooks"
      uid: 1001 # rapids user's UID
      gid: 1000

注意,我们将 @volumes/rapids-notebooks 内部阶段位置挂载到运行中容器内的 /home/rapids/notebooks/workspace 目录。添加到此目录的任何内容都将持久存在。

我们使用 snow-cli 推送此 yaml 文件

snow stage copy rapids-snowpark.yaml @specs --overwrite --connection CONTAINER_HOL

通过在 Snowflake 工作表中运行以下 SQL 来验证您的 yaml 是否已正确推送

USE ROLE CONTAINER_USER_ROLE;
LS @CONTAINER_HOL_DB.PUBLIC.SPECS;

创建和测试服务#

现在我们已经成功推送了镜像和 spec YAML,我们在 Snowflake 中拥有创建服务所需的所有组件。我们只需要一个服务名称、一个计算池和 spec 文件。在 Snowflake 工作表中运行此 SQL

USE ROLE CONTAINER_USER_ROLE;
CREATE SERVICE CONTAINER_HOL_DB.PUBLIC.rapids_snowpark_service
    in compute pool CONTAINER_HOL_POOL
    from @specs
    specification_file='rapids-snowpark.yaml'
    external_access_integrations = (ALLOW_ALL_EAI);

运行以下命令验证服务是否成功运行。

CALL SYSTEM$GET_SERVICE_STATUS('CONTAINER_HOL_DB.PUBLIC.rapids_snowpark_service');

由于我们将 jupyter 端点指定为公共的,Snowflake 将生成一个可用于通过浏览器访问服务的 URL。要获取 URL,请在 Snowflake SQL 工作表中运行

SHOW ENDPOINTS IN SERVICE RAPIDS_SNOWPARK_SERVICE;

在浏览器中复制 jupyteringress_url。您将看到一个 jupyter lab,其中包含一组用于 RAPIDS 入门的 notebook。

Screenshot of Jupyter Lab with rapids example notebooks directories.

关闭和清理#

如果您不再需要正在运行的服务和计算池,我们可以停止服务并挂起计算池以避免产生任何费用。

在 Snowflake SQL 工作表中运行

USE ROLE CONTAINER_USER_ROLE;
ALTER COMPUTE POOL CONTAINER_HOL_POOL STOP ALL;
ALTER COMPUTE POOL CONTAINER_HOL_POOL SUSPEND;

如果您想完全清理并移除所有创建的对象,请运行以下命令

USE ROLE CONTAINER_USER_ROLE;
ALTER COMPUTE POOL CONTAINER_HOL_POOL STOP ALL;
ALTER COMPUTE POOL CONTAINER_HOL_POOL SUSPEND;

DROP COMPUTE POOL CONTAINER_HOL_POOL;
DROP DATABASE CONTAINER_HOL_DB;
DROP WAREHOUSE CONTAINER_HOL_WH;

USE ROLE ACCOUNTADMIN;
DROP ROLE CONTAINER_USER_ROLE;
DROP EXTERNAL ACCESS INTEGRATION ALLOW_ALL_EAI;

相关示例#

cudf.pandas 和 Snowflake 入门

库/cudf 平台/snowflake

cudf.pandas 和 Snowflake 入门