跳到內容

並行與擴充套件

單個模型副本的分散式推理策略

要為單個模型副本選擇分散式推理策略,請使用以下指南:

  • 單個 GPU (無分散式推理): 如果模型適合單個 GPU,則可能不需要分散式推理。直接在該 GPU 上執行推理。
  • 單節點多 GPU 使用張量並行推理: 如果模型太大而無法放入單個 GPU,但在具有多個 GPU 的單個節點上可以容納,請使用張量並行。例如,在使用具有 4 個 GPU 的節點時,設定 tensor_parallel_size=4
  • 多節點多 GPU 使用張量並行和流水線並行推理: 如果模型太大而無法放入單個節點,請結合使用張量並行流水線並行。將 tensor_parallel_size 設定為每個節點的 GPU 數量,將 pipeline_parallel_size 設定為節點數量。例如,在使用每個節點有 8 個 GPU 的 2 個節點時,設定 tensor_parallel_size=8pipeline_parallel_size=2

增加 GPU 和節點的數量,直到有足夠的 GPU 記憶體來容納模型。將 tensor_parallel_size 設定為每個節點的 GPU 數量,將 pipeline_parallel_size 設定為節點數量。

在配置了足夠的資源來容納模型後,執行 vllm。查詢類似以下的日誌訊息:

INFO 07-23 13:56:04 [kv_cache_utils.py:775] GPU KV cache size: 643,232 tokens
INFO 07-23 13:56:04 [kv_cache_utils.py:779] Maximum concurrency for 40,960 tokens per request: 15.70x

GPU KV cache size 行報告了 GPU KV 快取一次可以儲存的 token 總數。Maximum concurrency 行提供了每秒可服務請求數量的估計,前提是每個請求都需要指定數量的 token (在上例中為 40,960)。每個請求的 token 數量取自模型的最大序列長度 ModelConfig.max_model_len。如果這些數字低於您的吞吐量要求,請向叢集新增更多 GPU 或節點。

邊緣情況:不均勻的 GPU 分配

如果模型可以容納在一個節點內,但 GPU 數量不能整除模型大小,請啟用流水線並行,它會沿層分割模型並支援不均勻的分割。在這種情況下,設定 tensor_parallel_size=1,並將 pipeline_parallel_size 設定為 GPU 數量。此外,如果節點上的 GPU 沒有 NVLINK 互連 (例如 L40S),則利用流水線並行而不是張量並行來獲得更高的吞吐量和更低的通訊開銷。

混合專家 (MoE) 模型的分散式服務

利用專家固有的並行性通常很有益,方法是為專家層使用單獨的並行策略。vLLM 支援結合資料並行注意力與專家或張量並行 MoE 層的大規模部署。有關更多資訊,請參閱資料並行部署

單節點部署

vLLM 支援分散式張量並行和流水線並行推理及服務。該實現包括 Megatron-LM 的張量並行演算法

預設的分散式執行時是用於多節點推理的 Ray,以及用於單節點推理的原生 Python multiprocessing。您可以透過在 LLM 類中設定 distributed_executor_backend 或在 API 伺服器中設定 --distributed-executor-backend 來覆蓋預設值。對於 multiprocessing,使用 mp;對於 Ray,使用 ray

對於多 GPU 推理,在 LLM 類中設定 tensor_parallel_size 為所需的 GPU 數量。例如,要在 4 個 GPU 上執行推理:

from vllm import LLM
llm = LLM("facebook/opt-13b", tensor_parallel_size=4)
output = llm.generate("San Francisco is a")

對於多 GPU 服務,在啟動伺服器時包含 --tensor-parallel-size。例如,要在 4 個 GPU 上執行 API 伺服器:

vllm serve facebook/opt-13b \
     --tensor-parallel-size 4

要啟用流水線並行,請新增 --pipeline-parallel-size。例如,要在 8 個 GPU 上執行 API 伺服器,並啟用流水線並行和張量並行:

# Eight GPUs total
vllm serve gpt2 \
     --tensor-parallel-size 4 \
     --pipeline-parallel-size 2

多節點部署

如果單個節點沒有足夠的 GPU 來容納模型,請將 vLLM 部署到多個節點上。確保每個節點提供相同的執行環境,包括模型路徑和 Python 包。建議使用容器映象,因為它們提供了一種方便的方式來保持環境一致並隱藏主機異構性。

什麼是 Ray?

Ray 是一個用於擴充套件 Python 程式的分散式計算框架。多節點 vLLM 部署可以使用 Ray 作為執行時引擎。

vLLM 使用 Ray 來管理跨多個節點的任務的分散式執行,並控制執行發生的位置。

Ray 還為大規模離線批次推理線上服務提供了高階 API,這些 API 可以利用 vLLM 作為引擎。這些 API 為 vLLM 工作負載增加了生產級的容錯能力、可伸縮性和分散式可觀測性。

有關詳細資訊,請參閱Ray 文件

使用容器設定 Ray 叢集

幫助指令碼 examples/online_serving/run_cluster.sh 啟動跨節點的容器並初始化 Ray。預設情況下,該指令碼以無管理許可權執行 Docker,這會阻止在分析或跟蹤時訪問 GPU 效能計數器。要啟用管理許可權,請將 --cap-add=CAP_SYS_ADMIN 標誌新增到 Docker 命令。

選擇一個節點作為主節點並執行:

bash run_cluster.sh \
                vllm/vllm-openai \
                <HEAD_NODE_IP> \
                --head \
                /path/to/the/huggingface/home/in/this/node \
                -e VLLM_HOST_IP=<HEAD_NODE_IP>

在每個工作節點上執行:

bash run_cluster.sh \
                vllm/vllm-openai \
                <HEAD_NODE_IP> \
                --worker \
                /path/to/the/huggingface/home/in/this/node \
                -e VLLM_HOST_IP=<WORKER_NODE_IP>

請注意,VLLM_HOST_IP 對每個工作節點都是唯一的。保持執行這些命令的 shell 處於開啟狀態;關閉任何 shell 都會終止叢集。確保所有節點都可以透過其 IP 地址相互通訊。

網路安全

出於安全考慮,請將 VLLM_HOST_IP 設定為私有網路段上的地址。透過此網路傳送的流量是未加密的,並且端點以可以被利用來執行任意程式碼的格式交換資料,如果攻擊者獲得網路訪問許可權。確保不受信任的方無法訪問該網路。

從任何節點,進入容器並執行 ray statusray list nodes 來驗證 Ray 是否找到了預期的節點和 GPU 數量。

提示

或者,使用 KubeRay 設定 Ray 叢集。有關更多資訊,請參閱 KubeRay vLLM 文件

在 Ray 叢集上執行 vLLM

提示

如果 Ray 執行在容器內部,請在本指南的其餘部分中在容器內部執行命令,而不是在主機上執行。要開啟容器內的 shell,請連線到節點並使用 docker exec -it <container_name> /bin/bash

一旦 Ray 叢集正在執行,就像在單節點環境中一樣使用 vLLM。Ray 叢集的所有資源對 vLLM 都是可見的,因此在單個節點上執行單個 vllm 命令就足夠了。

常見的做法是將張量並行大小設定為每個節點中的 GPU 數量,並將流水線並行大小設定為節點數量。例如,如果您有 2 個節點共 16 個 GPU (每個節點 8 個 GPU),請將張量並行大小設定為 8,流水線並行大小設定為 2。

vllm serve /path/to/the/model/in/the/container \
    --tensor-parallel-size 8 \
    --pipeline-parallel-size 2 \
    --distributed-executor-backend ray

或者,您可以將 tensor_parallel_size 設定為叢集中 GPU 的總數。

vllm serve /path/to/the/model/in/the/container \
     --tensor-parallel-size 16 \
     --distributed-executor-backend ray

使用多程序執行 vLLM

除了 Ray 之外,多節點 vLLM 部署還可以使用 multiprocessing 作為執行時引擎。下面是一個跨 2 個節點 (每個節點 8 個 GPU) 部署模型,使用 tp_size=8pp_size=2 的示例。

選擇一個節點作為主節點並執行:

vllm serve /path/to/the/model/in/the/container \
  --tensor-parallel-size 8 --pipeline-parallel-size 2 \
  --nnodes 2 --node-rank 0 \
  --master-addr <HEAD_NODE_IP>

在另一個工作節點上執行:

vllm serve /path/to/the/model/in/the/container \
  --tensor-parallel-size 8 --pipeline-parallel-size 2 \
  --nnodes 2 --node-rank 1 \
  --master-addr <HEAD_NODE_IP> --headless

最佳化張量並行通訊

高效的張量並行需要快速的節點間通訊,最好透過高速網路介面卡,如 InfiniBand。要設定使用 InfiniBand 的叢集,請將附加引數 (如 --privileged -e NCCL_IB_HCA=mlx5) 追加到 examples/online_serving/run_cluster.sh 幫助指令碼。有關所需標誌的更多資訊,請諮詢您的系統管理員。

啟用 GPUDirect RDMA

GPUDirect RDMA (Remote Direct Memory Access) 是一項 NVIDIA 技術,它允許網路介面卡直接訪問 GPU 記憶體,繞過 CPU 和系統記憶體。這種直接訪問可減少延遲和 CPU 開銷,這對於跨節點 GPU 之間的大資料傳輸非常有利。

要啟用 GPUDirect RDMA 與 vLLM,請配置以下設定:

  • IPC_LOCK 安全上下文:將 IPC_LOCK 功能新增到容器的安全上下文中,以鎖定記憶體頁面並防止交換到磁碟。
  • /dev/shm 的共享記憶體:在 pod 規範中掛載 /dev/shm,為程序間通訊 (IPC) 提供共享記憶體。

如果使用 Docker,請按以下方式設定容器:

docker run --gpus all \
    --ipc=host \
    --shm-size=16G \
    -v /dev/shm:/dev/shm \
    vllm/vllm-openai

如果使用 Kubernetes,請按以下方式設定 pod 規範:

...
spec:
  containers:
    - name: vllm
      image: vllm/vllm-openai
      securityContext:
        capabilities:
          add: ["IPC_LOCK"]
      volumeMounts:
        - mountPath: /dev/shm
          name: dshm
      resources:
        limits:
          nvidia.com/gpu: 8
        requests:
          nvidia.com/gpu: 8
  volumes:
    - name: dshm
      emptyDir:
        medium: Memory
...

確認 GPUDirect RDMA 操作

要確認您的 InfiniBand 網絡卡正在使用 GPUDirect RDMA,請執行帶有詳細 NCCL 日誌的 vLLM:NCCL_DEBUG=TRACE vllm serve ...

然後查詢 NCCL 版本和使用的網路。

  • 如果在日誌中找到 [send] via NET/IB/GDRDMA,則 NCCL 正在使用支援 GPUDirect RDMA 的 InfiniBand,這高效的。
  • 如果在日誌中找到 [send] via NET/Socket,則 NCCL 使用了原始 TCP 套接字,這對於跨節點張量並行效率不高

預下載 Hugging Face 模型

如果您使用 Hugging Face 模型,建議在啟動 vLLM 之前下載模型。將模型下載到每個節點上的同一路徑,或將模型儲存在所有節點都可以訪問的分散式檔案系統上。然後,在傳遞給模型的引數中使用該路徑代替儲存庫 ID。否則,透過將 -e HF_TOKEN=<TOKEN> 追加到 run_cluster.sh 來提供 Hugging Face 令牌。

分散式部署故障排查

有關分散式除錯的資訊,請參閱分散式部署故障排除