vLLM 出自 UC Berkeley 的 Sky Computing Lab,现在由两千多位贡献者共同维护,Apache-2.0 授权,GitHub 上接近 9 万星。它做的事情很具体:用 PagedAttention 把 KV cache 切成页来管理,用 continuous batching 让新请求随时插进正在跑的批次,再叠上 chunked prefill、prefix caching、CUDA graph 与投机解码。结果就是同样一张卡,吞吐能比朴素的 transformers 循环高出一个量级——这也是为什么几乎所有想把自己的模型做成线上接口的团队,最后都会绕回 vLLM。
但真正卡住大多数人的不是性能,是显存。vLLM 启动时默认按 gpu_memory_utilization=0.92 去占满显卡,先放权重,剩下的全部划给 KV cache。所以显存够不够只有一条算式:权重字节数 = 参数量 × 每参数字节数(bf16 是 2 字节,FP8/INT8 是 1 字节,4-bit 量化约 0.5 字节再加 scale 开销),算完还要留够 KV cache,否则 max_model_len 就得往下砍。一个 70B 模型 bf16 是 140GB,谁也变不出来;同一个模型压到 4-bit 大约 35–40GB,一张 48GB 卡就装得下。这个差别决定了你该租哪张卡。
还有一条硬门槛很多人第一次装才发现:vLLM 官方预编译 wheel 要求 NVIDIA 计算能力 7.5 或更高(T4、RTX 20 系、A100、L4、H100、B200 这一档)。也就是说 Tesla V100(7.0)和 Tesla P40(6.1)已经掉出官方支持线了。再往上还有架构差异——llm-compressor 的 FP8 W8A8 只在 Ada、Hopper 和 AMD 卡上可用,Ampere 的 A100、A6000、3090 走不了这条路,得改用 bf16 或 4-bit。这些不是玄学,是你租卡前必须知道的事。
01 —
vLLM 版本线与安装变体
生产用稳定版,尝鲜看预览通道;下面三列分别是覆盖能力、显存相关默认值、上下文与 KV 相关变化
| 版本 | 参数量 | 显存 | 上下文 | 说明 |
|---|---|---|---|---|
| v0.27.1(当前稳定版) | 200+ HuggingFace 模型架构,含 dense、MoE、混合状态空间、多模态、embedding 与 reward 模型 | gpu_memory_utilization 默认 0.92,kv-cache-dtype 默认 auto,dtype 默认 auto | max-model-len 不指定时按模型 config 自动推导 | v0.27.0 之后的补丁版,生产环境建议直接锁这一版;OpenAI 兼容接口之外还提供 Anthropic Messages API 与 gRPC。 |
| v0.27.0 | 新增 Kimi K3 全栈支持(kernel、Python 与 Rust 前端)、Qwen3.5 dense 与 MoE、K-EXAONE-2.0-750B-A37B、jina-embeddings-v5-text-nano | 量化侧新增 compressed-tensors 的 FP4 Qutlass、INC 的 MXFP8 线性层、AutoRound W4A16 MoE、TurboQuant KV 量化模式 | SM100 上的 FlashAttention 4 支持 FP8 KV cache 与 headdim-256 | 561 次提交、242 位贡献者。DeepSeek-V4 kernel 约 2 倍提速;依赖整体跳到 PyTorch 2.13.0、Triton 3.7.1、Transformers 5.14.1、FlashInfer 0.6.16.post3、NCCL 2.30.7——升级前先确认镜像。破坏性变更:移除 max_num_partial_prefills 与 max_long_partial_prefills,停止支持 Plamo2 与 Ouro。 |
| v0.26.0 | 引入 Inkling 模型家族,配 llm-compressor NVFP4 权重与 compressed-tensors 动态 FP8 | KV offloading 成熟:通用 P2P 二级存储层、可插拔淘汰策略、与并行方式无关的分层映射 | 支持按 attention group 分别选择后端 | generation 模型可以通过 head_dtype 让 lm_head 走 fp32,长尾采样更稳;显存吃紧时 KV 分层卸载是这一版最实用的新武器。 |
| v0.28.0rc1 / rc2(预览通道) | 面向下一代模型与内核的提前验证 | 沿用稳定版默认值 | — | 还没正式发版,API 与 flag 仍可能变动。适合在按秒计费的临时实例上验证新模型能不能跑,不建议直接上生产。 |
| 预编译 wheel 变体(cu128 / cu129 / cu130) | Python 3.10–3.13 | 最低 NVIDIA 计算能力 7.5(T4、RTX 20 系、A100、L4、H100、B200) | 默认 wheel 内置 CUDA 12.9,另有 CUDA 12.8 与 13.0 版本 | `uv pip install vllm --torch-backend=auto` 会按驱动自动挑 wheel。NVIDIA 之外还有 ROCm、CPU(x86/ARM/PowerPC)、TPU、Gaudi、Apple Silicon 的插件式后端。 |
02 —
按显存算完之后,该租哪张卡
权重 = 参数量 × 每参数字节数,剩下的留给 KV cache——下面每一档都是按这条算式选的
7B–14B bf16 或 32B 4-bit 量化,单卡起服务做联调与自测
RTX 4090 24GB$0.540/卡·时
Ada 架构,Marlin 内核和 llm-compressor 的 FP8 W8A8 都能用;8B bf16 权重约 16GB、32B AWQ 4-bit 约 18GB,24GB 装下之后还剩空间给 KV cache。
70B 4-bit 单卡常驻,或 32B bf16 想留长上下文
RTX A6000 48GB$0.817/卡·时
70B 压到 4-bit 权重约 35–40GB,48GB 单卡放得下还有余量,不必开张量并行,直接省掉 NCCL、/dev/shm 和 IPC_LOCK 那一整套排障。
70B bf16 双卡 tensor_parallel_size=2 上生产
A100 SXM4 80GB$1.088/卡·时
140GB 权重靠两张 80GB 刚好接住,SXM4 的 NVLink 让 TP 的 all-reduce 不至于成为瓶颈;注意 Ampere 用不了 llm-compressor FP8 W8A8,这一档就老实走 bf16。
DeepSeek-V4、Kimi K3 这类大 MoE,要 FP8 原生与超长上下文
H200 141GB$6.660/卡·时
Hopper 原生支持 FP8,141GB 单卡显存能少切几刀分片;MoE 记得配 enable_expert_parallel=True,专家并行度跟张量并行度一致。
03 —
四步把 vLLM 服务起起来
从空实例到能被 OpenAI SDK 直接调用,中间没有省略的步骤
- 01
开实例,装 vLLM
在 NexGPU 控制台选一张符合上面显存算式的卡,2000+ 预置镜像里已经有 PyTorch 和 vLLM 环境;想从干净环境自己装,官方推荐 uv,--torch-backend=auto 会按驱动自动选 cu128/cu129/cu130 的 wheel。
uv venv --python 3.12 --seed && source .venv/bin/activate && uv pip install vllm --torch-backend=auto - 02
启动 OpenAI 兼容服务
vllm serve 直接把模型变成 http://localhost:8000 上的 HTTP 服务。显存吃紧时先砍 max-model-len,它是最立竿见影的一档;单卡装不下再上 tensor-parallel-size,并行度一般设成卡数。
vllm serve <your-model> --tensor-parallel-size 2 --max-model-len 32768 --gpu-memory-utilization 0.92 - 03
用现成的客户端验证
接口路径就是 /v1/completions 与 /v1/chat/completions,api_key 随便填 EMPTY 即可。已有的 OpenAI SDK 代码只改 base_url 就能切过来,这也是很多团队从闭源 API 迁到自托管的最短路径。
curl http://localhost:8000/v1/completions -H "Content-Type: application/json" -d '{"model":"<your-model>","prompt":"San Francisco is a","max_tokens":7,"temperature":0}' - 04
调吞吐,处理抢占与 OOM
日志里出现 preemption 警告就说明 KV cache 不够用了(vLLM 默认走 RECOMPUTE 而不是 SWAP):调低 max-num-seqs 或 max-num-batched-tokens,或者加大并行度。chunked prefill 默认开启,max-num-batched-tokens 设小(如 2048)改善 token 间延迟,设到 8192 以上更利于吞吐。启动太慢就用 -O0 到 -O3 换取编译时间,或 VLLM_CACHE_ROOT 复用编译缓存、--kv-cache-memory 跳过显存 profiling。
vllm serve <your-model> --max-num-batched-tokens 8192 --max-num-seqs 64 --enable-prefix-caching
一笔算得清的账
先说调试期:单张 RTX 4090 24GB 是 $0.540/卡·时,一天开 8 小时连调 5 天,40 × $0.540 = $21.60,一顿饭的钱就把 7B–14B 的服务化流程跑通了。要上 70B bf16 生产服务,两张 A100 SXM4 80GB 做 tensor_parallel_size=2,2 × $1.088 = $2.176/时;整月常驻 720 小时就是 2.176 × 720 = $1,566.72。权重要长期留在盘上的话,140GB 按存储中位价 $0.414/GB·月 算,140 × 0.414 = $57.96/月,而且存储和算力是分开计费的——实例一停,$2.176/时 立刻不再走表,只有那 $57.96 的盘继续算,直到你把它销毁。想在上线前压一轮 H200 141GB 看真实吞吐,2 小时也就 2 × $6.660 = $13.32。按秒计费、无起租时长、无开通费、不用提配额申请,测完就关。
04 —
