摘要
大语言模型(LLM)的推理部署是AI工程化的核心环节。从实验室的PyTorch模型到生产环境的低延迟服务,中间隔着显存墙、计算墙和带宽墙的三重考验。本文深入解析LLM推理的关键优化技术,涵盖KV Cache管理、模型量化、连续批处理、投机采样、PagedAttention等前沿方案,并结合vLLM、TensorRT-LLM、SGLang等主流框架给出工程实践指南。
一、为什么LLM推理是难题
LLM推理的挑战源于其自回归生成特性:每个token的生成依赖于之前所有token的Key-Value对。以Llama-2-7B为例,单个请求在生成长度为2048时,KV Cache的显存占用约为:
2 × num_layers × num_heads × head_dim × seq_len × batch_size × sizeof(dtype)
当num_layers=32, num_heads=32, head_dim=128时,每个token的KV Cache约为1MB。这意味着一个128个请求的批处理(平均长度1024)仅KV Cache就需要超过256MB——还未计算模型参数本身的14GB(FP16)。
更严峻的是,不同请求的生成长度差异巨大:有的只需几十个token,有的需要上千个token。传统静态预留机制导致大量显存浪费。
二、KV Cache:从静态到动态
2.1 基础KV Cache机制
Transformer的自注意力层在计算时需要当前token与所有历史token的点积。为了避免重复计算,推理引擎将每一层的Key和Value矩阵缓存起来,新token只需计算自身的K、V并追加到缓存中。这将以O(n²)降为O(n),同时将每个新token的计算量从O(n×d)降为O(d)。
2.2 PagedAttention:显存管理的革命
vLLM提出的PagedAttention借鉴了操作系统的虚拟内存分页思想。核心创新包括:
- 分块预分配:不再为每个请求预留最大长度的连续空间,而是将KV Cache拆分为固定大小的Block(通常16个token),按需分配
- Block Table映射:每个请求维护一张Block Table,逻辑Block编号映射到物理Block,支持非连续存储
- Copy-on-Write:在Beam Search或并行采样场景下,多个序列共享相同的Prefix KV Cache,仅在分叉时复制新Block
- 接近零的浪费:最后一个Block可能有部分空间未使用(内部碎片),但整体浪费率降至不足4%
实测显示,PagedAttention相比静态分配将吞吐量提升2x-4x,尤其在长序列和高并发场景下优势更为显著。
2.3 KV Cache压缩与淘汰
当系统负载极高、GPU显存不足以容纳所有活跃请求时,KV Cache压缩策略至关重要:
- H2O(Heavy Hitter Oracle):基于注意力分数的在线淘汰,识别并保留"重击者"token(注意力累计分数高的),淘汰其他token
- StreamingLLM:注意力分布呈现强烈的局部性(近期token+初始token),永久保留前几个token(sink tokens)+滑动窗口内token,使模型能处理远超训练长度的序列
- GQA/MQA内存布局优化:将Grouped Query Attention的KV Heads合并存储(K和V交错),利用GPU的向量化加载指令提升带宽利用率
三、模型量化:从FP16到INT4
3.1 量化方案对比
| 方案 | 精度 | 首Token延迟 | 吞吐提升 | 显存节省 | 适用场景 |
|---|---|---|---|---|---|
| FP16 Baseline | 基线 | 1.0x | 1.0x | - | 开发调试 |
| GPTQ-INT4 | 较高 | 0.9x | 2.5x | 75% | A100推理 |
| AWQ | 较高 | 0.85x | 2.8x | 75% | 边缘+云端 |
| SmoothQuant-INT8 | 接近无损 | 1.1x | 1.5x | 50% | 敏感精度场景 |
| FP8 (Ada Lovelace) | 极高 | 1.2x | 1.3x | 50% | H100平台 |
3.2 GPTQ与AWQ的工程实践
GPTQ(Generative Pre-trained Transformer Quantization)通过后训练量化将权重压缩至4-bit,每次请求时动态反量化为FP16进行矩阵乘法。AWQ(Activation-aware Weight Quantization)发现权重并非同等重要——仅有0.1%-1%的"salient weights"对精度影响巨大,对这些权重保持FP16精度,其余量化至INT4。
集成示例(使用AutoGPTQ):
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
quantize_config = BaseQuantizeConfig(bits=4, group_size=128, desc_act=False)
model = AutoGPTQForCausalLM.from_pretrained(
"meta-llama/Llama-2-7b-hf",
quantize_config
)
model.quantize(calibration_dataset)
model.save_quantized("./llama-7b-gptq-4bit")
四、请求级调度:批处理的艺术
4.1 Continuous Batching (Iteration-Level Scheduling)
传统Static Batching等待所有请求完成才处理下一批,导致计算资源被最长序列拖拽。Continuous Batching在每个decode step动态调度:当某个请求完成生成时,立即将新请求插入当前批,确保GPU计算单元始终满载。
Triton Inference Server和vLLM均实现了该机制。在高波动流量下吞吐量可提升3倍以上。
4.2 Chunked-Prefill
LLM推理分为Prefill(处理输入prompt,可并行)和Decode(逐token生成,串行)两个阶段。长时间Prefill会阻塞Decode导致尾延迟飙升。Chunked-Prefill将Prefill拆分为多个Chunk,在Chunk间隙插入Decode步骤,实现Prefill与Decode的交错执行,兼顾吞吐与延迟。
4.3 投机采样(Speculative Decoding)
核心洞察:小模型生成多个候选token,大模型一次性验证所有候选。若小模型命中率高,等效于一次decode生成多个token。
典型配置:Draft Model(160M)+ Target Model(7B),Draft生成K=5个候选token。由于大模型的并行验证几乎免费,理想加速比可达K倍。实际中因命中率约70-90%,加速比通常在1.5x-2.5x之间。
SGLang通过Tree Attention进一步优化投机采样:Draft阶段构建候选树而非线性序列,多个候选形成树状并行结构,一次并行验证覆盖指数级更多的生成路径。
五、工程实践框架对比
5.1 vLLM
以PagedAttention为核心的开源推理引擎,API兼容OpenAI,支持多种量化方案,适合快速部署和中小型团队。KV Cache管理优异,但调度策略相对简单,在多租户场景下隔离性不足。
5.2 TensorRT-LLM
NVIDIA官方推理引擎,深度整合CUDA/TensorRT,在NVIDIA硬件上性能极致。支持FP8、FP4、INT4等多精度,In-Fusion将LayerNorm/Attention/MLF融合为单个Kernel。但硬件绑定、配置复杂,优化需深入理解CUDA。
5.3 SGLang
结构化生成语言框架,前端DSL使用RadixAttention实现自动前缀缓存(KV Cache复用),后端通过Compressed Radix Tree管理。在多轮对话、结构化输出(JSON Schema)、并行采样等场景下有天然优势。
5.4 选型建议
- 纯NVIDIA GPU + 最高性能:TensorRT-LLM
- 兼容OpenAI API + 快速迭代:vLLM
- 复杂前端逻辑 + 多轮对话:SGLang
- 跨平台/AMD/CPU混合:llama.cpp + ONNX
六、部署监控与成本优化
生产部署需关注核心指标:首Token延迟(TTFT)决定用户感知速度,Decode吞吐(tokens/s)决定服务容量,KV Cache利用率决定硬件成本。
成本优化策略包括:
- 动态Batching:按流量自动缩放在0到最大Batch Size之间调整
- 混合精度分层:Prefill(计算密集,用INT8),Decode(带宽密集,用INT4),匹配不同阶段的瓶颈
- Spot Instance + 快速Checkpoint:对Preemption场景支持Checkpoint/Restore
七、展望
LLM推理领域正朝着以下方向演进:推测解码的可靠性提升(Medusa、EAGLE系列方法)、长上下文的高效处理(百万token级别)、多模态模型的统一推理框架、以及端侧设备的超轻量推理。随着硬件(Groq的LPU、Cerebras的WSE)和软件(MLSys级编译优化)的共同演进,LLM推理的成本将持续下降一个数量级。

发表评论 取消回复