项目地址:vllm-project/vllm | ⭐ 79.5k Stars | 🛠 Python | UC Berkeley Sky Computing Lab
老实说,跑 LLM 推理这事,过去两年我一直被两个问题折磨:显存不够用,吞吐上不去。单张 A100 跑 Llama-70B,batch size 开大了 OOM,开小了 GPU 利用率不到 20%。直到 vLLM 出现——这玩意儿靠一个叫 PagedAttention 的骚操作,直接把 KV cache 碎片化问题干掉了,吞吐能翻 10-20 倍。
一、PagedAttention:像操作系统管理内存一样管理 KV Cache
传统推理框架里,KV cache 是连续分配的,prefill 阶段就得把整个序列的内存预占好。但实际生成时 token 一个接一个来,前面预占的很多位置压根用不上,造成大量碎片浪费。
vLLM 的做法很粗暴:把 KV cache 切成一页一页的 16KB block,按需分配、按页管理——就像操作系统管理虚拟内存一样。缺页了就分配新 block,用完了就回收。就这么一个改动,显存利用率从 30% 拉到 95%+。
二、一行命令拉起 OpenAI 兼容 API
安装:
uv pip install vllm
老规矩,pip 也行:
pip install vllm
拉起服务:
vllm serve meta-llama/Llama-3.1-8B-Instruct \
--max-model-len 8192 \
--gpu-memory-utilization 0.9 \
--dtype bfloat16
默认 8000 端口,直接当 OpenAI API 用:
curl -X POST http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "meta-llama/Llama-3.1-8B-Instruct",
"messages": [{"role": "user", "content": "用 Python 写一个快排"}],
"temperature": 0.7,
"max_tokens": 512
}'
实测单张 H100 跑 Llama-70B,vLLM 的 throughput 比 Hugging Face 原生推理高了 15 倍。不是玩具,是真能抗生产流量。
三、Offline 推理:当 Python 库用
不想起 HTTP 服务?直接 import 当库调用:
from vllm import LLM, SamplingParams
llm = LLM("meta-llama/Llama-3.1-8B-Instruct")
params = SamplingParams(temperature=0.8, top_p=0.95, max_tokens=1024)
outputs = llm.generate([
"解释一下什么是 PagedAttention",
"写一个 Python 装饰器实现重试逻辑",
], sampling_params=params)
for output in outputs:
print(f"Prompt: {output.prompt}")
print(f"Generated: {output.outputs[0].text}\n")
连续批处理是自动的——你扔一批请求进去,vLLM 自己决定哪些可以一起算,不用你管 batch size。
四、硬核功能一览
支持 200+ 模型架构:Llama、Qwen、DeepSeek、Mixtral、Gemma,几乎 HF 上能跑的都支持。
五、踩坑记录
别踩的坑有两个:
2. gpu-memory-utilization 别拉满:设 0.85-0.9 比较稳,0.95 以上在量化模型上容易崩。留点余量给 tokenizer 和其他开销。
3. 多卡时设好 tensor-parallel-size:
vllm serve meta-llama/Llama-3.1-70B-Instruct \
--tensor-parallel-size 4 \
--pipeline-parallel-size 1
70B 模型用 4 张 H100 跑 tensor parallel,单卡显存从 140GB 降到 35GB,基本线性扩展。
六、总结
gpu-memory-utilization=0.9 + max-model-len=8192