跳到主要内容

推理运行时

vLLM 跑起来:显存怎么算、多卡怎么切、哪张卡真的能装

vLLM 不是模型,是把模型变成高并发服务的那层引擎。装它之前,你只需要先算清楚一件事:这张卡的显存,够不够放权重加 KV cache。

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 默认 automax-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-256561 次提交、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 动态 FP8KV 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 直接调用,中间没有省略的步骤

  1. 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
  2. 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
  3. 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}'
  4. 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 —

常见问题

vLLM 到底需要多大显存?有没有能直接套的公式

有:权重字节数 = 参数量 × 每参数字节数。bf16/fp16 是 2 字节,FP8 或 INT8 是 1 字节,4-bit 量化约 0.5 字节再加上量化 scale 的开销。所以 8B bf16 约 16GB、32B bf16 约 64GB、70B bf16 约 140GB;同样的 70B 压到 4-bit 大约 35–40GB。算完权重还得留 KV cache,vLLM 默认按 gpu_memory_utilization=0.92 占卡,把权重之外的部分全划给 KV,KV 不够就得调小 max-model-len。拿不准的话,在 NexGPU 上按秒开一张卡实测一次,比任何估算表都准,而且几毛钱的事。

vLLM 支持哪些显卡?我手上的 V100 和 P40 还能跑吗

官方预编译 wheel 要求 NVIDIA 计算能力 7.5 或更高,文档点名的是 T4、RTX 20 系、A100、L4、H100、B200 这一档。Tesla V100 是 7.0、Tesla P40 是 6.1,都在这条线以下,不在官方支持范围内。架构差异也要留意:Marlin 内核需要 Turing 及以上,且 Turing 不支持 Marlin MXFP4;llm-compressor 的 FP8 W8A8 只在 Ada、Hopper 和 AMD 上可用,Ampere 的 A100/A6000/3090 走不通。NexGPU 上从 Tesla T4 16GB($0.298/卡·时)到 H200 141GB($6.660/卡·时)都能直接开,不用为了试一个架构去买一张卡。

vLLM 和 Ollama、llama.cpp 有什么区别,我该用哪个

定位不一样。llama.cpp 和 Ollama 的强项是单机单人、GGUF 量化、CPU 也能凑合跑,适合本地把玩。vLLM 是奔着并发服务去的:PagedAttention 管 KV cache、continuous batching 让请求随到随进、chunked prefill 默认开启、prefix caching 复用公共前缀,多路并发下的吞吐完全是另一个量级,还自带 OpenAI 兼容接口、Anthropic Messages API 和 gRPC。判断标准很简单:只有你一个人用就选前者,要给一堆人或一个产品供接口就选 vLLM。想直接对比,在 NexGPU 上开同一张 RTX 4090 24GB 各跑一轮压测,两小时不到 $1.1 就有答案。

启动时报 OOM,或者日志一直刷 preemption 警告,怎么处理

按见效顺序来:先调小 max-model-len(最立竿见影),再降 max-num-seqs 和 max-num-batched-tokens,然后考虑加大 tensor-parallel-size 或 pipeline-parallel-size。vLLM 的抢占默认策略是 RECOMPUTE 而不是 SWAP,所以 preemption 刷屏本质上就是 KV cache 不够用。还有几个省显存的开关:enforce_eager=True 完全关掉图捕获,cudagraph_capture_sizes 只捕获少数几个批量大小,多模态场景用 limit_mm_per_prompt 和 mm_processor_cache_gb(默认 4 GiB)压一压。实在是卡太小,与其反复砍参数损失上下文,不如在 NexGPU 上换一张 RTX A6000 48GB($0.817/卡·时)——按秒计费,换卡的成本比你调一晚上参数低得多。

多卡该怎么切,tensor parallel 和 pipeline parallel 怎么选

官方建议很明确:单卡装不下先上张量并行,把张量并行度用满之后、或者要跨节点时,再叠流水线并行。tensor_parallel_size 和 pipeline_parallel_size 默认都是 1。MoE 模型要额外设 enable_expert_parallel=True,专家并行度与张量并行度相同;如果显存够、只是想扛更多请求,那用 data_parallel_size=N 复制整个模型比切分更划算。多卡踩坑最多的是通信层:ncclCommInitRank 报错通常是容器缺 IPC_LOCK 权限或 /dev/shm 没挂对,网卡认错就用 VLLM_HOST_IP 和 NCCL_SOCKET_IFNAME 指定。NexGPU 单节点最高支持 14 张卡、节点显存上限 2,152GB,TP 全在机内跑,能少一半这类问题。

自托管 vLLM 之后,原来调 OpenAI API 的代码要改多少

基本只改一行 base_url,指到 http://your-host:8000/v1,api_key 填 EMPTY。/v1/completions 和 /v1/chat/completions 都在,官方还额外提供 Anthropic Messages API 与 gRPC,迁移成本比大多数人想象的低。真正要花时间的是选卡和调吞吐,不是改代码。NexGPU 覆盖 51 个国家和地区、1,175 个已验证可租节点、2,498 张 GPU、75 种型号,SSH、Jupyter、Web 终端、REST API、CLI 都能进,2000+ 预置镜像里 vLLM 和 PyTorch 都是现成的,Telegram 上中英文双语支持、不排工单队列。

开始使用 NexGPU

无论你是企业研发团队还是独立开发者,都可以在几分钟内跑起第一个任务。

注册即可浏览全网实时价格,无需绑定支付方式。