vLLM 实战:如何在 GPU 服务器上高效跑起开源 LLM
目录
为什么需要 vLLM
跑过开源 LLM 的人都遇到过这个问题:模型加载到 GPU 后,显存占用高得离谱,但 GPU 利用率却上不去。
传统 LLM serving 的问题:
输入: "Hello, how are"
Token: [0, 1, 2, 3, ...] → [0, 1, 2, 3, 4, 5, ...]
↓
Attention 计算
↓
每个 token 都需要访问完整的 KV cache
↓
KV cache 按 request 预分配固定大小
↓
大量显存碎片 + GPU 利用率低原因:传统方案把 KV cache 按 request 预分配固定长度的连续显存。但实际生成时,request 长度差异很大,导致大量显存浪费。
vLLM 的核心:PagedAttention
vLLM 来自 UC Berkeley 的研究团队,2023 年 6 月发布。他们的核心创新是 PagedAttention——受操作系统分页内存管理启发。
原理
传统方案:
Request 1: [Token 1][Token 2][Token 3][Empty...Empty] (预分配 512 slots)
Request 2: [Token 1][Token 2][Empty...Empty...Empty] (预分配 512 slots)PagedAttention:
KV Cache: [Block 0][Block 1][Block 2][Block 3][Block 4][Block 5][Block 6][Block 7]
───────────────────────────────────────────────────────────────
Request 1: P1 | P1 | P1 | P1 |
Request 2: P2 | P2 | | |每个 request 的 KV cache 不再是连续的大块,而是分散在多个小块(block)中,按需分配。就像操作系统的虚拟内存分页。
实际效果
根据 vLLM 论文和我们的测试:
| 指标 | 传统方案 | vLLM | 提升 |
|---|---|---|---|
| Throughput (tokens/s) | 基准 | +24x | 24倍 |
| 显存占用 | 100% | ~60% | 省 40% |
| 支持并发 request | 1-2 | 10-20 | 10倍 |
部署实战
环境准备
# 需要 CUDA 12.1+
nvidia-smi # 确认 GPU 可用
# 推荐 Docker 部署
docker pull nvidia/cuda:12.1.0-runtime-ubuntu22.04安装 vLLM
# 方式 1: pip 直接装
pip install vllm
# 方式 2: 从源码编译(需要更多时间,但能用到最新的优化)
git clone https://github.com/vllm-project/vllm.git
cd vllm
pip install -e .启动 API Server
# 最简启动
vllm serve meta-llama/Llama-2-7b-chat-hf \
--host 0.0.0.0 \
--port 8000 \
--tensor-parallel-size 2 # 如果有多 GPU# 生产级配置
vllm serve meta-llama/Llama-2-70b-chat-hf \
--host 0.0.0.0 \
--port 8000 \
--tensor-parallel-size 4 \
--gpu-memory-utilization 0.92 \
--max-model-len 8192 \
--enforce-eager \
--trust-remote-code调用示例
# OpenAI-compatible API
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "meta-llama/Llama-2-7b-chat-hf",
"messages": [{"role": "user", "content": "Explain PagedAttention in one sentence."}],
"max_tokens": 100
}'Python client:
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="EMPTY" # vLLM 默认不需要 API key
)
response = client.chat.completions.create(
model="meta-llama/Llama-2-7b-chat-hf",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "What is vLLM?"}
],
max_tokens=200,
temperature=0.7
)
print(response.choices[0].message.content)硬件配置建议
单卡配置(7B 模型)
# 7B 模型单卡完全够用
vllm serve llama-2-7b \
--gpu-memory-utilization 0.9 \
--max-model-len 4096硬件推荐:RTX 4090 (24GB) 或 A10G (24GB)
多卡配置(13B+ 模型)
# 13B 模型建议 2 卡
vllm serve llama-2-13b-chat-hf \
--tensor-parallel-size 2 \
--gpu-memory-utilization 0.85
# 70B 模型需要 4 卡
vllm serve llama-2-70b-chat-hf \
--tensor-parallel-size 4 \
--gpu-memory-utilization 0.870B 模型的最低配置
# 4 x A100 40GB 或等效
# 注意: 70B 模型 fp16 精度需要 ~140GB 显存
# 需要 4 卡 tensor parallel 或 quantization量化:在消费级 GPU 上跑大模型
没有 4 卡 A100?用量化。
# GPTQ 量化 (Q4)
vllm serve meta-llama/Llama-2-70b-chat-hf-gptq \
--quantization gptq \
--dtype half#AWQ 量化效果更好,但需要额外工具预处理
#使用 llm-awq 先量化
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
# 量化后的模型加载
vllm serve my-quantized-70b-model \
--quantization awq实测 70B 模型量化到 4-bit 后,2 x A100 80GB 可以跑起来。
常见问题
1. CUDA out of memory
# 降低 gpu-memory-utilization
vllm serve model --gpu-memory-utilization 0.8
# 或者降低 max-model-len
vllm serve model --max-model-len 20482. 首次加载慢
vLLM 首次启动会把模型切成小块按需加载,后续 request 会快很多。但如果经常重启,用 python -m vllm.entrypoints.openai.api_server 并加 --enable-prefix-caching 加速重复加载。
3. 多并发时性能下降
# 调整 block size
vllm serve model --block-size 32
# 或者调整 max-num-batched-tokens
vllm serve model --max-num-batched-tokens 8192vLLM vs 其他方案对比
| vLLM | Text Generation Inference (TGI) | llama.cpp | |
|---|---|---|---|
| 开发方 | UC Berkeley | HuggingFace | Georgi Gerganov |
| 优化方向 | PagedAttention | 多种优化 | CPU+GPU 混合 |
| 多卡支持 | 好 (TP) | 好 | 差 |
| 量化支持 | GPTQ/AWQ | GPTQ/AWQ/GGUF | GGUF (原生) |
| 消费级 GPU | 需量化 | 需量化 | 强 (CPU 可跑) |
| 上手难度 | 中 | 低 | 低 |
| 活跃度 | 高 | 高 | 高 |
什么时候用 vLLM
适合:
- 有 GPU 服务器,需要高并发推理
- 需要 self-host 避免数据外传
- 对 latency 和 throughput 有要求
不适合:
- 没有 GPU,只有 CPU → 用 llama.cpp
- 只是简单跑一下模型 → 直接用 transformers pipeline
- 追求最快首次推理 → vLLM 加载有冷启动时间
总结
vLLM 是开源 LLM serving 的当前最优解之一。PagedAttention 让显存利用率和吞吐量都有本质提升。
部署建议:
- 7B 模型:单卡 RTX 4090 + vLLM
- 13B 模型:2 卡 A10G 或量化后单卡
- 70B 模型:4 卡 A100 或量化到 4-bit 后 2 卡