本教程介绍了如何在 Google Kubernetes Engine (GKE) 上部署和提供 Qwen3-Coder-480B (Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8)(一种混合专家编码模型)。该部署使用多主机 TPU7x (Ironwood) 加速器和 SGLang 服务框架,并采用 TorchTPU (torchtpu) 和预填充-解码 (PD) 解耦。
在本教程所述的部署配置中,您将预配两个多主机 tpu7x-standard-4t 节点池,每个节点池都采用 2x2x2 拓扑(每个节点池包含两个节点,共八个 TPU7x 芯片,总共 16 个 TPU7x 芯片)。您可以使用 Kubernetes LeaderWorkerSet API 执行以下操作:
- 在启用了张量并行处理和专家并行处理的单独 TPU7x 切片上运行分离式多主机预填充和解码服务器。
- 通过 SGLang 解耦路由器路由与 OpenAI 兼容的请求。
目标
- 设置 GKE 集群和多主机 TPU7x 节点池。
- 配置凭证并安装 LeaderWorkerSet 控制器。
- 部署多主机 SGLang 预填充、解码和路由器工作负载。
- 向 SGLang 路由器服务发送推理请求。
- 运行服务基准工作负载。
- 清理。
费用
在本文档中,您将使用Google Cloud的以下收费组件:
如需根据您的预计使用量来估算费用,请使用 [价格计算器](https://cloud.google.com/products/calculator)。
完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理。
准备工作
您需要拥有 Hugging Face 访问令牌才能使用本教程。您可以在 Hugging Face 注册免费账号。拥有账号后,生成访问令牌:
- 在欢迎使用 Hugging Face 页面上,点击您的账号头像,然后选择访问令牌。
- 在访问令牌页面上,点击创建新令牌。
- 选择读取令牌类型,然后输入令牌名称。
- 系统会显示您的访问令牌。将令牌保存在安全的位置。
在 Google Cloud 项目中启用 Kubernetes Engine API、Compute Engine API、Cloud TPU API 和 Artifact Registry API:
确保您的项目在 TPU 容量所在的区域中有足够的磁盘配额和外部 IP 地址配额:
在 Google Cloud 控制台中,前往配额和系统限制页面。
验证您是否至少有 2,800 GiB 的可用 Google Cloud Hyperdisk Balanced 配额,这些配额分布在预填充和解码 Pod 用于模型缓存的四个 700 GiB 临时卷中。
按正在使用的区域级外部 IPv4 地址过滤,并验证目标区域中是否有足够的 IP 地址配额。
如需获得完成本教程所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:
- Kubernetes Engine Admin (
roles/container.admin) - Compute Admin (
roles/compute.admin) - Service Account User (
roles/iam.serviceAccountUser)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
确保您的 Compute Engine 默认服务账号在您的项目中具有以下 Identity and Access Management (IAM) 角色:
- Kubernetes Engine Default Node Service Account
(
roles/container.defaultNodeServiceAccount) - Artifact Registry Reader
(
roles/artifactregistry.reader)
设置环境变量
导出您在本教程中使用的环境变量:
替换以下内容:
YOUR_CLUSTER_NAME:GKE 集群的名称。YOUR_PROJECT_ID:您的 Google Cloud项目的 ID。YOUR_REGION:您要在其中部署集群的区域,例如us-central1。YOUR_ZONE:您要部署 TPU7x 节点池的可用区,例如us-central1-c。YOUR_RESERVATION_NAME:如果您使用的是预留,则为 TPU7x 预留的名称。YOUR_HF_TOKEN:您的 Hugging Face 访问令牌。YOUR_SGLANG_TPU_IMAGE:如果您使用的是自定义 SGLang TorchTPU 容器映像,则为映像的 URI;否则,为默认 SGLang TorchTPU 映像。
创建 GKE 集群
如需在 Standard 模式下创建 GKE 集群,并挂接两个多主机 TPU7x 节点池以实现预填充和解码解耦,请完成以下步骤:
创建一个区域级 GKE 集群,该集群使用
e2-standard-4节点作为默认节点池,为 LeaderWorkerSet 控制器和 SGLang 解耦路由器提供足够的 CPU 和内存资源:创建具有
2x2x2加速器拓扑的高吞吐量工作负载布置政策,这是多主机 TPU7x 节点池所必需的:创建两个多主机 TPU7x 节点池(
tpu7x-pool-0和tpu7x-pool-1),每个节点池包含两个tpu7x-standard-4t节点(每个节点池在2x2x2拓扑中包含 8 个 TPU7x 芯片,共 16 个 TPU7x 芯片):除了使用特定预留之外,您还可以通过传递以下标志,使用 Spot 容量或灵活启动型虚拟机创建节点池:
- Spot 虚拟机:将
--reservation-affinity=specific和--reservation=${RESERVATION}替换为--spot,以使用 Spot 容量。使用 Spot 容量的实例在节点池创建后可能需要一些时间才能创建,并且可能会在工作负载运行期间被抢占。 - 灵活启动型虚拟机:将
--num-nodes=2、--reservation-affinity=specific和--reservation=${RESERVATION}替换为--flex-start、--enable-autoscaling、--num-nodes=0、--min-nodes=0和--max-nodes=2,以使用灵活启动使用选项预配节点池。如需了解详情,请参阅使用 TPU 和灵活启动虚拟机运行小型批量工作负载。
- Spot 虚拟机:将
配置
kubectl凭据以与您的集群通信:
配置凭证并安装 LeaderWorkerSet
如需为多主机 SGLang 部署准备集群,请完成以下步骤:
创建一个名为
hf-secret的 Kubernetes Secret,用于存储您的 Hugging Face 访问令牌:在集群上安装 LeaderWorkerSet CustomResourceDefinition 和控制器:
部署多主机 SGLang 服务器
工作负载清单 (qwen3-coder-480b-multihost-disagg-v7x.yaml) 定义了以下资源,用于在两个 2x2x2 TPU7x 节点池之间协调解耦预填充和解码服务:
- StorageClass (
hyperdisk-balanced-tpu):预配由 Google Cloud Hyperdisk Balanced 存储支持的临时 700 GiB ReadWriteOnce 卷。四个预填充和解码 Pod 中的每一个都会在/data处装载自己的卷,以在本地存储下载的Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8检查点。 - 预填充池(
sglang-prefill-service和sglang-tpu-prefill):运行一个size: 2的 LeaderWorkerSet(一个 Leader Pod 和一个 Worker Pod),该 LeaderWorkerSet 专门固定到一个2x2x2TPU7x 节点池(八个 TPU 芯片,提供 16 个 TensorCore)。LeaderWorkerSet 使用设置为"cloud.google.com/gke-nodepool"的leaderworkerset.sigs.k8s.io/exclusive-topology注解。Pod 会使用--disaggregation-mode=prefill、--tensor-parallel-size=16和--ep-size=16标志启动sglang.launch_server,从而公开 HTTP 端口8000和引导端口8998。 - 解码池(
sglang-decode-service和sglang-tpu-decode):运行固定到第二个2x2x2TPU7x 节点池(8 个 TPU 芯片,提供 16 个 TensorCore)的size: 2LeaderWorkerSet。LeaderWorkerSet 会使用--disaggregation-mode=decode、--tensor-parallel-size=16和--ep-size=16标志启动sglang.launch_server。 - 解耦路由器(
sglang-router和sglang-service):运行一个 CPU Deployment,该 Deployment 使用--pd-disaggregation标志执行sglang_router.launch_router模块,并在端口8000上公开 ClusterIP Service。路由器负责引导提示,并协调sglang-prefill-service和sglang-decode-service服务之间的 KV 缓存传输。
如需部署和监控多主机 SGLang 服务器,请完成以下步骤:
下载工作负载清单:
或者,创建一个名为
qwen3-coder-480b-multihost-disagg-v7x.yaml的文件,其中包含以下内容:将工作负载清单应用到您的集群:
验证是否已创建路由器、预填充和解码 Pod:
所有 Pod 都准备就绪后,输出类似于以下内容:
NAME READY STATUS RESTARTS AGE sglang-router-6d87cb8c7d-gv4wr 1/1 Running 0 39m sglang-tpu-decode-0 1/1 Running 0 40m sglang-tpu-decode-0-1 1/1 Running 0 40m sglang-tpu-prefill-0 1/1 Running 0 40m sglang-tpu-prefill-0-1 1/1 Running 0 40m监控预填充和解码主 Pod 日志,直到启动完成:
首次运行时,初始模型下载、权重加载和编译大约需要 15 到 30 分钟。
如果您使用的是可抢占容量(例如 Spot 容量或灵活启动型虚拟机),则在创建节点池后,TPU 切片节点可能需要更长时间才能创建,并且可能会在工作负载运行期间被抢占。如需了解详情,请参阅抢占式虚拟机实例。 如需检查 TPU 切片节点是否已创建,请参阅检查节点的状态和条件。
等待预填充和解码主 Pod 日志输出以下消息,并且
kubectl get pods在所有 Pod 的READY列中显示1/1:The server is fired up and ready to roll!打开第二个终端会话,并将本地端口
8000转发到sglang-service:让端口转发在此终端会话中保持运行。
发送推理请求
返回到第一个终端会话,然后向 SGLang 路由器公开的 /v1/chat/completions 端点发送聊天补全请求:
运行基准工作负载
如需使用 sglang-router Pod 中的 1,024 个 token 输入和 1,024 个 token 输出 (1k/1k) 工作负载对已部署的 Qwen3-Coder 模型进行基准测试,请运行以下命令:
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生额外的持续费用,请删除以下资源:
删除 SGLang 预填充、解码和路由器工作负载:
删除 TPU7x 节点池、工作负载布置政策和 GKE 集群:
后续步骤
- 详细了解 SGLang。
- 详细了解 TPU7x (Ironwood)。
- 详细了解 Cloud TPU。