Chapter 06 · 性能优化:量化、算子、编译、内存与通信
到这一章,你开始真正拥有“优化工具箱”。关键不是记住越多名词越好,而是建立一套判断法:瓶颈在显存时优先看什么,在带宽时优先看什么,在多卡通信时优先看什么,在算子层低效时又该看什么。
到这一章,你开始真正拥有“优化工具箱”。关键不是记住越多名词越好,而是建立一套判断法:瓶颈在显存时优先看什么,在带宽时优先看什么,在多卡通信时优先看什么,在算子层低效时又该看什么。
“优化”这个词听起来很宽,但对推理系统来说,优化从来不是无条件堆叠的。每一种优化都在针对某种瓶颈,也都带来自己的代价。真正有价值的学习方式,是把优化手段放回具体瓶颈里看。
量化、算子、编译、内存布局、通信优化分别在解决什么问题?
先判断瓶颈,再选择手段,而不是盲目追逐所有热门优化名词。
你会开始具备“为什么这个框架强调某种优化”的解释能力。
真正的优化顺序永远是:先定位瓶颈,再选手段。如果你还没搞清楚系统慢是因为显存吃紧、带宽不够、算子低效还是多卡通信开销,就开始同时试量化、编译和换框架,最后通常只会得到一些不可解释的数字。
所以这一章最重要的收获,不是学会“所有优化方法”,而是学会问对问题:为什么现在的系统慢,最先限制我的到底是什么。
量化的直接作用,是降低权重和 / 或激活的表示精度,从而减少显存占用和数据搬运成本。对推理系统来说,这通常意味着同样的硬件能放下更大的模型、更高的并发或更长的上下文。
但量化不是免费午餐。不同量化方案对精度影响不同,对内核支持要求不同,对不同模型架构的适配难度也不同。也就是说,量化是“用更多工程复杂度和潜在精度风险,换取资源效率”的典型手段。
算子优化更偏热点局部:例如矩阵乘、attention、归一化这些高频高成本操作怎样跑得更快。图编译则更偏整体执行路径:怎样减少不必要的中间张量、冗余调度和数据搬运,让整条执行图更顺。
二者经常协同出现。你可以把它们理解成:一个在抠“单步效率”,一个在抠“全局组织效率”。后面你看不同框架的能力差异时,会发现有的框架更擅长把热点算子榨干,有的更强调整体图执行和平台耦合优化。
有时系统并不是算不动,而是数据放得不好、取得不顺,导致 GPU 大量时间花在等待数据而不是计算。KV Cache 的分页、张量布局的重排、减少不必要的 copy,都是这条线上的优化思路。
这也是为什么很多优秀的推理系统论文,标题写的是 attention 或 serving,但正文里大篇幅都在谈内存管理和访问模式。因为真正限制性能的往往不是“有没有算力”,而是“算力拿不拿得到数据”。
当模型跨卡运行时,很多优化都要重新审视。单卡下有效的算子优化,到了多卡场景可能被通信延迟抵消;单卡下省显存的方案,到了多卡场景又可能加重同步压力。所以多卡推理不是“单卡优化的简单叠加”,而是另一层系统设计。
这也是为什么后面看 TensorRT-LLM 这类更贴近特定硬件平台的路线时,你会发现它们对并行和通信的叙述格外重。
一个实用的框架是:先看资源约束,再看负载特征,再看部署目标。比如显存先不够,就优先看量化和缓存管理;GPU 利用率不高但带宽紧张,就优先看算子和内存布局;多卡扩展不理想,就先看并行切分和通信,而不是先换 sampling 参数。
不是所有优化都值得第一时间上。很多时候,先通过更稳妥的手段拿到一轮确定收益,比如调好 batch 组织、排查明显的内存浪费、做基础量化,再决定是否进入更复杂的自定义内核和深度平台绑定,会更符合工程节奏。
这个顺序的价值在于:你更容易解释结果,也更容易控制回归风险。否则一口气叠很多优化,最后即使数字变好,也不清楚到底是哪一项在起作用。
如果你不知道系统主要受限于容量、带宽、算子还是通信,同时开很多优化只会制造噪声。
每个优化都在拿一些东西换另一些东西,常见的是用复杂度、兼容性或精度去换性能与容量。
低延迟在线接口、高吞吐离线任务、本地部署工具,最值得做的优化顺序都不一样。
这类问题优先考虑的是容量路线:量化、缓存管理、上下文裁剪,而不是先去写更激进的热点算子优化。
这种情况通常不是“算子不够快”,而是切分与通信开始主导总成本。继续堆单卡优化可能帮助有限。
优化不是工具清单,而是一张判断图。先找主瓶颈,再走对应路线。
从上往下看:先定位瓶颈,再选路径,最后回到实验验证,而不是并列堆很多优化名词。
| 瓶颈类型 | 优先考虑的优化方向 | 通常收益 | 主要代价 |
|---|---|---|---|
| 显存容量压力 | 量化、切分、缓存管理 | 能放下更大模型或更高并发 | 精度、兼容性、实现复杂度 |
| 带宽 / IO 压力 | 内存布局优化、IO-aware 算子、减少 copy | 更高有效吞吐 | 实现复杂、平台相关性强 |
| 热点算子低效 | 算子优化、核函数融合、编译优化 | 单步执行更快 | 调试和维护成本高 |
| 多卡扩展差 | 并行策略调整、通信优化、拓扑感知 | 扩展效率更好 | 系统复杂度显著上升 |
没有“万能优化”。任何优化结论都必须带着负载、平台和目标一起说。
真正成熟的优化思路,通常从资源观和系统症状出发,而不是从热门词开始。
最低完成标准是:至少能把显存、带宽、算子效率、通信四类瓶颈分别映射到一类优先优化手段。
最低完成标准是:你的理由里必须出现“为什么不是其他方向优先”。
最低完成标准是:要提到精度、兼容性、调试复杂度和平台耦合至少三个关键词。
最低完成标准是:不是只写“它很快”,而是写出它更像在押注哪些瓶颈假设。
一张瓶颈与优化方向映射表。
一份具体场景的优先优化清单。
你自己的优化决策原则摘要。
如果你能同时说出收益和代价,说明理解完整。
一个偏局部热点,一个偏整体执行组织。
如果你能把单卡逻辑和多卡逻辑区别开来,说明已经跨过这一层门槛。
这能检验你是否已经建立起“先看上下文”的判断方式。
适合理解量化在真实推理框架中怎样被组织成一条完整能力线。
适合理解内存、并行和性能调优为什么经常放在一起谈。
是理解“算子优化为什么经常围绕 IO 与内存访问模式展开”的好入口。
适合继续沿着量化、并行和优化特性读真实工程实现。
适合对比“轻量和本地推理”路线如何看待量化和硬件适配。
适合把本章的优化名词和真实框架能力一一对上。
没有瓶颈定位的优化叠加,很容易让系统更复杂、结果却更难解释。
它确实常用于省显存,但也可能改变内核路径、精度表现和维护成本。
实际上它牵涉通信、同步和拓扑,是另一层系统设计。
到这里,你已经具备了看框架时最需要的那套判断工具。下一章会正式用统一视角比较 vLLM、TensorRT-LLM、SGLang 和 llama.cpp,不再停留在“谁更火”的层面。