为 vLLM 推理服务启用 Expert Parallel

简介

本文提供一个以单节点、YAML 优先的起点,用于在 InferenceService 中启用 vLLM Expert Parallel (EP)

Expert Parallel 是 vLLM 上游提供的一项能力,适用于 Mixture-of-Experts (MoE) 模型。它在 vLLM 中仍处于 experimental 阶段,相关参数名称或默认值可能会在未来版本中发生变化。

WARNING

本页重点介绍一个用于快速入门 Expert Parallel 的单节点配置示例。有关性能调优、容量规划和分布式部署的详细信息,请参阅官方 vLLM 文档。

何时使用 Expert Parallel

当你正在提供 MoE 模型服务,并且希望 vLLM 将 expert 层拆分到多个 GPU 上,而不是依赖默认的 expert-layer grouping 行为时,Expert Parallel 就很有用。

对于单节点部署,上游 vLLM 的模式如下:

  • 使用 --enable-expert-parallel 启用 EP。
  • 示例保持在单节点上运行。
  • 使用 --data-parallel-size 覆盖该节点上的 GPU。
  • 在本示例中使用 --tensor-parallel-size 1,这样 attention 层会在 data parallel ranks 之间保持复制,而不会通过 tensor parallelism 进行拆分。

如果你提供的是 dense 模型,或者当前运行时镜像不包含上游 vLLM 所需的 EP 相关依赖,那么本指南不是合适的起点。

前提条件和限制

  • 你可以访问一个已安装 KServe 的 Kubernetes 集群。
  • 你有一个可以创建 InferenceService 资源的 namespace。
  • 你已经在平台上可用一个 vLLM serving runtime。
  • 你使用的运行时镜像已经包含 vLLM EP 所需的上游依赖。
  • 你的模型是一个 MoE 模型,并且已经可以通过配置的 storageUri 被服务访问。
  • 目标节点上有多个可见 GPU。此示例使用检测到的 GPU 数量作为单节点 data parallel size。

如果你当前的 vLLM 镜像尚未包含所需的 EP 依赖,请先扩展或重建运行时镜像。有关平台相关的运行时定制,请参阅 Extend Inference Runtimes。有关上游依赖列表和 backend 指导,请参阅 References 中官方 vLLM EP 部署指南。

EP 配置概览

通过添加 --enable-expert-parallel 标志来启用 EP。在上游 vLLM 中,expert parallel size 会自动计算:

EP_SIZE = TP_SIZE x DP_SIZE

其中:

  • TP_SIZE:tensor parallel size
  • DP_SIZE:data parallel size
  • EP_SIZE:expert parallel size,由 vLLM 自动计算

这意味着你不需要单独设置 EP size 参数。相反,你需要选择 tensor parallel 和 data parallel 的大小,vLLM 会根据这些设置推导出有效的 expert parallel group size。

启用 EP 时的层行为

当 MoE 模型启用 EP 后,不同类型的层会使用不同的并行策略:

层类型行为使用的并行方式
Expert (MoE) 层在所有 EP ranks 之间拆分Expert Parallel,大小为 TP x DP
Attention 层行为取决于 TP_SIZETensor Parallel 或 Data Parallel,取决于 TP_SIZE

对于 attention 层:

  • TP_SIZE = 1 时,attention 权重会在所有 data parallel ranks 之间复制。
  • TP_SIZE > 1 时,attention 权重会在每个 data parallel group 内使用 tensor parallelism 进行拆分。

例如,如果 TP_SIZE = 2DP_SIZE = 4,则该服务总共会使用 8 个 GPU:

  • expert 层会形成一个大小为 8 的 EP group,expert 分布在所有 GPU 上。
  • attention 层会在 4 个 data parallel group 中的每个组内使用大小为 2 的 tensor parallelism。

与常规 data parallel 部署相比,主要区别在于 MoE 层的分布方式。没有 --enable-expert-parallel 时,MoE 层会遵循 tensor parallel grouping 行为。启用 EP 后,expert 层会切换为 expert parallelism,这种方式专门为 MoE 风格的 expert 拆分而设计。

上游命令与平台映射

上游单节点示例使用的命令类似如下:

vllm serve deepseek-ai/DeepSeek-V3-0324 \
  --tensor-parallel-size 1 \
  --data-parallel-size 8 \
  --enable-expert-parallel

在 Alauda AI 中,这些相同的标志通常通过 InferenceService 容器命令传递。换句话说:

  • vllm serve ... 会变成在 spec.predictor.model.command 中启动的命令
  • --tensor-parallel-size--data-parallel-size--enable-expert-parallel 会追加到 vLLM 启动命令中
  • 模型位置、运行时名称和 Kubernetes 资源通过 storageUriruntimeresources 表达

这也是为什么下面的示例重点展示如何将 EP 相关标志放入平台的 InferenceService YAML 中。

配置单节点 InferenceService

创建一个名为 deepseek-v3-ep.yaml 的 YAML 文件,内容如下:

apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
  annotations:
    aml-model-repo: DeepSeek-V3-0324
    serving.knative.dev/progress-deadline: 2400s
    serving.kserve.io/deploymentMode: Standard
  labels:
    aml.cpaas.io/runtime-type: vllm
  name: deepseek-v3-ep
  namespace: <your-namespace>
spec:
  predictor:
    minReplicas: 1
    maxReplicas: 1
    model:
      command:
        - bash
        - -c
        - |
          set -ex

          GPU_COUNT=$(python3 -c "import torch; print(torch.cuda.device_count())")
          if [ "${GPU_COUNT}" -lt 2 ]; then
            echo "Expert Parallel requires multiple visible GPUs on the same node"
            exit 1
          fi

          MODEL_PATH="/mnt/models/${MODEL_NAME}"
          if [ ! -d "${MODEL_PATH}" ]; then
            MODEL_PATH="/mnt/models"
          fi

          python3 -m vllm.entrypoints.openai.api_server \
            --port 8080 \
            --served-model-name {{.Name}} {{.Namespace}}/{{.Name}} \
            --model "${MODEL_PATH}" \
            --dtype ${DTYPE} \
            --gpu-memory-utilization ${GPU_MEMORY_UTILIZATION} \
            --tensor-parallel-size 1 \
            --data-parallel-size "${GPU_COUNT}" \
            --enable-expert-parallel
        - bash
      env:
        - name: DTYPE
          value: half
        - name: GPU_MEMORY_UTILIZATION
          value: '0.95'
        - name: MODEL_NAME
          value: '{{ index .Annotations "aml-model-repo" }}'
      modelFormat:
        name: transformers
      protocolVersion: v2
      resources:
        limits:
          cpu: '8'
          memory: 32Gi
          nvidia.com/gpu: '8'
        requests:
          cpu: '4'
          memory: 16Gi
      runtime: <your-vllm-runtime>
      storageUri: hf://<your-model-path>
    securityContext:
      seccompProfile:
        type: RuntimeDefault

应用该清单:

kubectl apply -f deepseek-v3-ep.yaml -n <your-namespace>

这些标志为何重要

标志作用
--enable-expert-parallel为 MoE 模型启用 Expert Parallel。
--data-parallel-size "${GPU_COUNT}"在这个单节点示例中,将节点上所有可见 GPU 作为 data parallel group 使用。
--tensor-parallel-size 1与上游示例保持一致,并使 attention 层不进行 tensor parallel 拆分。
TIP

请调整 GPU 资源字段,以匹配集群中可用的资源键以及目标节点上的 GPU 数量。本示例的重点是展示如何在 InferenceService 命令中添加 vLLM EP 参数。如果你需要显式设置 all-to-all backend,请先参考上游 backend 选择指南,然后再添加 --all2all-backend

查看已配置的 Spec

应用清单后,请查看生成的 InferenceService spec,并确认其中包含 EP 相关参数:

kubectl get inferenceservice deepseek-v3-ep -n <your-namespace> -o yaml

重点检查生成的 predictor command,并确认它仍然包含以下内容:

  • --enable-expert-parallel
  • --data-parallel-size
  • --tensor-parallel-size 1

此检查可以确认预期的 vLLM 参数已应用到服务配置中。它不能验证运行时性能、backend 兼容性或多节点行为。

多节点部署

多节点 EP 部署需要额外的分布式运行时和网络配置,包括每个节点的启动设置、节点角色以及 data-parallel 通信设置。

WARNING

本页重点介绍单节点配置模式。如果你需要多节点 EP,请参考官方 vLLM 指南,并根据你的集群拓扑和运行环境调整部署模型。

参考资料