推理引擎(Inference Engines)
让大语言模型跑得更快、更省显存的专用软件引擎,是模型从训练到上线的关键一环
通过量化、缓存优化、解码加速等手段,降低大模型推理的显存占用和延迟
内容摘要
高效推理(Efficient Inference)是一组旨在降低大语言模型(LLM)推理阶段显存占用、计算延迟和硬件成本的技术集合。它不是某一个单独的算法,而是量化(Quantization)、KV 缓存优化(KV Cache Optimization)、注意力加速(Attention Acceleration)、推测解码(Speculative Decoding)等多种优化手段的统称。
高效推理(Efficient Inference)是一组旨在降低大语言模型(LLM)推理阶段显存占用、计算延迟和硬件成本的技术集合。它不是某一个单独的算法,而是量化(Quantization)、KV 缓存优化(KV Cache Optimization)、注意力加速(Attention Acceleration)、推测解码(Speculative Decoding)等多种优化手段的统称。
大模型推理面临一个核心矛盾:模型越大、生成质量越好,但所需的显存和计算资源也越多。一个 70B 参数的模型以 FP32 精度加载,需要约 280GB 显存,远超单张消费级 GPU 的容量。即使能装下模型本身,自回归生成过程中不断累积的 KV 缓存(Key-Value Cache)也会迅速占满剩余显存。高效推理的目标就是在"生成质量基本不变"的前提下,大幅降低这些资源消耗。
与训练阶段的优化不同,推理优化面向的是已经训练好的模型,不需要修改模型参数的学习过程,而是在"怎么用这个模型"上做文章——用更少的位数存储权重、更聪明地管理缓存、更高效地调度计算。
高效推理技术可从四个维度理解:
| 维度 | 代表技术 | 核心思路 |
|---|---|---|
| 模型量化 | GPTQ、AWQ、BitsAndBytes | 降低权重精度(FP32 → INT8/INT4),减小模型体积 |
| KV 缓存优化 | PagedAttention、GQA、MQA | 减少缓存显存浪费,提升并发能力 |
| 注意力计算加速 | FlashAttention、Flash-Decoding | 优化注意力计算的内存访问模式,减少 IO 瓶颈 |
| 解码策略加速 | Speculative Decoding、Medusa | 用小模型预生成草稿 token,大模型并行验证,打破逐 token 生成的瓶颈 |
将模型权重从高精度浮点数(FP32/FP16)转换为低位整数(INT8/INT4)。核心假设是:大模型权重中存在大量冗余精度,适当降低数值精度不会显著影响输出质量。量化后的模型体积更小、计算更快,能在更便宜的硬件上运行。
主流方法包括:
自回归生成时,每产出一个新 token 都要访问之前所有 token 的 Key 和 Value 向量。传统做法为每个序列预分配最大长度的连续显存块,导致大量内部碎片。优化手段包括:
标准注意力计算需要将完整的 Q、K、V 矩阵写入 GPU 的高带宽显存(HBM),产生大量 IO 开销。FlashAttention 通过分块计算(tiling)将数据尽量留在片上缓存(SRAM)中完成,避免反复读写 HBM,在不改变数学结果的前提下将注意力计算加速 2-4 倍。
传统自回归解码每步只能生成 1 个 token,硬件利用率低。推测解码引入一个小型"草稿模型"(Draft Model),先快速生成若干候选 token,再由大模型一次性并行验证。验证通过的 token 直接采纳,不通过的从失败处重新生成。由于验证多个 token 的计算量与生成单个 token 接近,整体速度可提升 2-3 倍,且输出分布与原始大模型完全一致。
以一次完整的 LLM 推理请求为例,说明各优化技术在推理流程中的作用位置:
图中展示了四组优化技术在推理流程中的位置:量化作用于模型加载、FlashAttention 作用于预填充计算、推测解码和 PagedAttention 作用于解码阶段、连续批处理作用于多请求调度。实际部署中,这些技术通常组合使用,而非二选一。
以下用伪代码展示量化加载和 PagedAttention 推理的核心逻辑:
# 伪代码:展示高效推理核心流程(非完整可运行代码)
# 1. 量化加载 —— 用 INT4 精度加载模型,显存降为原来的 1/4
model = load_model("llama-2-7b", quantization="int4")
# 原始 FP16 需要 ~14GB 显存,INT4 仅需 ~3.5GB
# 2. PagedAttention 管理 KV 缓存
kv_cache = PagedKVCache(
block_size=16, # 每个块存 16 个 token 的 KV
num_blocks=1024, # 总共 1024 个块,按需分配
)
# 3. 推理过程
prompt_tokens = tokenize("高效推理的核心思想是")
kv_cache.allocate(request_id=1) # 按需分配块,不预占最大长度
for step in decoding_loop:
new_token = model.forward(prompt_tokens, kv_cache)
kv_cache.append(new_token.kv) # 追加到已有块,块满了自动分配新块
if new_token == EOS:
kv_cache.free(request_id=1) # 请求结束,立即释放块供其他请求使用
break
上述代码对应两个关键机制:量化将模型体积压缩到可在单卡部署的大小;PagedAttention 的按需分配和即时释放避免了显存浪费。真实场景中,vLLM、TensorRT-LLM 等推理引擎已内置这些功能,使用者通过参数配置即可启用。
| 概念 | 与高效推理的区别 | 更适合关注的重点 |
|---|---|---|
| 高效训练(Efficient Training) | 作用于训练阶段(梯度计算、参数更新),目标是降低训练成本;高效推理作用于已训练好的模型 | 混合精度训练、梯度检查点、数据并行 |
| 模型压缩(Model Compression) | 是高效推理的子集之一,侧重减小模型本身的体积(量化、剪枝、蒸馏) | 模型体积、参数量、存储空间 |
| 推理引擎(Inference Engine) | 是实现高效推理技术的工程框架(如 vLLM、TensorRT-LLM),而非技术原理本身 | 框架选型、API 使用、部署运维 |
| 模型蒸馏(Knowledge Distillation) | 是训练一个更小的新模型去模仿大模型的行为,需要额外的训练过程;量化则直接转换已有权重的精度 | 训练数据、师生模型结构设计 |
核心区别:
| 常见误区 | 正确理解 |
|---|---|
| 量化到 INT4 精度一定大幅下降 | GPTQ、AWQ 等现代方法通过校准数据和优化算法,可将 INT4 量化的精度损失控制在较低水平。HuggingFace 社区大量 4-bit 模型已在实际应用中广泛使用 |
| KV Cache 优化只对长序列有用 | PagedAttention 对短序列同样有效。多个并发请求可共享公共前缀的 KV 块(如相同的系统提示),按需分配也能减少短序列的显存浪费 |
| 推测解码会改变模型输出分布 | 标准推测解码使用拒绝采样(Rejection Sampling)保证输出分布与原始大模型数学上完全一致,只加速不改变结果 |
| 用了 vLLM 就自动拥有所有优化 | vLLM 提供 PagedAttention 和 Continuous Batching,但模型量化需要在上游用 GPTQ/AWQ 等工具完成后再加载。两者需要配合使用 |
参考答案:
大模型的权重值分布通常集中在一个较窄的范围内,大部分权重对输出的影响很小。量化本质上是用更少的位数来近似这些数值,对于影响小的权重,近似带来的误差不会显著改变模型输出。此外,GPTQ 等方法利用 Hessian 矩阵信息,优先保护对输出影响大的权重的精度,进一步减小了量化误差。
参考答案:
传统方法为每个序列预分配最大长度的连续显存空间,而实际序列长度往往远短于最大值,导致大量显存空闲但无法被其他请求使用(内部碎片)。PagedAttention 借鉴操作系统的分页机制,将 KV 缓存拆分为固定大小的块(如 16 个 token 一块),按需分配。序列增长时动态追加新块,结束时立即释放,且多个请求的公共前缀可共享同一物理块。这样显存利用率接近理论最优。
参考答案:
推荐组合:AWQ INT4 量化 + vLLM(内置 PagedAttention + Continuous Batching)+ 前缀缓存。理由:客服场景的系统提示高度统一(前缀缓存命中率高)、并发量大(PagedAttention 和连续批处理提升吞吐)、对延迟敏感但对创造性要求不高(INT4 精度损失可接受)。需要考虑的因素包括:模型大小与 GPU 显存的匹配、量化后在客服领域测试集上的精度验证、峰值并发下的 OOM 风险(需设置 gpu_memory_utilization 上限)、以及量化格式与推理引擎的兼容性。
优先展示同分类且标签更接近的内容,方便继续串联学习。
让大语言模型跑得更快、更省显存的专用软件引擎,是模型从训练到上线的关键一环
根据参数规模选择合适的 LLM,平衡性能、成本和硬件需求
在个人电脑或私有服务器上运行大语言模型的核心概念与工具选择。