本教程介绍了如何在Google Cloud上的 Google Kubernetes Engine (GKE) 上部署和应用 DeepSeek-R1 (deepseek-ai/DeepSeek-R1),这是一个拥有 6,710 亿个参数的混合专家模型,其中包含 370 亿个活跃参数。该部署使用 Cluster Toolkit、两个多主机 A4 (a4-highgpu-8g) 虚拟机 (VM) 实例(总共 16 个 NVIDIA B200 GPU)以及 vLLM 部署框架。
在本教程中介绍的部署配置中,您将使用 Cluster Toolkit 在标准模式下预配 GKE 集群。该集群有两个通过 GPUDirect 远程直接内存访问 (RDMA) 网络连接的 a4-highgpu-8g 节点。然后,您将模型权重暂存在 Cloud Storage 中,并使用 Kubernetes JobSet API 和 Ray,通过张量并行、专家并行和 FP8 KV 缓存,在所有 16 个 NVIDIA B200 GPU 上提供模型。
目标
- 安装 Cluster Toolkit,并以标准模式预配多主机 A4 GKE 集群。
- 将 DeepSeek-R1 模型权重暂存在 Cloud Storage 存储桶中。
- 使用 JobSet 和 Ray 在两个 A4 节点上部署多主机 vLLM 推理服务器,总共使用 16 个 NVIDIA B200 GPU。
- 向 vLLM 服务器发送对话补全请求。
- 运行服务基准工作负载。
- 清理已部署的资源。
费用
在本文档中,您将使用Google Cloud的以下收费组件:
如需根据您的预计使用量来估算费用,请使用价格计算器。
准备工作
为本教程设置环境:
- 安装并初始化 Google Cloud CLI,然后安装
kubectl。如果您使用 Cloud Shell,则这两个工具均已预安装。 - 如果您是在 Linux 或 macOS 工作站(而非 Cloud Shell)中运行本教程,请安装所需的 Cluster Toolkit 依赖项(例如 Terraform 和 Git)。
在 Google Cloud 项目中启用 Kubernetes Engine API、Compute Engine API、Cloud Storage API、Artifact Registry API 和 Service Usage API:
获取 Hugging Face 访问令牌
您需要拥有 Hugging Face 访问令牌才能使用本教程。您可以在 Hugging Face 注册免费账号。拥有账号后,生成访问令牌:
- 在欢迎使用 Hugging Face 页面上,点击您的账号头像,然后选择访问令牌。
- 在访问令牌页面上,点击创建新令牌。
- 选择读取令牌类型,然后输入令牌名称。
- 系统会显示您的访问令牌。将令牌保存在安全的位置。
所需的角色
如需获得完成本教程所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:
- Kubernetes Engine Admin (
roles/container.admin) - Compute Admin (
roles/compute.admin) - Storage Admin (
roles/storage.admin) - Project IAM Admin (
roles/resourcemanager.projectIamAdmin) - Service Account Admin (
roles/iam.serviceAccountAdmin) - Service Account User (
roles/iam.serviceAccountUser) - Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
设置环境变量
为本教程设置身份验证和环境变量:
设置身份验证:
导出您在本教程中使用的环境变量:
替换以下内容:
YOUR_PROJECT_ID:您的Google Cloud 项目的 ID。YOUR_REGION:A4 容量所在的计算区域,以及您要部署集群的位置,例如us-central1。YOUR_ZONE:A4 容量所在的计算可用区,例如us-central1-b。YOUR_CLUSTER_NAME:GKE 集群和 Cluster Toolkit 部署的名称。请使用不超过 20 个字符的名称,以便生成的节点池服务账号 ID (YOUR_CLUSTER_NAME-gke-np-sa) 保持在 30 个字符的 Identity and Access Management (IAM) 限制范围内。YOUR_RESERVATION_NAME:A4 预留的名称,或格式为RESERVATION_NAME/reservationBlocks/RESERVATION_BLOCK_NAME的扩展预留块路径。YOUR_HF_TOKEN:您的 Hugging Face 访问令牌。YOUR_GCS_BUCKET:用于暂存模型权重的 Cloud Storage 存储桶的全球唯一名称。该脚本还会将TERRAFORM_BUCKET设置为YOUR_GCS_BUCKET-tf-state,以存储 Cluster Toolkit 的 Terraform 状态。
该脚本还会将
CLUSTER_TOOLKIT_VERSION设置为v1.104.0,以指定要安装的 Cluster Toolkit 版本。 Cluster Toolkitv1.104.0版及更高版本包含examples/gke-a4/gke-a4-deployment.yaml的内置容量消耗选项。在v1.104.0之前的版本中,您必须手动添加这些容量选项。
创建 GKE 集群
下载 Cluster Toolkit,并在 Standard 模式下预配一个 GKE 集群,该集群具有两个 a4-highgpu-8g 节点、GPUDirect RDMA 网络和 JobSet 控制器:
下载并解压缩
CLUSTER_TOOLKIT_VERSION(v1.104.0) 中指定的版本的预构建 Cluster Toolkit 软件包,将工作目录更改为cluster-toolkit目录,然后验证二进制文件版本:(可选)查看 Cluster Toolkit 中的可用命令和标志:
创建 Cloud Storage 存储桶,用于存储 Cluster Toolkit 部署的 Terraform 状态:
为两个
a4-highgpu-8g节点创建examples/gke-a4/gke-a4-deployment.yaml部署配置文件:默认情况下,
examples/gke-a4/gke-a4.yaml蓝图配置为使用特定预留。如果您没有特定预留,则可以在部署集群之前修改examples/gke-a4/gke-a4.yaml,以使用以下使用选项之一:- Spot 容量:确保您的项目具有足够的 GPU、磁盘和 CPU 可抢占配额。在
examples/gke-a4/gke-a4.yaml的底部,注释掉--- Option 1: Specific Reservation ---部分,并取消注释--- Option 4: Spot ---部分。 - 灵活启动型虚拟机:确保您的项目有足够的抢占式配额来满足 GPU、磁盘和 CPU 的需求。在
examples/gke-a4/gke-a4.yaml的底部,注释掉--- Option 1: Specific Reservation ---部分,并取消注释--- Option 2: DWS Flex Start ---部分。
- Spot 容量:确保您的项目具有足够的 GPU、磁盘和 CPU 可抢占配额。在
使用
gcluster deploy命令部署 GKE 集群:创建集群大约需要 30 到 45 分钟。如果您在没有
--auto-approve标志的情况下运行./gcluster deploy,则在系统提示时输入a,以应用建议的更改。部署完成后,输出会以类似于以下内容的消息结尾:Apply complete! Resources: 80 added, 0 changed, 0 destroyed.配置
kubectl凭据以与您的集群通信:
在 Cloud Storage 中暂存模型权重
将 DeepSeek-R1 权重下载到其中一个 A4 节点的本地 SSD,并将其传输到 Cloud Storage 存储桶,以便在节点之间快速流式传输:
下载模型下载作业、vLLM 推理服务器和基准 Pod 的 Kubernetes 清单文件:
创建具有统一存储桶级访问权限的 Cloud Storage 存储桶,以存储模型权重:
向默认 Kubernetes 服务账号、默认 Compute Engine 服务账号和集群节点池服务账号 (
${CLUSTER_NAME}-gke-np-sa) 授予存储桶的 IAM 权限:上述脚本授予的 IAM 权限包括 Storage Legacy Bucket Reader 角色 (
roles/storage.legacyBucketReader),这是--load-format runai_streamer所必需的。创建一个名为
hf-secret的 Kubernetes Secret,用于存储您的 Hugging Face 访问令牌:查看
download_model.yaml清单,如果您之前未下载该文件,请在本地创建该文件:将您的 Cloud Storage 存储桶名称替换到
download_model.yaml清单中,然后启动模型下载作业:等待下载 Pod 启动,然后流式传输作业日志:
将模型下载到节点的本地 NVMe SSD 并将权重上传到 Cloud Storage 存储桶大约需要 30 到 40 分钟。
作业完成后,验证 Cloud Storage 存储桶中是否存在所有 163 个
.safetensors分片:删除已完成的暂存作业:
部署多主机 vLLM 服务器
工作负载清单 (deepseek_r1_server.yaml) 定义了一个 ClusterIP Service (vllm-r1-leader) 和一个 Kubernetes JobSet (vllm-r1),用于协调两个 a4-highgpu-8g 节点上的多主机服务:
- Leader (
leader):在一个具有 8 个 NVIDIA B200 GPU 的 A4 节点上运行一个副本,获取 NCCL/gIB 环境 (/usr/local/gib/scripts/set_nccl_env.sh),在端口6379上启动 Ray 头节点(针对双节点集群),并在 HTTP 端口8080上启动vllm serve。服务器使用--load-format runai_streamer直接从gs://$MODEL_BUCKET/DeepSeek-R1流式传输权重,并从装载的 Cloud Storage FUSE 卷(位于/models/DeepSeek-R1)加载分词器。--tensor-parallel-size 16、--pipeline-parallel-size 1、--distributed-executor-backend ray、--enable-expert-parallel、--kv-cache-dtype fp8_e4m3、--async-scheduling和 CUDA 图 (FULL_AND_PIECEWISE) 均可运行。 - 工作器 (
worker):在第二个 A4 节点上运行一个无头副本,该节点配备 8 个 NVIDIA B200 GPU,配置 NCCL/gIB,并加入位于vllm-r1-leader:6379的领导者 Ray 集群。
部署和监控多主机 vLLM 服务器:
查看
deepseek_r1_server.yaml清单,如果您之前未下载该文件,请在本地创建该文件:如需将此部署扩缩到更多主机,请更新
deepseek_r1_server.yaml中的参数。例如,如需扩缩到 4 个 A4 节点(总共 32 个 NVIDIA B200 GPU),请在worker复制的作业下设置replicas: 3,并按如下方式更新主节点参数:--ray_cluster_size=4--tensor-parallel-size=16--pipeline-parallel-size=2
将 Cloud Storage 存储桶名称替换为
deepseek_r1_server.yaml,并将清单应用于集群:监控 Leader Pod 和 Worker Pod 日志,直到服务器启动完成:
由于
kubectl logs -f会在前台流式传输日志,因此如果您想同时监控两个 Pod,请在单独的终端会话中运行工作器日志命令。如需随时停止流式传输日志,请按 Control+C。初始权重流式传输、模型加载和 CUDA 图捕获大约需要 15 到 20 分钟。在发送请求之前,请等待领导者 Pod 日志输出以下消息:
(APIServer pid=1) INFO: Started server process [1] (APIServer pid=1) INFO: Waiting for application startup. (APIServer pid=1) INFO: Application startup complete.
发送推理请求
向已部署的 vLLM 服务器发送对话补全请求:
在后台将本地端口
8080转发到vllm-r1-leaderService:向
/v1/chat/completions端点发送对话补全请求:
运行基准工作负载
使用 vllm bench serve 对已部署的 DeepSeek-R1 服务器进行基准测试,配置为 8,192 个输入词元和 1,024 个输出词元 (8k/1k):
查看
deepseek_r1_8k_1k.yaml清单,如果您之前未下载该文件,请在本地创建该文件:清单指定了 8,192 个输入词元、1,024 个输出词元、1,280 个提示,以及 112 的最大并发数。
应用
deepseek_r1_8k_1k.yaml清单:等待
vllm-bench-8k-1kPod 启动,然后流式传输基准日志:基准测试大约需要 15 分钟才能完成。基准测试完成后,查找包含如下指标的输出:
Output token throughputTotal token throughputTTFTTPOT
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生额外的持续费用,请删除 Kubernetes 工作负载、GKE 集群和 Cloud Storage 存储桶:
删除基准 Pod、vLLM 服务器 JobSet 和 Service、模型下载 Job 以及 Hugging Face Secret:
删除存储暂存模型权重的 Cloud Storage 存储桶:
在
cluster-toolkit目录中,使用gcluster destroy命令销毁 GKE 集群及其关联的基础设施:删除存储 Terraform 状态的 Cloud Storage 存储桶:
后续步骤
- 详细了解 vLLM。
- 详细了解具有 NVIDIA B200 GPU 的 A4 虚拟机。
- 详细了解 Cluster Toolkit。
- 详细了解如何管理 AI 优化型 GKE 集群。