大模型应用真正进入生产环境后,团队很快会遇到一个很现实的问题:模型能跑起来,不代表能稳定、低成本、高并发地跑起来。
在 Demo 阶段,我们可能只关心模型回答是否准确;但一旦面向真实用户,就必须考虑:
- 首 token 响应是否足够快?
- 多用户并发时延迟是否可控?
- GPU 显存是否撑得住?
- 单次请求成本是否过高?
- 长上下文场景会不会拖垮服务?
- 模型部署是否方便扩缩容?
因此,在 AI 工程落地中,大模型推理优化是一个非常重要的细分方向。它不直接决定模型“聪不聪明”,但决定模型能不能以合理成本服务真实业务。
本文从工程视角介绍大模型推理优化中的几个核心技术点:KV Cache、批处理、量化、推理框架选择与服务化部署。
一、大模型推理为什么慢?
大模型推理的本质是自回归生成。简单理解,就是模型不是一次性生成完整答案,而是一个 token 一个 token 地往外吐。
例如用户问:
text
请解释一下什么是 RAG模型生成答案时,可能是:
text
RRARAGRAG 是RAG 是一种...每生成一个新 token,都需要基于前面所有 token 继续计算。因此,输出越长,推理耗时越明显。
大模型推理通常分为两个阶段:
text
Prefill 阶段:处理用户输入 promptDecode 阶段:逐 token 生成回答1. Prefill 阶段
Prefill 负责一次性处理输入内容。
如果 prompt 很长,比如包含大量知识库上下文、历史对话、代码文件内容,那么 Prefill 会比较耗时。
2. Decode 阶段
Decode 阶段逐 token 生成答案。
每生成一个 token,都要执行一次模型前向计算,所以输出越长,耗时越高。
在实际服务中,用户经常感知到两个指标:
- TTFT(Time To First Token):首 token 延迟
- TPOT(Time Per Output Token):每个输出 token 的平均耗时
前者影响用户是否觉得“响应快”,后者影响整体生成速度。
二、KV Cache:大模型推理加速的基础
Transformer 模型在生成文本时,需要用注意力机制计算当前 token 与历史 token 的关系。
如果每生成一个新 token,都重新计算之前所有 token 的 Key 和 Value,会造成大量重复计算。
KV Cache 的作用就是:把历史 token 的 Key、Value 缓存下来,后续生成时直接复用。
简化理解:
text
第 1 次生成:计算 token1 的 K/V,缓存第 2 次生成:复用 token1 的 K/V,只计算 token2第 3 次生成:复用 token1、token2 的 K/V,只计算 token3这样可以显著降低 Decode 阶段的重复计算。
不过,KV Cache 也带来一个问题:占显存。
上下文越长、并发越高、模型层数越多,KV Cache 占用的显存就越大。
一个粗略公式可以理解为:
text
KV Cache 显存 ≈ batch_size × seq_len × num_layers × hidden_size × 2 × dtype_size其中:
- batch_size:并发请求数量
- seq_len:上下文长度
- num_layers:模型层数
- hidden_size:隐藏层维度
- 2:Key 和 Value
- dtype_size:数据类型大小,比如 FP16 是 2 字节
这也是为什么长上下文大模型部署成本很高。
三、PagedAttention:解决 KV Cache 显存碎片问题
传统 KV Cache 通常为每个请求预留连续显存。但真实服务中,每个用户输入长度不同、输出长度不同,如果直接分配连续空间,很容易造成显存浪费和碎片化。
vLLM 提出的 PagedAttention 借鉴了操作系统分页思想,把 KV Cache 划分成固定大小的 block。
这样做的好处是:
- 不需要为每个请求预留大块连续显存
- 可以更灵活地复用 KV Cache 空间
- 支持更高并发
- 显存利用率更高
可以简单类比为:
text
传统方式:每个请求分配一整块连续空间PagedAttention:每个请求按需占用多个小块页面在生产环境中,如果服务存在大量并发请求,PagedAttention 往往能显著提升吞吐量。
这也是 vLLM 成为大模型推理服务热门框架的重要原因之一。
四、Continuous Batching:提高 GPU 利用率
大模型推理时,GPU 最怕“吃不饱”。
如果一次只处理一个请求,GPU 可能有大量计算资源闲置。批处理可以把多个请求合并起来一起算,提高吞吐量。
传统 batching 的问题是:必须等一批请求都完成,才能开始下一批。
但大模型生成长度不同,有的用户回答 20 个 token 就结束,有的用户要生成 1000 个 token。如果按固定 batch 执行,会出现短请求等待长请求的问题。
Continuous Batching,也叫动态批处理,可以在每一步生成时动态加入新请求、移除已完成请求。
流程类似:
text
step 1:请求 A、B、C 一起生成step 2:A 结束,B、C 继续step 3:新请求 D 加入,B、C、D 一起生成step 4:C 结束,B、D 继续这种方式可以让 GPU 持续保持较高利用率。
适合场景:
- 请求量较高
- 输出长度差异明显
- 需要提升整体吞吐
- 可以接受一定调度复杂度
目前 vLLM、TGI、TensorRT-LLM 等推理框架都在不同程度上支持动态批处理。
五、模型量化:降低显存与推理成本
模型参数越大,占用显存越高。
例如一个 7B 模型,如果使用 FP16 部署,参数显存大约是:
text
7B × 2 bytes ≈ 14GB这还不包括 KV Cache、激活值、框架开销。
如果是 14B、32B、70B 模型,部署成本会进一步上升。
量化的目标就是:用更低精度表示模型权重,减少显存占用,同时尽量保持效果。
常见精度包括:
text
FP16 / BF16:常规半精度INT8:8 bit 量化INT4:4 bit 量化1. INT8 量化
INT8 通常在效果和性能之间比较平衡,适合对准确率要求较高、但又希望降低显存的场景。
2. INT4 量化
INT4 可以进一步压缩显存,很多 7B 模型量化后可以在消费级显卡上运行。
例如:
text
FP16 7B:约 14GB 参数显存INT4 7B:约 3.5GB 参数显存但 INT4 可能带来一定效果损失,尤其在数学推理、代码生成、复杂指令跟随等任务中需要谨慎评估。
3. 常见量化方案
常见量化方法包括:
- GPTQ
- AWQ
- GGUF
- bitsandbytes
- SmoothQuant
不同方案适合不同部署场景:
text
本地 CPU / llama.cpp:常用 GGUFGPU 推理服务:常用 GPTQ、AWQ、bitsandbytes高性能部署:可考虑 TensorRT-LLM 量化方案量化不是“越低越好”,而是要结合业务评估。例如客服问答可能可以接受 INT4,而代码生成系统可能更适合 INT8 或 FP16。
六、推理框架怎么选?
目前常见的大模型推理框架有很多,不同框架侧重点不同。
1. vLLM
vLLM 的特点是:
- 支持 PagedAttention
- 吞吐能力强
- OpenAI API 兼容较好
- 适合高并发在线服务
启动示例:
bash
python -m vllm.entrypoints.openai.api_server \ --model /data/models/Qwen2.5-7B-Instruct \ --host 0.0.0.0 \ --port 8000 \ --tensor-parallel-size 1调用示例:
python
from openai import OpenAI client = OpenAI( base_url="http://localhost:8000/v1", api_key="EMPTY" ) resp = client.chat.completions.create( model="/data/models/Qwen2.5-7B-Instruct", messages=[ {"role": "user", "content": "解释一下 KV Cache 的作用"} ], temperature=0.7 ) print(resp.choices[0].message.content)2. TensorRT-LLM
TensorRT-LLM 更偏高性能优化,适合 NVIDIA GPU 环境下追求极致性能的场景。
特点:
- 推理速度快
- 支持多种量化优化
- 适合生产级高性能部署
- 配置和构建复杂度相对较高
如果团队有较强工程能力,并且对性能要求极高,可以考虑 TensorRT-LLM。
3. llama.cpp
llama.cpp 适合本地化、轻量化部署。
特点:
- 支持 CPU 推理
- 支持 GGUF 模型
- 对消费级设备友好
- 部署简单
适合场景:
- 个人本地助手
- 边缘设备
- 小规模离线推理
- 内网低成本部署
4. Hugging Face Transformers
Transformers 易用性强,适合实验和模型验证。
但如果直接用 Transformers 做高并发在线服务,通常需要额外优化,不如 vLLM 等专用推理框架方便。
七、服务化部署需要关注哪些指标?
大模型服务上线后,不能只看“能不能返回答案”,还要持续监控推理性能。
常见指标包括:
1. 延迟指标
- 平均响应时间
- P95 / P99 延迟
- TTFT
- TPOT
- 请求排队时间
2. 吞吐指标
- QPS
- 每秒生成 token 数
- 并发请求数
- batch size 变化
3. 资源指标
- GPU 利用率
- 显存占用
- KV Cache 使用率
- CPU 利用率
- 网络带宽
4. 稳定性指标
- 请求失败率
- OOM 次数
- 超时比例
- 服务重启次数
- 模型加载耗时
例如一个推理服务的目标可以定义为:
text
TTFT < 1.5s P95 响应时间 < 8s GPU 利用率 > 60% 请求失败率 < 0.1%不同业务场景目标不同。智能客服更关注首响速度,代码生成更关注长文本生成吞吐,RAG 问答则要同时关注检索和推理耗时。
八、长上下文场景的优化策略
现在很多模型支持 32K、128K 甚至更长上下文。但支持长上下文不代表应该无脑塞满。
长上下文会带来:
- Prefill 时间增加
- KV Cache 显存增加
- 请求成本上升
- 无关信息干扰模型
- 首 token 延迟变高
优化建议:
1. 控制输入长度
RAG 场景中,不要把所有检索结果都塞给模型。可以通过 rerank 选择最相关片段。
text
召回 Top 50重排序 Top 10最终输入 Top 3~52. 做上下文压缩
对于历史对话、长文档,可以先摘要再输入。
例如:
text
原始历史对话:8000 tokens压缩摘要:800 tokens3. 使用分层处理
对于超长文档,可以先分段分析,再汇总结果。
text
章节级分析 → 文档级总结 → 最终回答4. 设置最大输出长度
很多请求不需要生成特别长的答案。合理设置max_tokens可以减少资源浪费。
九、一个简单的 vLLM 部署示例
假设已经下载好 Qwen2.5-7B-Instruct 模型,可以用 Docker 部署 vLLM:
bash
docker run --gpus all \ -p 8000:8000 \ -v /data/models:/models \ vllm/vllm-openai:latest \ --model /models/Qwen2.5-7B-Instruct \ --dtype auto \ --max-model-len 32768如果显存不足,可以考虑:
bash
--gpu-memory-utilization 0.85 --max-model-len 8192如果是多卡部署:
bash
--tensor-parallel-size 2Python 调用:
python
from openai import OpenAI client = OpenAI( base_url="http://127.0.0.1:8000/v1", api_key="EMPTY" ) response = client.chat.completions.create( model="/models/Qwen2.5-7B-Instruct", messages=[ {"role": "system", "content": "你是一个技术助手"}, {"role": "user", "content": "大模型推理中为什么需要 KV Cache?"} ], temperature=0.3, max_tokens=512 ) print(response.choices[0].message.content)十、生产环境优化建议
最后给出一些更偏实践的建议。
1. 不要盲目上大模型
如果业务是简单 FAQ、分类、信息抽取,7B 或 14B 模型可能已经够用。
更大的模型意味着更高成本,不一定带来成比例收益。
2. 优先优化 Prompt 长度
很多推理慢的问题不是模型本身,而是输入太长。
减少无用上下文,往往比换 GPU 更有效。
3. 为不同场景配置不同模型
可以采用模型分层:
text
简单问题:小模型 复杂推理:大模型 代码生成:代码专用模型 敏感任务:高精度模型这样可以显著降低整体成本。
4. 量化前必须做业务评估
不要只看通用 benchmark。
应该用自己的业务数据测试量化前后效果,例如:
- 问答准确率
- 信息抽取字段准确率
- 代码通过率
- 客服满意度
- 幻觉率
5. 建立压测机制
上线前至少要压测:
- 单用户延迟
- 多用户并发
- 长 prompt 场景
- 长输出场景
- OOM 边界
- 服务恢复能力
压测结果比理论配置更可靠。
总结
大模型推理优化是 AI 应用从 Demo 走向生产的关键环节。
一个可用的大模型服务,不只是把模型加载到 GPU 上,而是要综合考虑:
- KV Cache 管理
- 动态批处理
- 模型量化
- 推理框架选择
- 长上下文控制
- 服务监控
- 成本与效果平衡
对于企业来说,真正重要的不是“能不能部署最大模型”,而是能否在业务可接受的成本下,提供稳定、快速、可扩展的推理服务。
当模型能力、推理性能和工程体系形成闭环,大模型应用才真正具备持续落地的基础。