跳到主要内容

分布式部署

本章介绍如何在多 GPU 和多节点环境下部署 vLLM,以支持更大规模的模型和更高的并发量。

张量并行(Tensor Parallelism)

张量并行将模型的权重矩阵分割到多个 GPU 上,适合单个 GPU 无法容纳的模型。

工作原理

模型层: Linear(in=4096, out=4096)

张量并行 (TP=2):
GPU 0: Linear(in=4096, out=2048)
GPU 1: Linear(in=4096, out=2048)

All-Reduce 合并结果

单节点多卡

# 2 卡张量并行
vllm serve meta-llama/Llama-2-70b-chat-hf \
--tensor-parallel-size 2

# 4 卡张量并行
vllm serve meta-llama/Llama-2-70b-chat-hf \
--tensor-parallel-size 4
from vllm import LLM

llm = LLM(
model="meta-llama/Llama-2-70b-chat-hf",
tensor_parallel_size=4
)

显存计算

张量并行可以将显存占用均分到多个 GPU:

模型: Llama-2-70B
FP16 显存: ~140GB

TP=2: 每个 GPU ~70GB
TP=4: 每个 GPU ~35GB
TP=8: 每个 GPU ~18GB

流水线并行(Pipeline Parallelism)

流水线并行将模型的不同层分配到不同 GPU,适合层数较多的模型。

工作原理

模型: 80 层 Transformer

流水线并行 (PP=4):
GPU 0: 层 0-19
GPU 1: 层 20-39
GPU 2: 层 40-59
GPU 3: 层 60-79

数据流: GPU 0 → GPU 1 → GPU 2 → GPU 3 → 输出

使用流水线并行

from vllm import LLM

llm = LLM(
model="meta-llama/Llama-2-70b-chat-hf",
pipeline_parallel_size=4
)

混合并行

可以同时使用张量并行和流水线并行:

配置: TP=2, PP=2, 共 4 个 GPU

GPU 0 (TP Rank 0, PP Rank 0): 层 0-39 的前半部分
GPU 1 (TP Rank 1, PP Rank 0): 层 0-39 的后半部分
GPU 2 (TP Rank 0, PP Rank 1): 层 40-79 的前半部分
GPU 3 (TP Rank 1, PP Rank 1): 层 40-79 的后半部分
llm = LLM(
model="meta-llama/Llama-2-70b-chat-hf",
tensor_parallel_size=2,
pipeline_parallel_size=2
)

多节点部署

当单节点 GPU 不足时,可以使用多节点部署。

环境准备

节点配置:

Node 0 (Head): IP 192.168.1.10, GPUs: 0,1,2,3
Node 1 (Worker): IP 192.168.1.11, GPUs: 0,1,2,3

SSH 免密登录:

# 在 head 节点生成密钥
ssh-keygen -t rsa

# 复制到 worker 节点
ssh-copy-id [email protected]

使用 Ray 部署

vLLM 使用 Ray 进行分布式调度。

启动 Ray 集群:

# Head 节点
ray start --head --port=6379

# Worker 节点
ray start --address="192.168.1.10:6379"

验证集群:

ray status

运行 vLLM:

from vllm import LLM

# 自动检测 Ray 集群
llm = LLM(
model="meta-llama/Llama-2-70b-chat-hf",
tensor_parallel_size=8, # 使用 8 个 GPU(跨 2 节点)
pipeline_parallel_size=1
)

数据并行(Data Parallelism)

数据并行用于扩展服务能力,每个副本独立处理请求。

单机多副本

# 启动多个实例
CUDA_VISIBLE_DEVICES=0 vllm serve meta-llama/Llama-2-7b-chat-hf --port 8000 &
CUDA_VISIBLE_DEVICES=1 vllm serve meta-llama/Llama-2-7b-chat-hf --port 8001 &
CUDA_VISIBLE_DEVICES=2 vllm serve meta-llama/Llama-2-7b-chat-hf --port 8002 &
CUDA_VISIBLE_DEVICES=3 vllm serve meta-llama/Llama-2-7b-chat-hf --port 8003 &

负载均衡配置

Nginx 配置:

upstream vllm_backend {
least_conn; # 最少连接数策略
server localhost:8000;
server localhost:8001;
server localhost:8002;
server localhost:8003;
}

server {
listen 80;

location /v1/ {
proxy_pass http://vllm_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_buffering off;
}
}

小结

分布式部署的关键点:

  1. 张量并行:解决单 GPU 显存不足问题
  2. 流水线并行:适合层数多的模型
  3. 混合并行:结合 TP 和 PP 的优势
  4. 数据并行:扩展服务能力
  5. Ray 集群:简化多节点部署