分片预填#

本教程将介绍如何运行分片预填系统,该系统将模型执行拆分为跨不同服务器的预填和解码阶段。通过将初始处理(预填)与令牌生成(解码)阶段分开,这种方法可以提高吞吐量和资源利用率。

先决条件#

  • 支持 GPU 并启用 NVLink 的 Kubernetes 集群

  • 可用的 NVIDIA GPU(建议至少 2 个 GPU)

  • kubectl 已配置为与您的集群通信

  • 已在本地安装并初始化 Helm

  • 已完成以下设置教程

Kubernetes 部署#

对于生产环境,您可以使用 Kubernetes 和 Helm 部署分片预填系统。这种方法提供了更好的可伸缩性、资源管理和高可用性。

步骤 1: 创建配置文件#

创建一个名为 values-16-disagg-prefill.yaml 的配置文件,其中包含以下内容

# Unified configuration for disaggregated prefill setup
servingEngineSpec:
  enableEngine: true
  runtimeClassName: ""
  containerPort: 8000
  modelSpec:
    # Prefill node configuration
    - name: "llama-prefill"
      repository: "lmcache/vllm-openai"
      tag: "2025-05-17-v1"
      modelURL: "meta-llama/Llama-3.1-8B-Instruct"
      replicaCount: 1
      requestCPU: 8
      requestMemory: "30Gi"
      requestGPU: 1
      pvcStorage: "50Gi"
      vllmConfig:
        enableChunkedPrefill: false
        enablePrefixCaching: false
        maxModelLen: 32000
        v1: 1
      lmcacheConfig:
        enabled: true
        kvRole: "kv_producer"
        enableNixl: true
        nixlRole: "sender"
        nixlPeerHost: "pd-llama-decode-engine-service"
        nixlPeerPort: "55555"
        nixlBufferSize: "1073741824"  # 1GB
        nixlBufferDevice: "cuda"
        nixlEnableGc: true
        enablePD: true
      hf_token: <your-hf-token>
      labels:
        model: "llama-prefill"
    # Decode node configuration
    - name: "llama-decode"
      repository: "lmcache/vllm-openai"
      tag: "2025-05-17-v1"
      modelURL: "meta-llama/Llama-3.1-8B-Instruct"
      replicaCount: 1
      requestCPU: 8
      requestMemory: "30Gi"
      requestGPU: 1
      pvcStorage: "50Gi"
      vllmConfig:
        enableChunkedPrefill: false
        enablePrefixCaching: false
        maxModelLen: 32000
        v1: 1
      lmcacheConfig:
        enabled: true
        kvRole: "kv_consumer"
        enableNixl: true
        nixlRole: "receiver"
        nixlPeerHost: "0.0.0.0"
        nixlPeerPort: "55555"
        nixlBufferSize: "1073741824"  # 1GB
        nixlBufferDevice: "cuda"
        nixlEnableGc: true
        enablePD: true
      hf_token: <your-hf-token>
      labels:
        model: "llama-decode"
routerSpec:
  enableRouter: true
  repository: "lmcache/lmstack-router"
  tag: "pd-05-26"
  replicaCount: 1
  containerPort: 8000
  servicePort: 80
  routingLogic: "disaggregated_prefill"
  engineScrapeInterval: 15
  requestStatsWindow: 60
  enablePD: true
  resources:
    requests:
      cpu: "4"
      memory: "16G"
    limits:
      cpu: "4"
      memory: "32G"
  labels:
    environment: "router"
    release: "router"
  extraArgs:
    - "--prefill-model-labels"
    - "llama-prefill"
    - "--decode-model-labels"
    - "llama-decode"

步骤 2: 使用 Helm 部署#

使用 Helm 和配置文件安装部署

helm install pd helm/ -f tutorials/assets/values-16-disagg-prefill.yaml

这将部署

  • 具有指定配置的预填服务器

  • 具有指定配置的解码服务器

  • 协调它们之间的路由器

配置包括

  • 每个组件的资源请求和限制

  • NIXL 通信设置

  • 模型配置

  • 分片预填的路由器设置

步骤 3: 验证部署#

检查您的部署状态

kubectl get pods
kubectl get services

您应该会看到以下 Pod

  • 预填服务器

  • 解码服务器

  • 路由器

步骤 4: 访问服务#

首先进行端口转发以访问服务

kubectl port-forward svc/pd-router-service 30080:80

然后通过以下方式向路由器发送请求

curl https://:30080/v1/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "meta-llama/Llama-3.1-8B-Instruct",
        "prompt": "Your prompt here",
        "max_tokens": 100
    }'