• Русский
  • Включение Expert Parallel для сервисов в inference vLLM

    Введение

    В этом документе показан базовый вариант настройки на одном узле, ориентированный на YAML, для включения vLLM Expert Parallel (EP) в InferenceService.

    Expert Parallel — это возможность upstream vLLM для моделей Mixture-of-Experts (MoE). В vLLM она по-прежнему находится в состоянии experimental, и связанные с ней имена аргументов или значения по умолчанию могут измениться в будущих версиях.

    WARNING

    Эта страница посвящена примеру конфигурации для одного узла и предназначена для начального знакомства с Expert Parallel. Для настройки производительности, планирования емкости и сведений о распределенном развертывании см. официальную документацию vLLM.

    Когда использовать Expert Parallel

    Expert Parallel актуален, когда вы обслуживаете модель MoE и хотите, чтобы vLLM разделял экспертные слои по GPU, а не полагался на поведение группировки экспертных слоев по умолчанию.

    Для развертывания на одном узле upstream-подход vLLM выглядит так:

    • Включите EP с помощью --enable-expert-parallel.
    • Оставьте пример на одном узле.
    • Используйте --data-parallel-size, чтобы охватить все GPU на этом узле.
    • Используйте --tensor-parallel-size 1 в этом примере, чтобы слои attention оставались реплицированными между data parallel rank'ами, а не разделялись с помощью tensor parallelism.

    Если вы обслуживаете dense-модель или если в вашем текущем runtime image отсутствуют зависимости, необходимые для EP в upstream vLLM, этот документ не является подходящей отправной точкой.

    Предварительные требования и ограничения

    • У вас есть доступ к Kubernetes cluster с установленным KServe.
    • У вас есть namespace, в котором можно создавать ресурсы InferenceService.
    • На платформе уже доступен runtime для обслуживания vLLM.
    • Используемый вами runtime image уже включает upstream-зависимости, необходимые для vLLM EP.
    • Ваша модель — это модель MoE, и она уже доступна сервису через настроенный storageUri.
    • На целевом узле доступны несколько видимых GPU. В этом примере в качестве single-node data parallel size используется обнаруженное количество GPU.

    Если текущий image vLLM еще не включает необходимые зависимости для EP, сначала расширьте или пересоберите runtime image. Для настройки runtime с учетом особенностей платформы см. Extend Inference Runtimes. Список upstream-зависимостей и рекомендации по backend см. в официальном руководстве по развертыванию vLLM EP в разделе References.

    Обзор конфигурации EP

    Включите EP, добавив флаг --enable-expert-parallel. В upstream vLLM размер expert parallel вычисляется автоматически:

    EP_SIZE = TP_SIZE x DP_SIZE

    Где:

    • TP_SIZE: размер tensor parallel
    • DP_SIZE: размер data parallel
    • EP_SIZE: размер expert parallel, вычисляемый vLLM автоматически

    Это означает, что отдельный аргумент для задания размера EP не используется. Вместо этого вы выбираете размеры tensor parallel и data parallel, а vLLM выводит эффективный размер группы expert parallel на основе этих параметров.

    Поведение слоев при включенном EP

    Когда EP включен для модели MoE, разные типы слоев используют разные стратегии параллелизма:

    Тип слояПоведениеИспользуемый параллелизм
    Expert (MoE) layersРазделяются по всем EP rank'амExpert Parallel, размер TP x DP
    Attention layersПоведение зависит от TP_SIZETensor Parallel или Data Parallel, в зависимости от TP_SIZE

    Для слоев attention:

    • При TP_SIZE = 1 веса attention реплицируются по всем data parallel rank'ам.
    • При TP_SIZE > 1 веса attention разделяются с помощью tensor parallelism внутри каждой группы data parallel.

    Например, если TP_SIZE = 2 и DP_SIZE = 4, сервис использует в общей сложности 8 GPU:

    • Слои expert образуют одну EP-группу размером 8, при этом эксперты распределяются по всем GPU.
    • Слои attention используют tensor parallelism размером 2 внутри каждой из 4 групп data parallel.

    По сравнению с обычным развертыванием data parallel основное отличие заключается в том, как распределяются слои MoE. Без --enable-expert-parallel слои MoE следуют поведению группировки tensor parallel. При включенном EP слои expert переключаются на expert parallelism, который специально предназначен для sharding'а expert-слоев в MoE.

    Соответствие upstream-команды и платформы

    В upstream single-node примере используется команда, аналогичная следующей:

    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
    • расположение модели, имя runtime и ресурсы Kubernetes задаются через storageUri, runtime и resources

    Именно поэтому следующий пример сосредоточен на том, как поместить флаги, связанные с EP, в YAML InferenceService на платформе.

    Настройка single-node InferenceService

    Создайте YAML-файл, например deepseek-v3-ep.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Включает Expert Parallel для модели MoE.
    --data-parallel-size "${GPU_COUNT}"Использует все видимые GPU на узле как data parallel group для этого single-node примера.
    --tensor-parallel-size 1Соответствует upstream-примеру и исключает слои attention из sharding'а tensor parallel.
    TIP

    Настройте поля ресурсов GPU так, чтобы они соответствовали ключам ресурсов, доступным в вашем cluster, и количеству GPU на целевом узле. В этом примере важно именно то, где аргументы vLLM EP добавляются в команду InferenceService. Если вам нужно явно задать all-to-all backend, сначала следуйте upstream-руководству по выбору backend, а затем добавляйте --all2all-backend.

    Проверка настроенного spec

    После применения манифеста проверьте итоговый spec InferenceService и убедитесь, что присутствуют аргументы, связанные с EP:

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

    Обратите внимание на сгенерированную команду predictor и убедитесь, что в ней по-прежнему присутствуют:

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

    Эта проверка подтверждает, что нужные аргументы vLLM были применены к конфигурации сервиса. Она не проверяет производительность runtime, совместимость backend или поведение в multi-node сценарии.

    Для multi-node развертываний

    Развертывания EP на нескольких узлах требуют дополнительной конфигурации распределенного runtime и сети, включая параметры запуска для каждого узла, роли узлов и настройки коммуникации data parallel.

    WARNING

    Эта страница посвящена шаблону конфигурации для одного узла. Если вам нужен multi-node EP, обратитесь к официальному руководству vLLM и адаптируйте модель развертывания под топологию вашего cluster и среду runtime.

    References