优化原则
能够运行的模型很少同时具备高效率。第二部分阐明了如何构建遵循物理约束的机器学习系统;第三部分讨论如何满足现实场景对时间、内存和能耗的要求。每项优化都需要在一条前沿上权衡:改善某一指标(准确率、延迟、能耗),同时控制其他指标为此付出的代价。第三部分中的每项优化都通过以数学结构换取物理可行性,践行算法与机器的协同设计。这里的原则界定了效率的物理规律——这些规律决定了为什么某些模型速度快、成本低,而另一些模型速度慢、成本高得难以承受。
Principle 原则(英文原版): 帕累托前沿
不变量:将各目标的优化方向统一后,一个可行点位于帕累托前沿上,当且仅当不存在另一个点在所有目标上都至少与其同样好,并且在至少一个目标上严格优于它。
- 量化以数值精度换取更小的内存占用。
- 剪枝以模型容量换取更紧凑的表示;当目标硬件支持所产生的稀疏性或被移除的结构时,还可以提高速度。
- 知识蒸馏以训练计算量换取推理效率。
启示:系统工程师需要在这条前沿上权衡,找到适合特定部署环境的工作点。不存在普遍适用的最优解。
在帕累托前沿上进行权衡,需要明确应优化哪一种资源。在选择技术之前,工程师必须诊断工作负载究竟受限于计算、内存数据搬移,还是调度延迟。算术强度提供了第一项判别依据。
Principle 原则(英文原版): 算术强度定律
不变量:可达到的吞吐量(
\(R\))不超过峰值计算吞吐量(
\(R_{\text{peak}}\))与 DRAM 带宽(
\(\text{BW}\))乘以缓存–DRAM 边界处的运算强度(
\(I\))这两者中的较小值
(Williams et al. 2009):
\[ R \leq \min(R_{\text{peak}}, I \times \text{BW}) \]
运算强度和 DRAM 带宽都必须在缓存–DRAM 边界处测量;这一理想上界不包含启动、同步及其他固定开销。
启示:对于受带宽限制的内核,提高峰值计算吞吐量并不会提高理想的 Roofline 上界。工程师必须先确定瓶颈是计算、带宽,还是其他系统项,再选择优化方法。
Williams, Samuel, Andrew Waterman, and David Patterson. 2009. “Roofline: An Insightful Visual Performance Model for Multicore Architectures.” Communications of the ACM 52 (4): 65–76. https://doi.org/10.1145/1498765.1498785.
Wulf, Wm. A., and Sally A. McKee. 1995. “Hitting the Memory Wall: Implications of the Obvious.” ACM SIGARCH Computer Architecture News 23 (1): 20–24. https://doi.org/10.1145/216585.216588.
Gholami, Amir, Zhewei Yao, Sehoon Kim, Coleman Hooper, Michael W. Mahoney, and Kurt Keutzer. 2024. “AI and Memory Wall.” IEEE Micro 44 (3): 33–39. https://doi.org/10.1109/mm.2024.3373763.
许多重要的机器学习内核位于脊点的内存受限一侧,尤其是嵌入查找、归一化、softmax、逐通道卷积和小批量推理路径等数据复用程度较低的运算。相比之下,当批量大小和硬件利用率较高时,稠密矩阵乘法和卷积可能受限于计算。这种分化源于内存墙:从历史上看,处理器速度的增长一直快于内存带宽,二者的累积差距在三十年间不断扩大 (Wulf and McKee 1995; Gholami et al. 2024)。神经网络具有庞大的权重张量和不均匀的时间局部性,因此尤其容易受到影响。算术强度定律用于诊断工作负载相对于这道墙处于什么位置。数据搬移的代价则解释了为什么这道墙的影响如此严重。Table 1 将各类瓶颈分别对应到能够缓解它们的代表性优化,以及不会改变主导项的改动。
性能只是内存数据搬移的一项代价;能耗揭示了第二项约束。
Principle 原则(英文原版): 能耗与数据搬移不变量
不变量:工作负载的总能耗由单次事件的能耗和事件次数共同决定。在所引用的 45 nm 参考数据中,从 DRAM 搬移一个 32 位数值的单次能耗可能约为一次 32 位浮点运算的 100–1,000
\(\times\),具体取决于运算类型
(Horowitz 2014)。 这里,
\(e_{\text{DRAM,32-bit}}\) 表示一次 32 位 DRAM 访问的能耗,
\(e_{\text{arithmetic,32-bit}}\) 表示所引用的 45 nm 工艺中一次 32 位浮点算术运算事件的能耗。
\[ e_{\text{DRAM,32-bit}} \gg e_{\text{arithmetic,32-bit}} \quad \text{for the cited reference} \]
启示:当内存数据搬移主导工作负载能耗时,优化策略应优先考虑内核融合(避免中间数据的片外传输)和量化(减小数据大小);当计算占主导地位时,减少运算次数和改进算术运算内核仍然是核心。
Horowitz, Mark. 2014. “1.1 Computing’s Energy Problem (and What We Can Do about It).” 2014 IEEE International Solid-State Circuits Conference Digest of Technical Papers (ISSCC), 10–14. https://doi.org/10.1109/isscc.2014.6757323.
即使数据局部性完美、瓶颈定位与优化都达到最优,仍有一项最终约束限制着任何优化所能带来的加速比。
Principle 原则(英文原版): 阿姆达尔定律
不变量:系统的最大加速比受工作负载中无法加速的部分所占比例限制
(Amdahl 1967)。 这里,
\(f_{\text{parallel}}\) 是基线执行时间中得到加速的部分所占的比例,
\(S_{\text{parallel}}\) 是该部分的加速比;固定工作量模型假设其余部分保持不变,且加速不会引入额外开销。
\[ \text{Speedup} = \frac{1}{(1-f_{\text{parallel}}) + \frac{f_{\text{parallel}}}{S_{\text{parallel}}}} \]
启示:如果模型执行时间的 95% 所对应的部分在 GPU 上获得 100\(\times\) 的加速比,整个系统的加速比上限约为 16.8\(\times\)。这解释了为什么在高度优化的系统中,数据加载和预处理往往会成为最终瓶颈。
Amdahl, Gene M. 1967. “Validity of the Single Processor Approach to Achieving Large Scale Computing Capabilities.” Proceedings of the April 18-20, 1967, Spring Joint Computer Conference on - AFIPS ’67 (Spring), AFIPS ’67 (spring), 483–85. https://doi.org/10.1145/1465482.1465560.
第三部分通过数据—算法—机器(D·A·M)分类体系系统地应用这些原则:首先判断工作是否必要,然后判断能否简化,最后考虑如何更快地完成工作(完整诊断框架见 数据—算法—机器分类体系 )。基准测试通过检验这些理论上的节省能否在不违反质量约束的前提下保留到端到端执行中,完成这一闭环。