D·A·M 基础
在生产环境中,“它很慢”和“它错了”往往都不是有信息量的症状。一个服务栈可能因为加速器处于空闲状态(数据饥饿)而错过延迟目标,因为模型做了不必要的工作(算法开销),或者因为加速器被饱和(机器受限)。本附录提供了一个紧凑的诊断框架——数据、算法与机器(D·A·M)——并确立单机性能基础,集群级计算、通信与协同都建立在这一基础之上。
Learning Objectives
- 按主导的数据、算法或机器轴对单机瓶颈进行分类,同时识别混合成因
- 将优化技术映射到其 D·A·M 交叠区域,以理解它们跨越了哪些轴
- 应用铁律方程对性能问题进行定量诊断
- 利用算术强度区分内存受限与计算受限的工作负载
- 为每个数据、算法或机器轴选择合适的性能剖析工具和优化策略
- 使用 D·A·M 记分卡指标(I/O 开销、活跃参数、MFU)评估系统健康度
本附录的使用方法
本附录设计为单机性能的参考手册。首先从记分卡式指标入手,形成关于哪个轴占主导的假设,然后选择能够证实(或证伪)该假设的工具。
当单个 GPU 上的训练很慢时,检查利用率、数据等待时间和模型 FLOPs 利用率(MFU),然后将各项分别映射到其数据、算法或机器轴。当服务错过延迟目标时,判断所处形态是延迟受限(开销)、内存受限(权重/KV 移动)还是计算受限。当成本急剧上升时,使用 D·A·M 评分标准,确保投入针对主导项,而非非瓶颈部分。
数据—算法—机器(D·A·M)分类法是机器学习系统工程的主要诊断框架。它形式化地描述了信息流、数学逻辑与物理执行之间的相互依赖关系。当性能停滞或行为退化时,应问:信息流在哪里受阻? 该分类法帮助实践者沿三条诊断轴分解瓶颈,1 同时认识到真实系统可能涉及混合成因或轴之间的相互作用。
1 MECE(相互排斥、完全穷尽):源自管理咨询领域(由麦肯锡推广)的一项分类原则,要求各类别互不重叠,并共同涵盖所有可能性。应用于系统工程时,它可作为一种有用的理想化分解方式,但实践中的 D·A·M 瓶颈往往相互重叠:一个内核可能同时受内存限制、需要大量同步,且与可用硬件匹配不佳。
诊断摘要
该分类法直接对应 集群定律 中引入的机器学习系统铁律。表 1 汇总了每条轴的作用、主要物理约束与核心优化路径。
| 轴 | 作用 | 物理约束 | 高效优化手段 |
|---|---|---|---|
| 数据(D) | 信息(燃料) | 带宽(\(\text{BW}\)) | I/O 流水线优化 |
| 算法(A) | 逻辑(蓝图) | 运算量(\(O\)) | 模型压缩 |
| 机器(M) | 物理(引擎) | 吞吐量(\(R_{\text{peak}}\)) | 硬件加速 |
铁律映射
明确三条轴之后,下一步是将它们与时间联系起来。任何机器学习任务的性能都取决于工作在 D·A·M 各轴上的分布,而铁律映射揭示了哪个组件的变量主导执行过程:
\[ T = \underbrace{ \frac{D_{\text{vol}}}{\text{BW}} }_{\text{Data (D)}} + \underbrace{ \frac{O}{R_{\text{peak}} \cdot \eta_{\text{hw}}} }_{\text{Algorithm (A)/Machine (M)}} + \underbrace{ L_{\text{lat}} }_{\text{Overhead}} \]
算法与机器共享计算项,两者的区别在于工程师控制的是哪个变量。减少总运算量(\(O\))是算法层面的优化手段,而提高硬件的峰值吞吐量(\(R_{\text{peak}}\))或利用率(\(\eta_{\text{hw}}\))是机器层面的优化手段。
D·A·M 协同:从求和到取最大值
加法形式的铁律表示顺序执行,即数据、算法与机器依次执行的最坏情况。重叠执行可以使总耗时从各项之和趋向各项中的最大值,而完全重叠则确定了理想下界:
\[ T_{\text{sequential}} = \frac{D_{\text{vol}}}{\text{BW}} + \frac{O}{R_{\text{peak}} \cdot \eta_{\text{hw}}} + L_{\text{lat}} \quad \xrightarrow{\text{overlap}} \quad T_{\text{pipelined}} \geq \max\left(\frac{D_{\text{vol}}}{\text{BW}},\; \frac{O}{R_{\text{peak}} \cdot \eta_{\text{hw}}}\right) + L_{\text{lat}} \]
系统工程师的任务是让这些组件并行运行,而不是串行运行。表 2 汇总了关键的 D·A·M 协同技术:
| 技术 | 重叠执行的 D·A·M 轴 | 实现方式 |
|---|---|---|
| 预取 | D 与 M 重叠执行 | 使用 prefetch_factor、pin_memory=True 的 DataLoader |
| CUDA 流 | D 与 M 重叠执行 | 为 H2D 传输和计算分别使用独立的流 |
| 异步梯度同步 | M(通信)与 A 重叠执行 | 随着梯度桶就绪,将梯度全归约与剩余的反向传播计算重叠执行 |
| 双缓冲 | D 与 M 重叠执行 | 填充缓冲区 \(i+1\),同时使用缓冲区 \(i\) 进行计算 |
算术强度边界
这种重叠执行的视角仍留下一个实际问题:工作负载究竟是在等待字节传输,还是在等待浮点运算。数据轴(内存受限)与机器轴(计算受限)之间的边界并非任意划定,而是由工作负载的算术强度2(\(I\))在数学上定义。
2 算术强度:浮点运算次数与传输字节数之比(FLOP/byte)。将其与硬件的屋脊点(\(R_{\text{peak}}/\text{BW}\))比较,即可判断工作负载是内存受限还是计算受限。
下列症状是筛查信号,而非诊断结论。算术强度位于 \(R_{\text{peak}}/\text{BW}\) 左侧的工作负载,每传输一个字节所能提供的有效计算量不足以让加速器充分工作;但解读原始利用率时,必须同时考察内存带宽利用率、数据加载器等待时间、内核占用率以及执行追踪中的空隙。
- GPU 利用率低 (\(<\) 80%): 排查数据、CPU 或启动方面的饥饿。通过数据加载器等待、主机 CPU 饱和、内存带宽计数与时间线缺口加以确认。
- GPU 利用率高 (\(>\) 95%): 只有在计算单元处于忙碌状态且内存带宽未饱和时,才将其视为机器受限。若内存带宽已饱和,瓶颈仍然位于数据/机器边界。
- 若批大小为 1:应视为延迟或启动开销可能成为关键问题的警示。对于大语言模型(LLM)解码,批大小为 1 的执行通常受内存带宽限制,除非追踪显示调度缺口。
- 若算术强度低于临界点(在 H100 上约为 295.2 FLOP/byte):该工作负载很可能属于内存受限(数据/机器边界)。
瓶颈诊断
瓶颈确定后,表 3 展示了哪些优化有效、哪些优化是浪费:
| 若工作负载属于… | 主导项 | 有效的优化 | 浪费的优化 |
|---|---|---|---|
| 内存受限 | \(D_{\text{vol}}/\text{BW}\) | 量化、剪枝、批处理、内核融合、更高的内存带宽 | 仅增加峰值 FLOP/s |
| 计算受限 | \(O/(R_{\text{peak}} \cdot \eta_{\text{hw}})\) | 更好的内核、张量核心、更快的 GPU、更低的精度 | 增加更多内存带宽(非绑定项) |
| 延迟受限 | \(L_{\text{lat}}\) | 批处理请求、内核融合、异步调度 | 既非计算也非带宽(开销占主导) |
工具映射
在操作表缩小可能的修复方案之后,工具映射确定了验证所需的测量。使用 表 4 在沿某个特定 D·A·M 轴诊断瓶颈时选择正确的性能剖析工具:
| 轴 | 关键指标 | 主要工具 | 次要工具 |
|---|---|---|---|
| 数据 | 批加载与等待时间 | Framework 剖析器追踪 | iostat、pidstat(I/O/CPU) |
| 算法 | FLOPs、模型深度 | PyTorch Profiler | DeepSpeed Flops Profiler |
| 机器 | GPU 利用率、SM 占用率 | Nsight Compute | DCGM、Nsight Systems |
D·A·M 记分卡
表 5 中的效率比率将系统性能与其理论上限进行比较评级。该成绩单以 MFU3 为锚点,即已实现模型 FLOP/s 与硬件理论峰值 FLOP/s 之比。
3 MFU(模型 FLOPs 利用率):仅衡量有用的模型计算,排除梯度同步与内存管理等开销。
| 轴 | 指标 | 定义 | 不及格 | 及格 |
|---|---|---|---|---|
| 数据 | I/O 开销 | \(\frac{\text{Data Wait Time}}{\text{Total Step Time}}\) | \(>\) 10% | \(<\) 1% |
| 算法 | 压缩/稀疏比 | \(\frac{\text{Effective or active parameters}}{\text{Dense baseline parameters}}\) | 取决于工作负载 | 取决于工作负载 |
| 机器 | MFU | \(\frac{\text{achieved model FLOP/s}}{\text{peak FLOP/s}}\) | \(<\) 30% | \(>\) 50% |
扩展分类法:从节点到集群
这些单机评级在推进到分布式设计时最为有用。D·A·M 分类法是单机的诊断基线,但随着系统从单个节点扩展到机器学习集群,每条轴都会经历定性转变。理解这些联系对于从本地优化过渡到集群级工程至关重要。
约束的演进
表 6 将每条轴从节点级关注点映射到其在集群规模上的转变:
| 轴 | 节点级关注点(D·A·M) | 集群规模上的转变 |
|---|---|---|
| 数据(D) | I/O 带宽(磁盘/PCIe) | 通信墙:瓶颈从本地存储转移到网络互连结构的双划分带宽。 |
| 算法(A) | 模型深度/运算数 | 并行策略:逻辑现在包含计算如何在 \(N\) 台设备(3D 并行)之间划分。 |
| 机器(M) | 峰值 TFLOP/s、HBM | 功耗与可靠性墙:约束不再只是芯片速度,而是每机架瓦数与集群级 MTBF。 |
过渡到 \(C^3\)
D·A·M 诊断单个节点的组成部分,而 \(C^3\) 分类法(The C^3 分类法)诊断集群的交互作用。
- 计算(\(C_1\))继承了算法与机器两个轴,但增加了扩展效率损失这一因素。
- 通信(\(C_2\))继承了数据轴,但受光速和网络拓扑支配,而非仅由本地 I/O 决定。
- 协同(\(C_3\))是面向大规模系统的衔接维度,在单节点层面没有对应项。它代表协同开销,即用于同步、检查点和故障恢复的时间,这些开销只有在集群规模下才会显现。
这一递进关系确保不会为了单节点效率(高 MFU)而牺牲集群规模下的效率(导致低扩展效率)。节点优化的目的是服务于集群。
总结
D·A·M 分类法为每一次机器学习系统分析提供诊断基线。通过将瓶颈定位到数据、算法或机器,从业者可以确保优化工作针对起制约作用的约束。这种单节点分析方法是本书贯穿始终讨论的集群规模工程的前提。
Key Takeaways: 单机诊断启发式方法
- 识别主导轴:在提出任何优化方案之前,先判断数据、算法或机器中哪一项是起制约作用的约束。
- 剖析算术强度:算术强度能够定量区分受数据制约和受机器制约的两种形态。
- 运用铁律:铁律将模糊的症状转化为由具体项表征的瓶颈。
- 使用评分卡评级:数据—算法—机器评分卡在扩展到集群规模之前,先为“良好”性能确立统一标准。