先这样答
我做模型加速时,会先 profile 找到瓶颈,再决定优化手段。训练和推理的瓶颈不同,所以我会分开处理。训练侧,我用过混合精度,减少计算和存储开销。遇到显存压力时,可以使用梯度检查点。数据读取跟不上计算时,可以做数据流水线预取。
推理侧,我会先看缓存、计算和调度分别占了多少时间。对重复使用的历史信息,可以使用 KV Cache。模型支持时,可以尝试 int8 或 int4 量化。算子融合可以减少不必要的中间结果和调度开销。批处理调度可以提高硬件利用率。Attention 相关计算还可以考虑 FlashAttention 类的 IO 优化。我的原则是先 profile,再针对瓶颈验证方案,不会直接背一张优化清单。
面试官会怎么追问
-
「你为什么不一上来就做量化?」 量化会改变计算的数据表示,是否合适要看具体瓶颈和精度要求。先 profile 才能判断时间主要花在计算、缓存还是其他环节。只有确认量化对应瓶颈,才值得继续验证 int8 或 int4。
-
「训练侧的混合精度和梯度检查点分别解决什么问题?」 混合精度用于训练侧的计算和存储优化。梯度检查点用于缓解显存压力。两者针对的方向不同,不能把它们当成同一种手段。
-
「推理时你会怎么判断 KV Cache 是否值得做?」 我会先 profile 推理过程,确认历史信息的重复计算是否构成瓶颈。KV Cache 适合减少这类重复计算。确认瓶颈后,再结合批处理调度和其他推理优化一起验证。
回答的坑
- 只背混合精度、量化和算子融合的清单,却不先说明如何 profile 和定位瓶颈。
- 把训练优化和推理优化混在一起,讲不清每个技巧对应的场景。
同系列的题
—— 本题完 ——