Snowflake#
您可以通过 Snowpark Container Services 在 Snowflake 上安装 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;
在浏览器中复制 jupyter
的 ingress_url
。您将看到一个 jupyter lab,其中包含一组用于 RAPIDS 入门的 notebook。

关闭和清理#
如果您不再需要正在运行的服务和计算池,我们可以停止服务并挂起计算池以避免产生任何费用。
在 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;