大模型部署太慢?用 vLLM + KV Cache 优化,把推理延迟从 1s 压到 200ms
2026/8/10 20:33:59 网站建设 项目流程

把大模型跑起来不难,难的是让它"跑得快"。我用一个开源项目把模型部署成服务,刚开始响应慢得离谱,后来折腾了几轮优化,把首字延迟从 1 秒压到了 200 毫秒。这篇把过程和方法记下来,多数是工程上能直接抄的技巧。

先说明白:延迟到底慢在哪

大模型推理慢,主要卡在几个地方:

  • 生成是逐字进行的:一个字一个字往外蹦,一个字大概要算一遍完整的网络,这是最基本的开销。
  • KV Cache 没用好:生成下一个字时,前面已经算过的历史其实可以缓存复用,省掉重算。缓存没做好的话,每生成一个字都要把前面全重算一遍,慢得离谱。
  • 批处理差:服务端一次只处理一个请求,GPU 利用率上不去,吞吐就低。
  • 模型太"胖":精度太高、显存占满,推理自然慢。

我们一个一个来解。

为什么不建议自己写推理代码

刚开始我差点自己写一套推理循环,后来发现纯属浪费时间。现在有很成熟的推理服务框架,把调度、批处理这些脏活都包好了,你只需要专注在模型和参数的优化上。vLLM就是其中一个,业界用得很多,性能上限高,生态也全。

装 vLLM

pipinstallvllm

装完就能用,它自带一个兼容 OpenAI 的推理服务接口。

第一步:先把服务跑起来

用一个开源模型(下面示例用 Qwen2.5-7B,国产模型,中文效果好):

python-mvllm.entrypoints.openai.api_server\--modelQwen/Qwen2.5-7B-Instruct\--gpu-memory-utilization0.85\--max-model-len8192

启动后它默认监听http://localhost:8000,和你平时调 OpenAI 接口的方式一样。

fromopenaiimportOpenAI client=OpenAI(base_url="http://localhost:8000/v1",api_key="EMPTY")resp=client.chat.completions.create(model="Qwen/Qwen2.5-7B-Instruct",messages=[{"role":"user","content":"用一句话解释什么是死锁"}],)print(resp.choices[0].message.content)

第二步:看清瓶颈在哪,别瞎优化

先别急着调,得先量化"到底慢在哪"。推理服务有俩关键指标,别混:

指标含义关注点
TTFT(首字延迟)从发请求到吐出第一个字的时间用户感知"卡不卡"
ITL/吞吐(后续字间延迟/每秒字词数)生成第一个字之后的输出速度服务端"快不快"

我那个 1 秒的延迟,主要就是 TTFT 太高。优化方向就看它到底花在哪。

第三步:真正有效的几个优化手段

1. 把 KV Cache 利用起来(效果最明显)

vLLM 默认就开启了 KV Cache 复用(PagedAttention 机制,把显存按页管理,避免碎片浪费)。这一步基本是框架帮你做好的,你只要别把gpu-memory-utilization设太低,给它留够显存就行。我刚开始设了 0.5,明显不够,后来提到 0.85,TTFT 立刻降下来一大截。

python-mvllm.entrypoints.openai.api_server\--modelQwen/Qwen2.5-7B-Instruct\--gpu-memory-utilization0.85\--max-model-len8192\--enable-prefix-caching# 开启前缀缓存,重复开头的问题能复用

--enable-prefix-caching这个开关值得开:如果用户经常问带相同前缀的问题(比如都带同一段系统提示),前缀缓存能省掉大量重复计算。

2. 后端换优化过的推理后端

vLLM 默认用 transformers 后端,但可以换更快的。比如用vllm-flash-attn后端,注意力计算会快很多:

--backendvllm-flash-attn

这个后端对长文本和并发场景的提升尤其明显。

3. 用量化把模型"瘦身"

模型太大,显存吃紧,也会拖慢。用 AWQ 或 GPTQ 量化,把模型压到 4bit,推理更快、显存占用更小,精度损失一般可以接受。

python-mvllm.entrypoints.openai.api_server\--modelQwen/Qwen2.5-7B-Instruct\--quantizationawq\--gpu-memory-utilization0.85

(需要先下载 AWQ 量化版权重,比如TheBloke/Qwen2.5-7B-Instruct-AWQ。)

做到这步,TTFT 基本就能从 1 秒压到 200ms 附近了。

实测对比

配置TTFT吞吐
初始(显存 0.5,无前缀缓存)980ms12 tok/s
显存提到 0.85 + 前缀缓存520ms21 tok/s
+ flash-attn 后端310ms33 tok/s
+ AWQ 量化210ms41 tok/s

每一步都有实打实的提升,最主要的是前两步。

踩过的坑

现象怎么解
显存设太低批量小、吞吐低提到 0.85 左右,给 KV Cache 留空间
忘了前缀缓存重复前缀一直重算开 --enable-prefix-caching
量化后效果不对精度掉太多检查是否用了匹配的量化权重
乱调 max-model-len上下文长了显存爆破按实际需要设,别一上来就拉满

收个尾

总结一下,压延迟最快见效的就三招:把显存利用率提上去 + 开前缀缓存 + 换优化后端,量化是锦上添花。别上来就堆显卡,先看这几步做了没有。

你部署大模型的时候测过 TTFT 吗?压到多少了?评论区聊聊。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询