TL;DR
推理才是大模型的真正战场——训练一次,推理百万次。标准Attention的内存带宽成为瓶颈,Flash Attention通过Tiling技术让速度提升5倍;KV Cache让解码快10倍,但长上下文会吃掉几十GB显存;vLLM的Paged Attention把显存利用率从30%提到90%。本文从10个高频面试题入手,带你搞懂推理优化的核心技术:为什么Flash Attention比标准Attention快、量化为什么选INT4而不是INT8、vLLM和TensorRT-LLM怎么选。读完这篇,你能回答"Speculative Decoding如何用小模型加速大模型"这种深度问题。
一、KV Cache原理:为什么能加速推理?
自回归生成的计算冗余
问题:生成每个新token时,都要重新计算之前所有token的Key和Value
生成第1个词:计算1个token的K/V
生成第2个词:计算2个token的K/V(第1个重复计算)
生成第3个词:计算3个token的K/V(前2个重复计算)
...
生成第N个词:计算N个token的K/V(前N-1个重复计算)
KV Cache解决方案
核心思想:缓存已计算的Key和Value,新token只需计算自己的K/V
生成第1个词:计算K/V → 缓存
生成第2个词:读取缓存 + 计算新K/V → 更新缓存
生成第3个词:读取缓存 + 计算新K/V → 更新缓存
加速效果
计算复杂度:
- 无KV Cache:O(N²) 每步
- 有KV Cache:O(N) 每步
实测数据:生成512个token,KV Cache让速度提升10倍
显存开销
公式:
KV Cache显存 = 2 × 层数 × 头数 × 头维度 × 序列长度 × batch_size × 精度
示例(LLaMA 7B,序列长度2048,batch=1,FP16):
2 × 32层 × 32头 × 128维 × 2048 × 1 × 2字节 = 1GB
长上下文的挑战:128K上下文需要64GB显存(仅KV Cache)
参考资料:Efficient Memory Management for Large Language Model Serving with PagedAttention (arXiv:2309.06180)
二、量化技术对比:INT8 vs INT4 vs GPTQ vs AWQ
四种量化方法
方法
精度
压缩比
性能损失
适用场景
INT8
8-bit
4倍
<1%
通用推理
INT4
4-bit
8倍
1-3%
显存受限
GPTQ
3-4bit
8-10倍
1-2%
离线量化
AWQ
4-bit
8倍
<1%
最优
INT8 vs INT4
INT8量化:
FP16: [-65504, 65504]
INT8: [-128, 127]
量化公式: q = round(x / scale) + zero_point
INT4量化:
- 压缩比更高(8倍 vs 4倍)
- 精度损失稍大(1-3% vs <1%)
- 需要更精细的量化策略
GPTQ(Post-Training Quantization)
核心思想:最小化量化前后的输出差异
优势:
- 不需要重新训练
- 支持3-4bit极致压缩
- 开源工具链成熟(AutoGPTQ)
劣势:量化过程慢(需要校准数据)
AWQ(Activation-aware Weight Quantization)
核心创新:保护重要权重通道
关键发现:1%的权重通道贡献了50%的激活幅度
策略:
1. 识别重要通道(激活幅度大)
2. 对重要通道用更高精度
3. 其他通道用4-bit量化
性能:4-bit AWQ性能接近FP16,优于GPTQ
参考资料:GPTQ论文 (arXiv:2210.17323)、AWQ论文 (arXiv:2306.00978)
三、权重量化 vs 激活量化
核心区别
维度
权重量化
激活量化
量化对象
模型参数(静态)
中间激活值(动态)
量化时机
离线一次性
推理时每次
实现难度
简单
复杂
性能影响
较小
较大
为什么激活量化更难?
权重量化:
- 权重分布固定,可以离线校准
- 量化参数(scale、zero_point)可以预计算
激活量化:
- 激活值分布动态变化(依赖输入)
- 需要运行时动态计算量化参数
- 异常值(outliers)影响大
实战建议
仅权重量化(W8A16):
- 显存减半
- 计算仍用FP16
- 性能损失<1%
权重+激活量化(W8A8):
- 显存减半 + 计算加速
- 需要硬件支持(Tensor Core INT8)
- 性能损失1-3%
参考资料:SmoothQuant论文 (arXiv:2211.10438)
四、Flash Attention:为什么比标准Attention快5倍?
核心问题:内存带宽瓶颈
标准Attention:
1. 计算 Q×K^T → 写入HBM(N×N矩阵)
2. 读取 → Softmax → 写回HBM
3. 读取 → 乘以V → 写回HBM
瓶颈:GPU HBM带宽有限(~1.5TB/s),大量读写成为瓶颈
Flash Attention解决方案
核心思想:Tiling + Recomputation,减少HBM访问
关键技术:
1. 分块计算:把N×N矩阵分成小块,放入SRAM
2. 在线Softmax:不存储完整注意力矩阵
3. 重计算:反向传播时重新计算,而非存储
性能提升
版本
速度提升
关键优化
FlashAttention-1
2-4倍
Tiling技术
FlashAttention-2
2倍于FA1
减少非矩阵乘法操作
FlashAttention-3
1.5-2倍于FA2
Warp特化、异步流水线(H100专用)
参考资料:FlashAttention论文 (arXiv:2205.14135)、FlashAttention-2 (arXiv:2307.08691)
五、Paged Attention(vLLM核心技术)
KV Cache的显存碎片问题
问题:
- 预分配显存:浪费(实际序列长度<最大长度)
- 动态分配:碎片化严重
示例:
请求1:预分配2048 tokens,实际用512 → 浪费75%
请求2:预分配2048 tokens,实际用1800 → 浪费12%
Paged Attention解决方案
核心思想:借鉴操作系统的虚拟内存管理
关键机制:
1. 分页存储:KV Cache分成固定大小的块(如16 tokens)
2. 按需分配:只分配实际使用的块
3. 共享前缀:多个请求共享相同前缀的KV Cache
性能提升
显存利用率:
- 传统方法:30-40%
- Paged Attention:80-90%
吞吐量提升:2-4倍(相同显存下可处理更多请求)
参考资料:vLLM论文 (arXiv:2309.06180)
六、Speculative Decoding:用小模型加速大模型
核心思想
问题:大模型推理慢,每个token都要跑一遍完整模型
解决:用小模型"猜测"多个token,大模型一次性验证
工作流程
1. 小模型快速生成K个候选token(如K=4)
2. 大模型并行验证这K个token
3. 接受正确的前缀,拒绝后续错误token
4. 从拒绝位置继续生成
加速原理
关键:并行验证比串行生成快
传统方式:生成4个token需要4次大模型前向传播
Speculative:1次小模型生成 + 1次大模型验证 = 2次前向传播
性能提升
加速比:2-3倍(取决于小模型准确率)
无损性:输出分布与原始大模型完全一致
参考资料:Fast Inference from Transformers via Speculative Decoding (arXiv:2211.17192)
七、部署框架对比:vLLM vs TensorRT-LLM vs llama.cpp
三大框架对比
框架
优势
劣势
适用场景
vLLM
Paged Attention、吞吐量高
仅支持NVIDIA GPU
生产环境、高并发
TensorRT-LLM
极致性能优化
编译慢、调试难
追求极致性能
llama.cpp
CPU推理、跨平台
速度较慢
边缘设备、无GPU环境
vLLM
核心技术:
- Paged Attention(显存利用率90%)
- Continuous Batching(动态批处理)
- 支持多种模型(LLaMA、Mistral、Qwen等)
性能数据:吞吐量比HuggingFace高24倍
TensorRT-LLM
核心技术:
- 算子融合(Kernel Fusion)
- INT8/FP8量化
- 多GPU/多节点推理
优势:延迟最低(单请求场景)
llama.cpp
核心技术:
- 纯C++实现
- 支持CPU、Metal、Vulkan
- 4-bit量化(GGUF格式)
适用场景:Mac、移动设备、嵌入式
参考资料:vLLM论文、TensorRT-LLM文档
八、Continuous Batching vs 传统Batching
传统Batching的问题
静态批处理:
Batch = [请求1, 请求2, 请求3]
等待所有请求完成 → 释放整个Batch
问题:
- 请求1生成10个token就结束
- 请求2生成100个token
- 请求3生成50个token
- 结果:请求1完成后,GPU闲置等待请求2
Continuous Batching
动态批处理:
请求1完成 → 立即移出Batch → 加入新请求4
请求3完成 → 立即移出Batch → 加入新请求5
优势:
- GPU利用率更高
- 平均延迟更低
- 吞吐量提升2-3倍
参考资料:Orca论文 (arXiv:2022.xxxxx)
九、内存优化:Offloading vs CPU/GPU混合推理
Offloading技术
核心思想:把部分模型参数放到CPU内存或硬盘
适用场景:
- 显存不足以加载完整模型
- 推理延迟要求不高
实现方式:
# DeepSpeed Inference
model = AutoModelForCausalLM.from_pretrained(
"model_name",
device_map="auto", # 自动分配到GPU/CPU
offload_folder="offload", # CPU内存不足时用硬盘
)
CPU/GPU混合推理
策略:
- GPU:计算密集层(Attention、FFN)
- CPU:参数量大但计算少的层(Embedding)
性能权衡:
- 显存节约:50-80%
- 速度下降:2-5倍
参考资料:DeepSpeed Inference文档
十、ONNX在LLM部署中的作用
ONNX是什么?
Open Neural Network Exchange:开放神经网络交换格式
核心价值:
- 跨框架(PyTorch → ONNX → TensorRT)
- 跨平台(训练在GPU,推理在CPU/移动端)
- 优化加速(算子融合、常量折叠)
ONNX Runtime for LLM
2024-2025最新进展:
- 支持Transformer优化
- Flash Attention集成
- 多GPU推理
性能提升:比原生PyTorch快1.5-2倍
使用场景
适合:
- 需要跨平台部署
- 使用非NVIDIA硬件(AMD、Intel)
- 边缘设备推理
不适合:
- 追求极致性能(不如TensorRT-LLM)
- 模型频繁更新(转换成本高)
参考资料:ONNX Runtime文档
小结
本文从10个高频面试题入手,系统梳理了大模型推理与部署的核心技术:
- KV Cache:缓存已计算的K/V,速度提升10倍
- 量化技术:INT4/GPTQ/AWQ,显存压缩8倍
- 权重vs激活量化:激活量化更难但收益更大
- Flash Attention:Tiling技术,速度提升5倍
- Paged Attention:显存利用率从30%提到90%
- Speculative Decoding:小模型猜测+大模型验证,加速2-3倍
- 部署框架:vLLM高吞吐、TensorRT-LLM低延迟、llama.cpp跨平台
- Continuous Batching:动态批处理,吞吐量提升2-3倍
- 内存优化:Offloading技术,显存节约50-80%
- ONNX:跨框架跨平台,适合边缘部署
下一篇预告:Prompt工程篇——CoT、ToT、ReAct怎么用?