本篇目标:掌握多卡并行配置、学会压测工具、能处理常见报错、理解显存精细管理
前置要求:已完成第③篇基础篇,成功跑起单卡服务。
第一步:多卡部署(RTX 5090 双卡示例)
如果你有两张 RTX 5090(或者两张 4090),可以让 vLLM 把模型切分到两张卡上:
bash
vllm serve Qwen/Qwen2.5-32B-Instruct \
--tensor-parallel-size 2 \
--quantization fp8 \
--max-model-len 8192 \
--port 8001
--tensor-parallel-size 2 告诉 vLLM:「把模型切成两半,分别放在两张卡上,然后协同推理。」
💡 双 RTX 5090 能跑多大? 32B Q4 量化约 20GB,配合 fp8 双卡可以跑起来。这样你就有能力跑 Qwen2.5-32B、Mistral-34B 等大模型了。
检查两张卡是否都在工作:
打开另一个终端,输入:
bash
nvidia-smi
你会看到两个 GPU 进程,显存都在被使用。
多卡部署注意事项
| 问题 | 说明 |
|---|---|
| 显卡型号要一致 | 两张卡最好是同型号(如两张 5090),显存大小要一致 |
| NVLink 更快 | 如果有 NVLink,多卡通信更快;没有也能跑,PCIe 带宽够用 |
| 模型要支持 | 大部分主流模型都支持,遇到报错看 FAQ 部分 |
第二步:用 bench serve 做压测
vLLM 自带了一个压测工具 bench serve,可以用来测试吞吐量。
安装依赖
bash
pip install aiohttp
启动服务(如果还没启动)
bash
vllm serve Qwen/Qwen2.5-14B-Instruct \
--tensor-parallel-size 1 \
--quantization fp8 \
--port 8000
运行压测
另开一个终端:
bash
vllm bench serve \
--model Qwen/Qwen2.5-14B-Instruct \
--backend vllm \
--num-prompts 100 \
--max-concurrency 10 \
--endpoint /v1/chat/completions
参数解释:
| 参数 | 含义 |
|---|---|
--num-prompts |
总共发多少个请求 |
--max-concurrency |
同时最多多少个并发 |
--endpoint |
API 端点路径 |
压测结果怎么看?
压测完成后会输出几个关键指标:
| 指标 | 含义 | 好的范围 |
|---|---|---|
| TTFT | 首 token 延迟(用户等第一个字的时间) | < 1s |
| TPOT | 每个 token 的平均生成时间 | < 50ms |
| Throughput | 吞吐量(token/s) | 越高越好 |
| Success Rate | 成功率 | 100% |
💡 RTX 5090 + Qwen2.5-14B + fp8:单卡 Throughput 通常可达 80~120 tok/s(取决于并发数)
第三步:显存精细管理
问题:显存不释放怎么办?
这是 vLLM 最常见的困扰:模型加载后一直占着显存,我想换别的程序跑怎么办?
方法一:重启服务(最简单)
bash
# Ctrl+C 停掉当前服务
# 然后重启,或者启动另一个模型的服务
方法二:用 torch.cuda.empty_cache()
如果你用 Python 代码管理 vLLM,可以在换模型前手动清理显存:
python
import torch
torch.cuda.empty_cache() # 清理未使用的显存缓存
torch.cuda.synchronize() # 等待所有 GPU 操作完成
方法三:限制 vLLM 的显存使用
启动时加上 --gpu-memory-utilization 参数,限制 vLLM 最多用多少显存:
bash
vllm serve Qwen/Qwen2.5-14B-Instruct \
--gpu-memory-utilization 0.8 \
--port 8000
这样 vLLM 最多用 80% 的显存,留 20% 给其他程序。
第四步:RTX 5090 + vLLM 显存配置参考
| 模型 | 量化 | 上下文长度 | 显存占用 | RTX 5090 能否跑 |
|---|---|---|---|---|
| Qwen2.5-7B | fp8 | 4K | ~8GB | ✅ 轻松 |
| Qwen2.5-7B | fp8 | 8K | ~10GB | ✅ 轻松 |
| Qwen2.5-14B | fp8 | 4K | ~14GB | ✅ 可以 |
| Qwen2.5-14B | fp8 | 8K | ~20GB | ✅ 妥妥够 |
| Qwen2.5-32B | fp8 | 4K | ~26GB | ⚠️ 双卡推荐 |
| Qwen2.5-32B | fp8 | 8K | ~30GB | ⚠️ 双卡推荐 |
第五步:常见报错 FAQ
❌ 报错:CUDA out of memory
原因 :显存不够,模型太大了。
解决:
- 降低
max-model-len(上下文短一点,显存少用很多) - 换成更小的量化(
fp8→int8) - 换成更小的模型(14B → 7B)
- 清理其他占用显存的程序:
nvidia-smi查看进程
❌ 报错:RuntimeError: NCCL error in: ...
原因 :多卡并行时 NCCL(NVIDIA 通信库)初始化失败,通常是 CUDA 版本或驱动问题。
解决:
bash
# 检查 CUDA 版本
nvcc --version
# 确保 NCCL 安装正确
pip install nccl
# 单卡部署先跑通,再尝试多卡
❌ 报错:ValueError: Model is not supported with tensor parallel
原因 :有些模型不支持张量并行,或者 --tensor-parallel-size 设的值和实际显卡数量不匹配。
解决:
- 检查显卡数量:
nvidia-smi -L - 确保
--tensor-parallel-size不超过实际显卡数 - 换回单卡:
--tensor-parallel-size 1
❌ 报错:ImportError: cannot import name 'LlamaForCausalLM'
原因 :vLLM 版本和模型不兼容,或者模型格式不支持。
解决:
bash
# 升级到最新版 vLLM
pip install --upgrade vllm
# 或者换用 HuggingFace 原生格式的模型
❌ 报错:服务启动后第一个请求特别慢
原因 :正常现象。vLLM 模型常驻显存,但第一个请求还是要做 Prefill(预填充),会比较慢。后续请求因为 KV Cache 命中率高,会快很多。
解决:这是设计如此,不是报错。可以先发一个「预热」请求,然后再开始正式使用。
本篇小结
| 你做到了 | 说明 |
|---|---|
| ✅ 多卡并行配置 | tensor-parallel-size 2 |
| ✅ 压测工具使用 | bench serve |
| ✅ 显存精细管理 | empty_cache() / --gpu-memory-utilization |
| ✅ RTX 5090 显存配置参考 | 7B~32B 模型对照表 |
| ✅ 常见报错处理 | OOM / NCCL / 模型不支持 |
下一步
- 想完全不用命令行?
- 想搞懂三工具到底怎么选?
- 想看公开 benchmark 数据?
vLLM 是三个工具里配置门槛最高的,但也是生产性能最强的。如果你的场景需要对外服务,vLLM 值得投入精力配置好。