vLLM多GPU张量并行大模型推理实操教程
为什么需要多GPU张量并行
大语言模型动辄几十亿甚至上千亿参数,单张GPU显存根本装不下。
vLLM的张量并行(Tensor Parallelism)能把一个模型的权重切分到多张GPU上,让每张卡只持有部分参数,推理时协同计算。
本文面向需要部署大模型但只有多卡(如2×A100、4×3090等)的用户,讲清楚从零启动到验证的全流程。
第一步:准备硬件与软件环境
硬件要求
- 至少2块NVIDIA GPU,推荐同型号(跨型号也可但性能可能受PCIe带宽影响)。
- 显存总量至少要大于模型权重占用 + KV Cache(vLLM会动态分配)。
- NVIDIA驱动版本 ≥ 535,CUDA ≥ 12.1(vLLM 0.4+要求)。
安装vLLM
建议在Python虚拟环境中安装,避免依赖冲突:
python3 -m venv vllm_env
source vllm_env/bin/activate
pip install vllm # 自动安装PyTorch等依赖
如果网络慢,可使用国内镜像:pip install vllm -i https://pypi.tuna.tsinghua.edu.cn/simple。
验证安装:执行 python -c "import vllm; print(vllm.__version__)" 无报错即成功。
第二步:启动多GPU张量并行推理服务
vLLM通过 --tensor-parallel-size 参数控制参与张量并行的GPU数量。
假设你有4张卡,想全部用于张量并行,启动命令如下:
python -m vllm.entrypoints.openai.api_server \
--model /path/to/your/model \
--tensor-parallel-size 4 \
--gpu-memory-utilization 0.9 \
--port 8000
--model:支持HuggingFace模型ID(如Qwen/Qwen2-7B-Instruct)或本地路径。--tensor-parallel-size 4:告诉vLLM使用4张GPU做张量并行。--gpu-memory-utilization 0.9:预留10%显存给其他进程,防止OOM。--port 8000:API服务端口。
启动后观察日志,看到 INFO: Uvicorn running on http://0.0.0.0:8000 即为成功。
可以用 nvidia-smi 查看每张GPU显存均有占用。
第三步:调用API验证推理效果
vLLM兼容OpenAI API格式,用curl或Python requests测试:
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "/path/to/your/model",
"messages": [{"role": "user", "content": "你好,请介绍一下张量并行"}],
"temperature": 0.7,
"max_tokens": 200
}'
返回结果中 usage 字段会显示 prompt_tokens 和 completion_tokens,说明推理正常执行。
避坑指南:新手最常遇到的三个问题
1. CUDA out of memory 显存不足
- 降低
--gpu-memory-utilization到0.8或更低。 - 减少
--max-model-len(默认4096),例如设置--max-model-len 2048。 - 确认模型实际大小与显存匹配:7B模型约需16GB,13B约需32GB,70B需更大显存。
2. 张量并行生效但性能提升不明显
- 检查PCIe带宽:
nvidia-smi topo -m查看GPU拓扑,如果跨NUMA或使用CPU通信会慢。 - 小批量请求时张量并行优势不大,建议压测时
num_prompts=100以上。
3. 模型不支持张量并行
- 部分HuggingFace模型实现未适配
from_pretrained的device_map="auto",vLLM内部自动处理,但不支持所有模型。建议使用主流通用架构(LLaMA、Qwen、Baichuan等)。 - 如果报错
ValueError: This model is not supported...,可换用官方支持的模型列表中的模型。
效果验证:实测多GPU加速比
执行以下压测脚本(保存为bench.py):
from openai import OpenAI
import time
client = OpenAI(base_url="http://localhost:8000/v1", api_key="-")
prompt = "请用300字解释量子计算原理"
start = time.time()
for _ in range(10):
client.completions.create(model="/path/to/model", prompt=prompt, max_tokens=500)
end = time.time()
print(f"平均请求耗时: {(end-start)/10:.2f} 秒")
对比单GPU(--tensor-parallel-size 1)和多GPU的结果。
一般来说,2卡张量并行可获得1.6-1.9倍加速,4卡约2.5-3.5倍(受通信开销影响)。
常见问题FAQ
Q:vLLM必须使用张量并行才能用多卡吗?
A:不是。vLLM还支持流水线并行(--pipeline-parallel-size),但张量并行更常用且延迟更低。对于小型模型(如7B以下),单卡即可,多卡建议直接用张量并行。
Q:能不能动态调整张量并行卡数?
A:不能。启动时指定--tensor-parallel-size后即固定;若需更改必须重启服务。
Q:使用两卡时显存利用不均匀怎么办?
A:可能是模型切分后各层大小差异导致。vLLM内部做了负载均衡,差异在10%以内正常。如果差距过大,检查驱动或CUDA版本。
---
如果你在执行过程中遇到其他问题,建议先检查日志中的 ERROR 行,并确认模型路径和参数拼写。
vLLM官方文档和GitHub Issues是很好的排错资源。
祝你部署顺利!