分布式部署
本章介绍如何在多 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;
}
}
小结
分布式部署的关键点:
- 张量并行:解决单 GPU 显存不足问题
- 流水线并行:适合层数多的模型
- 混合并行:结合 TP 和 PP 的优势
- 数据并行:扩展服务能力
- Ray 集群:简化多节点部署