vLLM推理服务2026:把开源模型部署成生产API
vLLM推理服务2026:把开源模型部署成生产API。模型选好了,接下来要回答的是工程问题:怎么让它同时服务几十个人、延迟稳定、接口和 OpenAI 兼容、出问题能查
vLLM推理服务2026:把开源模型部署成生产API
模型选好了,接下来要回答的是工程问题:怎么让它同时服务几十个人、延迟稳定、接口和 OpenAI 兼容、出问题能查。vLLM 是 2026 年做这件事最主流的开源方案。这篇按起服务、配参数、压测、上监控的顺序讲,最后说清楚什么情况下不该用它。
一、它快在哪
两个机制撑起了 vLLM 的性能:
- PagedAttention:把 KV 缓存切成固定大小的块按需分配,像操作系统的虚拟内存分页。显存碎片大幅减少,同样的卡能塞下更多并发请求和更长的上下文
- 连续批处理:不等一整批请求凑齐才开跑,谁先到谁先算,一步生成完就腾出位置给新请求。GPU 空转时间被压到很低
两者叠加,同样硬件下总吞吐相比朴素逐请求服务能高出数倍,具体倍数看模型大小、序列长度和并发模式,官方基准给的区间偏乐观,自己的负载必须自己测。
二、最简部署
pip install vllm
vllm serve Qwen/Qwen2.5-7B-Instruct \
--port 8000 \
--max-model-len 8192 \
--gpu-memory-utilization 0.90
服务起来后就是 OpenAI 兼容接口:
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen2.5-7B-Instruct",
"messages": [{"role": "user", "content": "你好"}]
}'
客户端代码只改 base_url:
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="none")
resp = client.chat.completions.create(
model="Qwen/Qwen2.5-7B-Instruct",
messages=[{"role": "user", "content": "用三句话解释什么是PagedAttention"}],
)
print(resp.choices[0].message.content)
接口兼容是 vLLM 最实用的特性:你的应用代码不用为换推理引擎重写。
容器化部署用官方镜像 vllm/vllm-openai,启动命令作为参数传进去,注意挂载模型缓存目录,否则每次重启都要重新下载权重。
三、核心参数表
| 参数 | 作用 | 怎么设 |
|---|---|---|
| --model | 模型路径或 HuggingFace 名称 | 本地权重给绝对路径 |
| --tensor-parallel-size | 张量并行卡数 | 等于参与推理的 GPU 数 |
| --gpu-memory-utilization | 预分配显存比例 | 0.85-0.92,留余量给其他进程 |
| --max-model-len | 单请求最大上下文 | 按业务需要设,设太大吃显存 |
| --max-num-seqs | 同时处理的序列数 | 高吞吐调大,低延迟调小 |
| --quantization | 量化方式 | awq / gptq / fp8,需权重匹配 |
| --dtype | 计算精度 | 一般 auto 即可 |
| --enable-prefix-caching | 前缀缓存 | 系统提示词固定时开启收益明显 |
| --api-key | 接口鉴权 | 对外提供服务必设 |
显存估算的粗算法:参数量乘每参数字节数,再加 KV 缓存。7B 模型 FP16 约 14GB 权重,加上缓存,16GB 卡要跑得舒服得做量化或限制上下文长度。AWQ、GPTQ 这类 4bit 量化能把权重压到约四分之一,代价是少量精度损失,多数业务场景察觉不到。
四、吞吐和延迟是一对矛盾
调参前先明确目标:
| 目标 | 调整方向 |
|---|---|
| 单位时间服务更多请求 | 提高 max-num-seqs,接受更高的 p95 延迟 |
| 单请求响应更快 | 降低并发,启用投机解码,缩短上下文 |
| 长文档场景 | 提高 max-model-len,同时减少并发 |
| 多轮对话 | 开前缀缓存,把固定系统提示词放最前面 |
压测工具用 vllm bench serve 或任意 OpenAI 兼容压测脚本,看四个数:请求吞吐、输出 token 吞吐、p50 延迟、p95 延迟。只看平均值会被长尾掩盖,交互式应用里 p95 才是用户体感。
一个常见误区是把 max-num-seqs 拉到很大就以为吞吐会线性上升。实际情况是到某个点后,KV 缓存占满显存,新请求开始排队甚至被拒绝,吞吐反而下降。找到拐点比盲目调大有用。
五、上生产要补的东西
- 监控:vLLM 暴露 Prometheus 指标,重点看队列深度、KV 缓存使用率、运行中请求数
- 扩缩容:按 GPU 利用率或队列长度扩,不要按 CPU 指标
- 负载均衡:多副本前挂 Nginx 或网关,注意长请求的超时设置
- 鉴权与配额:
--api-key只解决入口,按用户限流要在网关层做 - 日志:记录请求量、token 数、错误码,用于成本核算和故障排查
- 模型热更新:换模型版本需要重启服务,用滚动更新避免中断
六、什么情况别用 vLLM
- 显卡小:8GB 显存跑 7B 模型很勉强,Ollama 或 llama.cpp 的量化方案更实际
- 纯 CPU:vLLM 为 GPU 设计,CPU 场景用 llama.cpp server
- 单人本地使用:Ollama 一条命令就够,vLLM 的启动开销和配置复杂度是浪费
- 需要图形界面:vLLM 只提供 API,要界面配 Open WebUI
- 极致吞吐的极限场景:SGLang 这类方案在特定负载下更强,值得对比测试
七、三行命令起步的顺序
第一天先用默认参数把服务跑起来,用 curl 确认接口通。第二天接上你的应用,跑真实请求看延迟。第三天再动 max-num-seqs 和量化,每次只改一个参数并记录指标。一次改五个参数,出问题无法归因。
八、成本怎么算
自建推理的成本主要三块:显卡折旧或租用、电费、运维人力。做预算时按下面的顺序估:
- 峰值并发:同时在线多少人,每人平均多久发一次请求
- 每次请求的 token 量:输入含检索片段的长度,输出长度
- 每秒能出多少 token:自己压测得到,别用厂商宣传值
- 用峰值并发乘单请求时长,得出需要多少并行槽位,再反推需要几张卡
常见误判是按用户数估容量。一百个注册用户可能只有五个同时在线,也可能五十个同时在线,差别全在业务场景。按并发估,不按人数估。
单卡够用时,把 --gpu-memory-utilization 留出一成余量给系统和其他进程;多卡时,张量并行能服务更大的模型,但卡间通信有开销,两张卡跑小模型的吞吐提升往往不到两倍,性价比要实测。
常见问题
Q:启动报显存不足怎么办?
A:按顺序试:降低 --gpu-memory-utilization、缩短 --max-model-len、换量化权重、减少 --max-num-seqs。还不行就是卡太小,换小参数模型。
Q:能同时加载多个模型吗?
A:一个服务实例服务一个模型,多模型起多个实例,前面挂网关按模型名路由。这是标准做法,比在单进程里动态加载稳。
Q:量化后效果下降明显吗?
A:4bit 量化在多数通用任务上差异很小,长链推理和代码生成这类任务上损失更容易看出来。上线前用你的测试集对比一次,别凭感觉。
Q:支持工具调用吗?
A:支持,需要按模型的对话模板启动工具调用解析参数(不同模型对应的解析器不同),具体名称以官方文档为准。
相关文章
本站文章由编辑人工撰写,收录的工具均经过实测或公开资料核验。文中链接指向工具官网或 GitHub 仓库,仅作信息参考,不构成付费推广。