本教程介绍了如何在 Google Kubernetes Engine (GKE) 上部署和提供 Qwen3.5-397B (Qwen/Qwen3.5-397B-A17B-FP8)(一种混合专家模型)。该部署使用多主机 TPU7x (Ironwood) 加速器和 vLLM TPU 服务框架,并采用 TorchTPU (torchtpu) 和预填充-解码 (PD) 解耦。
在此配置中,您需要预配两个多主机 tpu7x-standard-4t 节点池,每个节点池都采用 2x2x2 拓扑(每个节点池包含两个节点,每个节点有 8 个 TPU7x 芯片,总共 16 个 TPU7x 芯片)。您可以使用 Kubernetes JobSet API 和 Ray 在单独的 TPU7x 切片上运行解耦的多主机预填充和解码服务器,并启用数据并行和专家并行,然后通过解耦代理路由请求。
目标
- 设置 GKE 集群和多主机 TPU7x 节点池。
- 将模型权重暂存在 Cloud Storage 存储桶中。
- 使用 JobSet 部署多主机 vLLM TorchTPU 预填充、解码和代理服务器。
- 运行服务基准工作负载并分析结果。
- 清理。
费用
在本文档中,您将使用Google Cloud的以下收费组件:
如需根据您的预计使用量来估算费用,请使用价格计算器。
完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理。
准备工作
您需要拥有 Hugging Face 访问令牌才能使用本教程。您可以在 Hugging Face 注册免费账号。拥有账号后,生成访问令牌:
- 在欢迎使用 Hugging Face 页面上,点击您的账号头像,然后选择访问令牌。
- 在访问令牌页面上,点击创建新令牌。
- 选择读取令牌类型,然后输入令牌名称。
- 系统会显示您的访问令牌。将令牌保存在安全的位置。
在 Google Cloud 项目中启用 Kubernetes Engine API:
安装并初始化 Google Cloud CLI,然后安装
kubectl。如果您使用 Cloud Shell,则这两个工具均已预安装。确保您的项目在 TPU 容量所在的区域中有足够的 SSD 配额和外部 IP 地址配额:
在 Google Cloud 控制台中,前往配额和系统限制页面。
按永久性磁盘 SSD (GB) 过滤,并验证您在目标区域中是否有足够的可用 SSD 配额。
按正在使用的区域级外部 IPv4 地址过滤,并验证目标区域中是否有足够的 IP 地址配额。
如需获得完成本教程所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:
- Kubernetes Engine Admin (
roles/container.admin) - Compute Admin (
roles/compute.admin) - Storage Admin (
roles/storage.admin) - Service Account User (
roles/iam.serviceAccountUser)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
设置环境变量
设置身份验证:
导出您在本教程中使用的环境变量:
替换以下内容:
YOUR_PROJECT_ID:您的Google Cloud 项目的 ID。YOUR_REGION:您要在其中部署集群的区域,例如us-central1。YOUR_ZONE:您要在其中部署 TPU7x 节点池的可用区,例如us-central1-c。YOUR_CLUSTER_NAME:GKE 集群的名称。YOUR_RESERVATION_NAME:TPU 预留的名称(如果您使用的是预留)。YOUR_GCS_BUCKET:用于暂存模型权重的 Cloud Storage 存储桶的名称。YOUR_HF_TOKEN:您的 Hugging Face 访问令牌。YOUR_VLLM_IMAGE:要使用的 vLLM TorchTPU 映像。如需了解公开映像,请参阅 vLLM TorchTPU 代码库。
创建 GKE 集群
如需在 Standard 模式下创建 GKE 集群,并挂接两个多主机 TPU7x 节点池以实现预填充和解码解耦,请完成以下步骤:
创建启用了 Workload Identity Federation for GKE 的区域级 GKE 集群:
输出类似于以下内容:
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS STACK_TYPE asq-v7x us-central1 1.35.7-gke.1027000 35.226.172.84 e2-standard-4 1.35.7-gke.1027000 3 RUNNING IPV4创建具有
2x2x2加速器拓扑的高吞吐量工作负载布置政策,这是多主机 TPU7x 节点池所必需的:创建两个多主机 TPU7x 节点池(
np-0和np-1),每个节点池包含两个tpu7x-standard-4t节点(每个节点池在2x2x2拓扑中包含 8 个 TPU7x 芯片,总共 16 个 TPU7x 芯片):本教程使用 Spot 容量 (
--spot)。使用 Spot 容量的实例在节点池创建后可能需要一些时间才能创建,并且可能会在工作负载运行期间被抢占。您还可以通过传递以下标志,使用预留或灵活启动型虚拟机创建节点池:- 特定预留:将
--spot标志替换为--reservation-affinity=specific和--reservation=RESERVATION_NAME标志,其中RESERVATION_NAME是 GKE 在创建节点池时使用的预留的名称。如需详细了解 TPU 预留,请参阅 Cloud TPU 预留简介。 - 灵活启动型虚拟机:将
--spot和--num-nodes=2标志替换为--flex-start、--reservation-affinity=none、--enable-autoscaling、--num-nodes=0、--min-nodes=0和--max-nodes=2标志,以使用灵活启动使用选项预配节点池。如需了解详情,请参阅使用 TPU 和灵活启动虚拟机运行小型批量工作负载。
每个节点池的输出类似于以下内容:
NAME MACHINE_TYPE DISK_SIZE_GB NODE_VERSION np-0 tpu7x-standard-4t 100 1.35.7-gke.1027000- 特定预留:将
配置
kubectl凭据以与您的集群通信:
在 Cloud Storage 中暂存模型权重
在 Cloud Storage 存储桶中暂存模型权重,以便工作负载运行:
创建具有统一存储桶级访问权限的 Cloud Storage 存储桶:
向默认 Compute Engine 服务账号和默认 Kubernetes 服务账号授予存储桶的 Identity and Access Management (IAM) 权限:
创建一个名为
hf-secret的 Kubernetes Secret,用于存储您的 Hugging Face 访问令牌:提取
download_model.yaml配置:或者,您也可以选择创建一个名为
download_model.yaml的文件,其中包含以下内容:将模型权重下载到暂存卷,并将其转移到 Cloud Storage 存储桶:
此步骤大约需要 30 到 40 分钟才能完成。
作业完成后,验证所有 163 个
.safetensors分片是否都在 Cloud Storage 存储桶中:删除已完成的暂存作业:
等待 Pod 启动并监控下载作业日志:
部署多主机 vLLM TorchTPU 服务器
工作负载清单 (v7x_qwen3_5_server_multihost_slice.yaml) 定义了一个 Kubernetes JobSet 资源 (vllm-qwen3-5-397b-pd-disagg-v7x),其中包含三个复制的作业,这些作业在两个 2x2x2 TPU7x 节点池中协调解耦预填充和解码服务:
- 预填充服务器 (
prefill):在一个2x2x2TPU7x 节点池中运行两个副本(两个tpu7x-standard-4t节点,每个主机有四个双核芯片,总共 16 个 TPU 核心)。这些 Pod 构成一个双节点 Ray 集群,并在端口8000上为Qwen/Qwen3.5-397B-A17B-FP8启动 vLLM TorchTPU,其中--data-parallel-size=16、--tensor-parallel-size=1、--enable-expert-parallel、--load-format=runai_streamer和TPURaidenConnector配置为kv_producer。 - 解码服务器 (
decode):在第二个2x2x2TPU7x 节点池(共 16 个 TPU 核心)中运行两个副本,并在cloud.google.com/gke-nodepool上使用 Pod 亲和性和反亲和性规则,将预填充和解码隔离到不同的节点池中。这些 Pod 构成一个双节点 Ray 集群,并在端口7200上启动 vLLM TorchTPU,其中 TPURaidenConnector 配置为kv_consumer。 - 解耦代理 (
proxy):在端口10000上运行toy_proxy_server.py,以协调预填充服务器(端口8000)和解码服务器(端口7200)之间的请求路由和 KV 缓存传输。
如需部署和监控解耦式 vLLM 服务器,请完成以下步骤:
在集群上安装 Kubernetes JobSet CustomResourceDefinition 和控制器:
提取服务器清单:
或者,您也可以创建一个名为
v7x_qwen3_5_server_multihost_slice.yaml的文件,其中包含以下内容:将您的 Cloud Storage 存储桶名称替换为
v7x_qwen3_5_server_multihost_slice.yaml,然后应用清单:此配置使用一个
2x2x2TPU7x 切片(两个节点)进行预填充,使用一个2x2x2TPU7x 切片(两个节点)进行解码。如需扩缩任一池中的节点数,请更新replicas字段 (replicas: NUM_NODES)。监控预填充和解码 Pod 日志,直到应用启动完成:
首次运行时,初始模型加载和编译大约需要 30 到 45 分钟。
如果您使用的是可抢占容量(例如 Spot 虚拟机或灵活启动型虚拟机),则在创建节点池后,TPU 切片节点可能需要更长时间才能创建,并且在工作负载运行期间可能会被抢占。如需了解详情,请参阅抢占式虚拟机实例。如需检查 TPU 切片节点是否已创建,请参阅检查节点的状态和条件。
等待预填充和解码服务器日志报告
Application startup complete,然后再运行基准测试:(APIServer pid=1) INFO: Started server process [1] (APIServer pid=1) INFO: Waiting for application startup. (APIServer pid=1) INFO: Application startup complete.
运行基准工作负载
如需使用 8,192 个词元的输入和 1,024 个词元的输出 (8k/1k) 工作负载,针对解耦代理对已部署的 Qwen3.5-397B 模型进行基准测试,请完成以下步骤:
提取基准清单:
或者,您也可以创建一个名为
v7x_qwen3_5_benchmark_multihost_slice.yaml的文件,其中包含以下内容:应用基准作业清单,并等待基准 Pod 准备就绪:
监控基准作业日志:
清理
为避免因本教程中使用的资源而导致您的 Google Cloud 账号产生费用,请删除 Kubernetes 工作负载、TPU7x 节点池、GKE 集群和 Cloud Storage 存储桶:
删除 Kubernetes 工作负载:
删除 TPU7x 节点池、工作负载布置政策和 GKE 集群:
(可选)删除存储暂存模型权重的 Cloud Storage 存储桶:
后续步骤
- 详细了解 Cloud TPU 上的 vLLM。
- 详细了解 TPU7x (Ironwood)。
- 详细了解 Cloud TPU。