本教程介绍了如何在 Google Kubernetes Engine (GKE) 上部署和提供 Qwen3-Coder-30B-A3B (Qwen/Qwen3-Coder-30B-A3B-Instruct-FP8)(一种混合专家编码模型)。该部署使用多主机 TPU v6e (Trillium) 加速器和 SGLang 应用框架,并采用 TorchTPU (torchtpu) 和预填充-解码 (PD) 解耦。
在本教程所述的部署配置中,您将预配两个多主机 ct6e-standard-4t 节点池,每个节点池都采用 2x4 拓扑(每个节点池包含两个节点,每个节点包含 8 个 TPU v6e 芯片,总共 16 个 TPU v6e 芯片)。您可以使用 Kubernetes LeaderWorkerSet API 执行以下操作:
- 在启用了张量并行处理和专家并行处理的单独 TPU v6e 切片上运行分离式多主机预填充和解码服务器。
- 通过 SGLang 解耦路由器路由请求。
如需在 TPU7x (Ironwood) 加速器上使用更大的 Qwen3-Coder-480B 模型运行类似的多主机 SGLang TorchTPU 部署工作流,请参阅在 GKE 上使用多主机 SGLang TorchTPU 和 TPU7x 加速器上的 PD 分离部署 Qwen3-Coder-480B。
目标
- 设置 GKE 集群和多主机 TPU v6e 节点池。
- 配置凭证并安装 LeaderWorkerSet 控制器。
- 部署多主机 SGLang 预填充、解码和路由器工作负载。
- 向 SGLang 路由器服务发送推理请求。
- 运行服务基准工作负载。
- 清理。
费用
在本文档中,您将使用Google Cloud的以下收费组件:
如需根据您的预计使用量来估算费用,请使用价格计算器。
完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理。
准备工作
为本教程设置环境:
安装并初始化 Google Cloud CLI,然后安装
kubectl。如果您使用 Cloud Shell,则这两个工具都已预安装。在 Google Cloud 项目中启用 Kubernetes Engine API、Compute Engine API、Cloud TPU API 和 Artifact Registry API:
确保您的项目在 TPU 容量所在的区域中有足够的磁盘配额和外部 IP 地址配额:
在 Google Cloud 控制台中,前往配额和系统限制页面。
验证您是否至少有 400 GiB 的可用 Google Cloud Hyperdisk Balanced 配额,这些配额分布在预填充和解码 Pod 用于模型缓存的四个 100 GiB 临时卷中。
按正在使用的区域级外部 IPv4 地址过滤,并验证目标区域中是否有足够的 IP 地址配额。
获取 Hugging Face 访问令牌
您需要拥有 Hugging Face 访问令牌才能使用本教程。您可以在 Hugging Face 注册免费账号。拥有账号后,生成访问令牌:
- 在欢迎使用 Hugging Face 页面上,点击您的账号头像,然后选择访问令牌。
- 在访问令牌页面上,点击创建新令牌。
- 选择读取令牌类型,然后输入令牌名称。
- 系统会显示您的访问令牌。将令牌保存在安全的位置。
所需的角色
如需获得完成本教程所需的权限,请让您的管理员为您授予项目的以下 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:您要部署 TPU v6e 节点池的可用区,例如us-central1-b。YOUR_RESERVATION_NAME:如果您使用的是预留,则为 TPU v6e 预留的名称。YOUR_HF_TOKEN:您的 Hugging Face 访问令牌。
如果您使用的是自定义 SGLang TorchTPU 容器映像,请将 SGLANG_IMAGE 变量中的 lmsysorg/sglang:v0.1.0-tpu 替换为映像的 URI。
创建 GKE 集群
如需在 Standard 模式下创建 GKE 集群,并挂接两个多主机 TPU v6e 节点池以实现预填充和解码解耦,请完成以下步骤:
创建一个区域级 GKE 集群,该集群使用
e2-standard-4节点作为默认节点池,为 LeaderWorkerSet 控制器和 SGLang 解耦路由器提供充足的 CPU 和内存资源:创建两个多主机 TPU v6e 节点池,每个节点池包含两个
ct6e-standard-4t节点(每个节点池在2x4拓扑中包含 8 个 TPU v6e 芯片,总共 16 个 TPU v6e 芯片):您也可以使用 Spot 容量或灵活启动型虚拟机创建节点池,而不是使用特定预留:
Spot 虚拟机
通过将
--reservation-affinity=specific和--reservation="${RESERVATION}"标志替换为--spot标志,预配使用 Spot 容量的节点池:使用 Spot 容量的实例在节点池创建后可能需要一些时间才能创建,并且可能会在工作负载运行期间被抢占。
灵活启动型虚拟机
使用灵活启动使用选项预配节点池:
如需了解详情,请参阅使用 TPU 和灵活启动虚拟机运行小型批量工作负载。
配置
kubectl凭据以与您的集群通信:
配置凭证并安装 LeaderWorkerSet
如需为多主机 SGLang 部署准备集群,请完成以下步骤:
创建一个名为
hf-secret的 Kubernetes Secret,用于存储您的 Hugging Face 访问令牌:在集群上安装 LeaderWorkerSet CustomResourceDefinition 和控制器:
部署多主机 SGLang 服务器
工作负载清单 (qwen3-coder-30b-multihost-disagg-v6e-2x4.yaml) 定义了以下资源,用于在两个 2x4 TPU v6e 节点池中协调解耦预填充和解码服务:
StorageClass (
hyperdisk-balanced-tpu):预配由 Google Cloud Hyperdisk Balanced 存储支持的临时 100 GiB ReadWriteOnce 卷。四个预填充和解码 Pod 中的每一个都会在/data处装载自己的卷,以在本地存储下载的Qwen/Qwen3-Coder-30B-A3B-Instruct-FP8检查点。预填充池(
sglang-prefill-service和sglang-tpu-prefill):运行一个 LeaderWorkerSet,其中包含一个 Leader Pod 和一个 Worker Pod,专门固定到一个2x4TPU v6e 节点池。此节点池有 8 个 TPU 芯片,可提供 8 个 TensorCore。LeaderWorkerSet 使用设置为"cloud.google.com/gke-nodepool"的leaderworkerset.sigs.k8s.io/exclusive-topology注解。Pod 使用以下标志启动sglang.launch_server,从而公开端口8000和引导端口8998:--disaggregation-mode=prefill--tensor-parallel-size=8--ep-size=8
解码池(
sglang-decode-service和sglang-tpu-decode):运行固定到第二个2x4TPU v6e 节点池(八个 TPU 芯片,提供八个 TensorCore)的size: 2LeaderWorkerSet。LeaderWorkerSet 使用以下标志启动sglang.launch_server:--disaggregation-mode=decode--tensor-parallel-size=8--ep-size=8
解聚路由器(
sglang-router和sglang-service):运行一个 CPU 部署,该部署使用--pd-disaggregation标志执行sglang_router.launch_router模块,并在端口8000上公开 ClusterIP Service。路由器负责引导提示,并协调sglang-prefill-service和sglang-decode-service服务之间的 KV 缓存传输。
如需部署和监控多主机 SGLang 服务器,请完成以下步骤:
下载工作负载清单:
或者,创建一个名为
qwen3-coder-30b-multihost-disagg-v6e-2x4.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 日志,直到启动完成:
首次运行时,初始模型下载、权重加载和编译大约需要 7 到 10 分钟。
如果您使用的是可抢占容量(例如 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 个词元的输入和 1,024 个词元的输出 (1k/1k) 工作负载对已部署的 Qwen3-Coder-30B-A3B 模型进行基准测试,请运行以下命令:
基准测试完成后,查找包含如下指标的输出:
Output token throughput
Total token throughput
TTFT
TPOT
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生额外的持续费用,请删除以下资源:
删除 SGLang 预填充、解码和路由器工作负载:
删除 TPU v6e 节点池和 GKE 集群:
后续步骤
- 详细了解 SGLang。
- 详细了解 TPU v6e (Trillium)。
- 详细了解 Cloud TPU。
如未另行说明,那么本页面中的内容已根据知识共享署名 4.0 许可获得了许可,并且代码示例已根据 Apache 2.0 许可获得了许可。有关详情,请参阅 Google 开发者网站政策。Java 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2026-11-03。