站长在最近半年的运维日志里,遇到最多的一类求助就是关于大模型推理加速框架vllm部署的实战方案。很多朋友按照官方文档走了一遍,结果要么是启动时直接报 CUDA out of memory,要么是服务跑起来后吞吐量只有个位数 tokens/s,甚至不如直接用 transformers 原生推理。这其实不是 vllm 本身的问题,而是部署参数、显存分配策略和请求调度逻辑没有对齐你的硬件和模型结构。站长今天就把这些踩过的坑逐一拆开,给出可直接复现的实战方案。
一、现象诊断:vllm 部署后最常见的三类故障
⚡ 【免费资源】DeepSeek/Ollama 部署排错手册 + 全套 AI 提示词资料包
站长已将大模型部署排错指南、常用环境配置文件及 AI 提效指令库整合分享至夸克网盘,可极速免费转存:
站长把社区和实际运维中遇到的报错做了归类,基本跑不出下面这三种情况:
- 启动即崩:日志最后一行通常是
torch.cuda.OutOfMemoryError或RuntimeError: CUDA error: out of memory,模型权重还没加载完就退出。 - 服务假活:进程在,端口通,但请求发过去一直 pending,客户端超时,服务端日志没有明显报错。
- 吞吐极低:GPU 利用率长期低于 30%,并发请求排队严重,首 token 延迟和单 token 延迟都高得离谱。
这三种现象背后的根因完全不同,不能一概而论。站长建议先看启动日志里 gpu_memory_utilization 的分配结果,再看请求调度时的 max_num_seqs 和 max_model_len 是否合理。
二、原因分析:为什么你的 vllm 跑不起来或跑不快
1. 显存分配参数与模型实际占用不匹配
vllm 默认的 gpu_memory_utilization 是 0.9,意思是把 90% 的显存拿来做 KV Cache 和模型权重。但很多人在一张卡上同时跑多个服务,或者模型本身是 FP16 精度,权重就已经占掉大半显存,留给 KV Cache 的空间非常小。一旦请求的上下文长度超过预分配的 block 数量,就会触发显存溢出。
2. 张量并行度设置错误
张量并行需要模型层数能被并行数整除。站长见过有人用 3 卡跑 7B 模型,设置 tensor_parallel_size=3,结果直接报维度不匹配。另外,张量并行会引入额外的通信开销,如果卡之间没有 NVLink,吞吐反而可能下降。
3. 请求长度分布与调度策略冲突
vllm 的 PagedAttention 对长请求和短请求混合的场景非常敏感。如果 max_model_len 设置得过大,比如直接拉到 32768,那么每个请求占用的 block 数会很多,并发度就上不去。反过来,如果设置得太小,长文本请求会被直接拒绝。
三、分步解决代码:从零搭建可用的 vllm 服务
💡 关联延伸阅读:如果你在配置过程中遇到相关报错,请参阅站长之前的解决教程:在win11上部署大模型推理加速工具vllm配置实战避坑指南:手把手步骤拆解
下面这套流程是站长在单卡 A100 和多卡 A800 环境都验证过的方案,按顺序执行即可。
步骤 1:确认环境与依赖版本
# 创建独立环境,避免依赖冲突
conda create -n vllm_env python=3.10 -y
conda activate vllm_env
# 安装 vllm,注意 torch 版本要匹配 CUDA 驱动
pip install vllm==0.4.2
pip install torch==2.1.2 torchvision==0.16.2 --index-url https://download.pytorch.org/whl/cu121
# 验证安装
python -c "import vllm; print(vllm.__version__)"
步骤 2:启动服务时显式控制显存与并行参数
# 单卡场景,模型为 7B,上下文限制在 8192
python -m vllm.entrypoints.openai.api_server \
--model /data/models/Qwen2-7B-Instruct \
--served-model-name qwen2-7b \
--tensor-parallel-size 1 \
--gpu-memory-utilization 0.85 \
--max-model-len 8192 \
--max-num-seqs 64 \
--dtype half \
--port 8000 \
--host 0.0.0.0
# 多卡场景,4 卡张量并行,模型为 72B
python -m vllm.entrypoints.openai.api_server \
--model /data/models/Qwen2-72B-Instruct \
--tensor-parallel-size 4 \
--gpu-memory-utilization 0.9 \
--max-model-len 4096 \
--max-num-seqs 32 \
--dtype bfloat16 \
--port 8000
站长提醒:
gpu_memory_utilization不要盲目设 0.95,留 5% 给 CUDA 上下文和临时缓冲区。如果启动时仍然 OOM,先把max-model-len降到 2048 再试,确认能起来后再逐步往上加。
步骤 3:验证服务与压测吞吐
# 简单连通性测试
curl http://localhost:8000/v1/models
# 发送推理请求
curl http://localhost:8000/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen2-7b",
"prompt": "请解释什么是 PagedAttention",
"max_tokens": 128,
"temperature": 0.7
}'
# 使用 vllm 自带的 benchmark 工具压测
python -m vllm.entrypoints.benchmark_serving \
--backend openai \
--base-url http://localhost:8000 \
--model qwen2-7b \
--dataset-name sharegpt \
--num-prompts 200 \
--request-rate 10
步骤 4:根据压测结果调优
如果压测显示吞吐低,优先调整 max-num-seqs。站长在 A100 上实测,7B 模型把 max-num-seqs 从 16 提到 64,吞吐能提升近 2 倍。如果延迟高,检查 max-model-len 是否过大,适当降低可以减少每个请求的 block 占用,提高并发调度效率。
四、FAQ 常见疑问解答
Q1:启动时报 “The model’s max seq len is larger than the maximum number of blocks” 怎么办?
这是 KV Cache 空间不足的典型报错。站长建议先降低 max-model-len,或者提高 gpu-memory-utilization。如果显存实在不够,可以开启量化,比如使用 AWQ 或 GPTQ 量化后的模型,权重占用能减少一半左右。
Q2:多卡部署时吞吐没有线性提升,甚至下降?
检查卡间通信带宽。张量并行对通信延迟非常敏感,如果卡之间走的是 PCIe 而不是 NVLink,并行数越大通信开销越大。站长建议在这种情况下改用流水线并行,或者直接单卡跑小模型。
Q3:请求量大了之后服务端不响应,但 GPU 利用率很低?
大概率是 max-num-seqs 设得太小,请求在队列里排队。另外检查客户端是否开启了连接池,如果每个请求都新建 TCP 连接,服务端的调度线程会被连接建立过程拖慢。站长建议客户端使用 HTTP 长连接,并适当提高 max-num-seqs。
Q4:vllm 支持流式输出吗?如何开启?
支持。在请求体里加上 "stream": true 即可。站长提醒,流式输出时如果客户端读取速度慢,会反压服务端的生成速度,所以压测时要注意客户端的消费能力。
Q5:如何判断当前配置是否已经最优?
看两个指标:GPU 利用率和请求排队时间。如果 GPU 利用率长期高于 80% 且排队时间短,说明配置合理。如果利用率低但排队时间长,说明调度参数有问题,重点调 max-num-seqs 和 max-model-len。
站长最后总结一句:大模型推理加速框架vllm部署的实战方案核心不在于把参数拉满,而在于让显存分配、并行度和请求调度三者匹配你的实际业务流量。先把服务稳定跑起来,再通过压测逐步调优,比一上来就追求极限吞吐要靠谱得多。
相关 AI 排错与深度技术延伸
⚡ 开发者实操必备资源与算力限时特惠通道
阅读完本教程准备实操?站长已将 AI 部署排错手册、提示词全集与服务器限时优惠整理如下,即拿即用: