推理加速方法图谱¶
推理优化的对象不只有计算量。一次请求的时间还包含数据移动、Kernel Launch、同步、排队与自回归依赖。先定位主瓶颈,再选择算法;否则“FLOPs 降低”可能换不来实际延迟。
从瓶颈选择方法¶
flowchart TB
P[Profile 证据] --> B{主瓶颈}
B -->|模型容量 / HBM 流量| Q[量化 / 剪枝 / 权重共享]
B -->|Attention IO| F[FlashAttention / Tiling / 融合]
B -->|计算量| S[结构化稀疏 / 蒸馏 / 小模型]
B -->|自回归串行| SD[Speculative Decoding]
B -->|Kernel / 中间量| K[算子融合 / Layout / 编译]
B -->|KV 容量 / 带宽| KV[GQA/MQA / KV 量化 / 窗口化]
Q --> V[质量 + Kernel + 端到端验收]
F --> V
S --> V
SD --> V
K --> V
KV --> V 方法对照¶
| 方法 | 改变什么 | 主要收益 | 主要代价/条件 |
|---|---|---|---|
| 权重/激活量化 | 数值表示 | 容量、带宽、低精度算力 | 量化误差、Scale/Packing、硬件支持 |
| KV Cache 量化 | Attention 状态精度 | 长上下文容量与读取带宽 | KV 敏感性、逐步写入与反量化 Kernel |
| 非结构化剪枝 | 单个 Weight 为零 | 理论参数/FLOPs 下降 | 索引开销;无稀疏 Kernel 时难兑现 |
| N:M 结构化稀疏 | 固定分组内保留 N 个非零 | 匹配专用稀疏矩阵单元 | 模型需满足模式,质量与覆盖率 |
| 蒸馏 | 用小模型逼近大模型 | 直接降低层数/宽度与总计算 | 训练数据与教师成本,能力迁移边界 |
| 算子融合 | 合并执行边界 | 减少中间 HBM 读写与 Launch | 寄存器压力、动态 Shape、实现复杂度 |
| IO-aware Attention | 改变精确算法的分块 | 减少 HBM 往返,不必近似 Attention | Tile/Shared Memory/寄存器调度 |
| Speculative Decoding | Draft 提议多个 Token,Target 验证 | 减少串行 Target Step | 接受率、Draft 成本、验证 Kernel |
| GQA/MQA | 减少 KV Head | KV 容量和 Decode 带宽下降 | 通常属于模型架构选择,质量需验证 |
稀疏为什么容易“纸面加速”¶
设稀疏率为 50%,并不自动意味着延迟减半:
- 非零元素需要索引或压缩格式,增加解码与不规则访问;
- 通用矩阵单元可能仍执行 Dense 计算;
- 负载不均导致部分线程/PE 空闲;
- 只有少数 Shape、数据类型和稀疏模式有专用 Kernel;
- LayerNorm、Attention、Embedding 等未稀疏算子仍占时间。
因此要区分:
- 参数稀疏率;
- 理论稀疏 FLOPs;
- 被稀疏 Kernel 覆盖的端到端时间比例;
- 目标硬件实际跳过的乘加与数据读取。
FlashAttention 展示了什么¶
标准 Attention 的数学 FLOPs 不变,也可以通过减少 HBM 与片上 SRAM 之间的读写显著加速。它揭示一个通用原则:
算法复杂度相同,不代表 IO 复杂度相同;现代加速器上,数据移动经常比乘加更值得优化。
flowchart LR
subgraph STANDARD[普通实现]
QK[QKᵀ] --> H1[写 HBM Score]
H1 --> SM[读回做 Softmax]
SM --> H2[写 HBM Probability]
H2 --> PV[读回做 PV]
end
subgraph TILED[IO-aware 分块]
TILE[Q/K/V Tile] --> SRAM[片上 SRAM<br/>在线 Softmax + 累加]
SRAM --> OUT[只写最终输出]
end Speculative Decoding 的收益条件¶
若 Draft 一次提议多个 Token,Target 用并行方式验证,收益取决于:
- Draft 模型/Head 的执行成本;
- Target 对提议 Token 的平均接受长度;
- 验证阶段能否形成高效矩阵 Shape;
- 采样策略必须保持目标分布正确;
- Batch、序列长度与 Runtime 调度带来的额外开销。
接受率高但 Draft 太慢,或验证 kernel 很小,都可能没有端到端收益。必须报告每轮提议数、接受长度分布和 Target Forward 次数,而不只报告单个峰值加速比。
统一收益模型¶
对只优化一部分执行时间的方法,可先用 Amdahl 视角做上限估计。若目标部分占比为 \(p\),该部分加速 \(s\) 倍,则总体上限:
\[ S_{total}=\frac{1}{(1-p)+\frac{p}{s}} \]
若低精度 GEMM 只占端到端 40%,即便该部分快 2 倍,总体也只有约 1.25×。这能提前识别只优化热点局部却忽略排队、数据转换和其他算子的方案。
一项优化的证据链¶
flowchart LR
ALG[算法变化<br/>少算 / 少存 / 少搬] --> IR[图与 IR 发生预期变化]
IR --> K[命中目标 Kernel / 指令]
K --> HW[Counter 证明资源变化]
HW --> E2E[端到端指标改善]
E2E --> Q[质量仍在边界内] 缺少任一环都不能完成归因:
- 只有算法论文,没有目标 Kernel:可能无法部署;
- 只有 kernel microbenchmark,没有端到端占比:收益可能很小;
- 只有端到端变快,没有质量/输入控制:可能比较了不同工作负载;
- 只有吞吐提升,没有尾延迟:在线场景可能牺牲了 SLO。