最佳实践:基于 LeaderWorkerSet 的宽专家并行 (EP/DP)
概览
本指南演示了如何使用 vLLM 的 P/D 分离支持以及 NIXL,在 LeaderWorkerSets 的宽专家并行模式下部署 DeepSeek-R1-0528。本指南已在以下环境验证:
- 一个带有 InfiniBand 网络的 32xH200 集群
- 一个在 GKE 上带有 RoCE 网络的 32xH200 集群
- 一个在 GKE 上带有 RoCE 网络的 32xB200 集群
警告:我们仍在针对其他硬件和网络配置进行调查与性能优化
在此示例中,我们将演示 DeepSeek-R1-0528 的部署,配置如下:
- 1 DP=16 Prefill(预填充)工作负载
- 1 DP=16 Decode(解码)工作负载
硬件要求
本指南需要 32 块 Nvidia H200 或 B200 GPU 以及 InfiniBand 或 RoCE RDMA 网络。请查看 modelserver/base/decode.yaml 和 modelserver/base/prefill.yaml 了解详细的资源需求。
先决条件
-
请在本地系统中安装适当的客户端工具以使用本指南。
-
确保您的集群基础设施足以部署大规模推理
- 您必须拥有高速加速器间网络
- 利用节点间 EP(专家并行)的 Pod 必须部署在同一个网络域内
- 您已部署 LeaderWorkerSet 可选控制器
-
配置并部署您的 Gateway 控制平面。
-
在系统中安装 监控栈。
-
为安装创建一个命名空间。
export NAMESPACE=llm-d-wide-ep # or any other namespace (shorter names recommended)
kubectl create namespace ${NAMESPACE} -
在目标命名空间中创建名为 `llm-d-hf-token` 的 Secret,其键为 `HF_TOKEN`,并匹配有效的 HuggingFace 令牌以拉取模型。
安装
cd guides/wide-ep-lws/
部署模型服务器
GKE 和 CoreWeave 是此最佳实践路径中经过测试的 Kubernetes 提供商。如果您在其他 Kubernetes 提供商上运行,可以自定义清单。
- GKE (H200)
- GKE (B200)
- CoreWeave
GKE (H200)
kubectl apply -k ./manifests/modelserver/gke -n ${NAMESPACE}
GKE (B200)
# Deploy on GKE for B200 on the a4 instance type to work around a known vLLM memory issue
kubectl apply -k ./manifests/modelserver/gke-a4 -n ${NAMESPACE}
CoreWeave
kubectl apply -k ./manifests/modelserver/coreweave -n ${NAMESPACE}
部署推理池 (InferencePool)
使用下方的选项卡选择特定提供商的 Helm 命令。
- GKE
- Istio
- Kgateway
GKE
helm install llm-d-infpool \
-n ${NAMESPACE} \
-f ./manifests/inferencepool.values.yaml \
--set "provider.name=gke" \
--set "inferenceExtension.monitoring.gke.enable=true" \
oci://us-central1-docker.pkg.dev/k8s-staging-images/gateway-api-inference-extension/charts/inferencepool \
--version v1.2.0
Istio
helm install llm-d-infpool \
-n ${NAMESPACE} \
-f ./manifests/inferencepool.values.yaml \
--set "provider.name=istio" \
--set "inferenceExtension.monitoring.prometheus.enable=true" \
oci://us-central1-docker.pkg.dev/k8s-staging-images/gateway-api-inference-extension/charts/inferencepool \
--version v1.2.0
Kgateway
helm install llm-d-infpool \
-n ${NAMESPACE} \
-f ./manifests/inferencepool.values.yaml \
oci://us-central1-docker.pkg.dev/k8s-staging-images/gateway-api-inference-extension/charts/inferencepool \
--version v1.2.0
部署 Gateway 和 HTTPRoute
使用 gateway recipe 部署 Gateway 和 HTTPRoute。
Gateway 选项
要查看支持哪些 Gateway 选项,请参考我们的 Gateway 提供商先决条件文档。每个提供商的 Gateway 配置都在 gateway-configurations 目录中进行跟踪。
您还可以自定义 Gateway,更多信息请参阅我们的 Gateway 自定义文档。
调优选择性 PD
与 PD 一样,wide-ep-lws 指南支持选择性 PD。有关此方面的信息,请参阅 PD 文档的这一部分。
验证安装
- 首先,您应该能够列出安装在所选命名空间中的所有 Helm Release
helm list -n ${NAMESPACE}
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
llm-d-infpool llm-d-wide-ep 1 2025-08-24 13:14:53.355639 -0700 PDT deployed inferencepool-v1.0 v0.3.0
- 在此示例的默认配置下,您应该拥有以下资源(如果使用 Istio)
kubectl get all -n ${NAMESPACE}
NAME READY STATUS RESTARTS AGE
pod/infra-wide-ep-inference-gateway-istio-74d5c66c86-h5mfn 1/1 Running 0 2m22s
pod/wide-ep-llm-d-decode-0 2/2 Running 0 2m13s
pod/wide-ep-llm-d-decode-0-1 2/2 Running 0 2m13s
pod/llm-d-infpool-epp-84dd98f75b-r6lvh 1/1 Running 0 2m14s
pod/wide-ep-llm-d-prefill-0 1/1 Running 0 2m13s
pod/wide-ep-llm-d-prefill-0-1 1/1 Running 0 2m13s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/infra-wide-ep-inference-gateway-istio ClusterIP 10.16.1.34 10.16.4.2 15021:30312/TCP,80:33662/TCP 2m22s
service/wide-ep-ip-1e480070 ClusterIP None <none> 54321/TCP 2d4h
service/wide-ep-llm-d-decode ClusterIP None <none> <none> 2m13s
service/llm-d-infpool-epp ClusterIP 10.16.1.137 <none> 9002/TCP 2d4h
service/wide-ep-llm-d-prefill ClusterIP None <none> <none> 2m13s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/infra-wide-ep-inference-gateway-istio 1/1 1 1 2m22s
deployment.apps/llm-d-infpool-epp 1/1 1 1 2m14s
NAME DESIRED CURRENT READY AGE
replicaset.apps/infra-wide-ep-inference-gateway-istio-74d5c66c86 1 1 1 2m22s
replicaset.apps/llm-d-infpool-epp-55bb9857cf 1 1 1 2m14s
NAME READY AGE
statefulset.apps/wide-ep-llm-d-decode 1/1 2m13s
statefulset.apps/wide-ep-llm-d-decode-0 1/1 2m13s
statefulset.apps/wide-ep-llm-d-prefill 1/1 2m13s
statefulset.apps/wide-ep-llm-d-prefill-1 1/1 2m13s
注意: 这假设您的 ${NAMESPACE} 中没有其他指南部署,并且您没有通过 ${RELEASE_NAME} 环境变量更改默认 Release 名称。
使用该组件栈
有关开始发起推理请求的说明,请参阅 我们的文档
注意: 此示例特别受益于使用 getting-started-inferencing 文档中描述的 stern,因为虽然我们只有 3 个推理 Pod,但它包含 16 个 vLLM 服务器或 Rank。
注意: 与其他示例相比,此示例的 vLLM API 服务器启动大约需要 7-10 分钟,因此在与此示例交互之前可能需要等待更长时间。
清理
移除部署
# From examples/wide-ep-lws
helm uninstall llm-d-infpool -n ${NAMESPACE}
kubectl delete -k ./manifests/modelserver/<gke|coreweave> -n ${NAMESPACE}
kubectl delete -k ./manifests/gateway/<gke-l7-regional-external-managed|istio|kgateway|kgateway-openshift> -n ${NAMESPACE}
自定义
有关自定义指南的信息以及构建自己的指南的技巧,请参阅 我们的文档
此内容自动从 llm-d/llm-d 仓库 main 分支的 guides/wide-ep-lws/README.md 同步。