符号说明

符号说明

机器学习系统横跨机器学习(计算机科学与统计学)和系统(计算机体系结构与硬件)两个领域。各领域独立发展了各自的符号体系,许多符号在不同学术群体和出版物中具有不同含义。当这些学科交汇时,这种符号冲突会造成实质性的混淆。以下约定确立了一套统一的符号体系,以消除这种歧义。

考虑一个简单的陈述:“增大 \(B\) 可以提高吞吐量。” 对机器学习研究者而言,\(B\) 表示批大小。对硬件工程师而言,\(B\) 表示带宽。这两种解释在各自领域内都是正确的,但在机器学习系统中,我们需要在同一个方程中使用这两个概念,因此必须采用统一且一致的约定。

机器学习系统铁律

对于串行执行的各个阶段,铁律将性能分解为:

\[T = \underbrace{\frac{D_{\text{vol}}}{\text{BW}}}_{\text{Memory Time}} + \underbrace{\frac{O}{R_{\text{peak}} \cdot \eta_{\text{hw}}}}_{\text{Compute Time}} + \underbrace{L_{\text{lat}}}_{\text{Latency Overhead}}\]

每个变量都经过审慎选择,以避免与标准机器学习术语发生冲突。

符号 定义 单位 为何选择此符号?
\(T\) 时间 秒 含义明确。执行一次操作所需的实际经过时间。
\(D_{\text{vol}}\) 数据量 字节 避免与 \(D\)(数据集大小)冲突。在缩放定律中,\(D\) 表示训练词元数。此处需要表示经内存传输的字节数。下标用于消除歧义。
\(\text{BW}\) 带宽 字节/秒 避免与 \(B\)(批大小)冲突。系统文献常用 \(B\) 表示带宽,而机器学习文献常用 \(B\) 表示批大小。此符号保留了机器学习的惯例。
\(O\) 运算次数 FLOPs 浮点运算总次数。在方程中比“\(\text{Ops}\)”更简洁。
\(R_{\text{peak}}\) 峰值速率 FLOP/s 避免与 \(P\)(参数量)冲突。介绍 Roofline 模型时常用 \(P\) 表示性能,而机器学习文献通常用 \(P\) 表示参数数量。此符号保留了机器学习的惯例。
\(\eta_{\text{hw}}\) 效率 — 硬件利用率 \((0 \le \eta_{\text{hw}} \le 1)\)。避免与学习率 \((\eta)\) 冲突。
\(L_{\text{lat}}\) 延迟 秒 避免与 \(\mathcal{L}\)(损失)冲突。固定时间开销(内核启动、网络往返时间 RTT)。下标用于与损失函数区分。

这些选择为何重要

如果不审慎选择符号,句子就会产生歧义:

“减小 \(D\) 可以提高性能。”

这句话有两种可能的解读:

  • 减小数据集大小(减少训练样本)可以加快训练,但可能降低准确率。
  • 减少传输的数据量(例如通过压缩或量化)可以加快推理,对准确率的影响则取决于所采用的技术和校准方法。

采用本书的符号体系,我们可以精确地表述为:

“通过从 FP32 到 INT8 的量化来减小 \(D_{\text{vol}}\),可将参数的内存传输量降至原来的四分之一,同时保持 \(D\)(训练数据)不变。”

本书的符号体系消除了这种歧义:“\(\text{BW}\) 限制吞吐量” 只有一种解读。

带下标的变体

正体主符号表示物理量,下标指明该量的具体实例。这一约定将密切相关的测量量区分开来,而不是将它们合并为同一个符号:

  • \(\text{BW}_{\text{disk}}\)、\(\text{BW}_{\text{network}}\)、\(\text{BW}_{\text{accelerator}}\):数据路径上三个位置的带宽
  • \(D_{\text{vol}}\)、\(R_{\text{peak}}\)、\(L_{\text{lat}}\)、\(\eta_{\text{hw}}\):铁律中的各项,均与常见的机器学习符号保持明确区分
  • \(E_{\text{move}}\)、\(E_{\text{compute}}\)、\(E_{\text{total}}\):将一个能量预算拆分为可相互权衡的部分

因此,下标承载了论断的一部分含义。磁盘带宽与加速器带宽相差数个数量级,因此,只有下标指明测量位置,所报告的数值才具有可复现性。

退化方程

退化方程是一个通过拟合得到的局部模型。仅凭散度无法确定准确率变化的方向,因此应根据带标签的结果估计 \(\lambda\)。下文中的某些符号(如 \(\tau\))出现在章节正文中,而非方程中。 \[\text{Accuracy}(t) \approx \text{Accuracy}_0 - \lambda \cdot \mathcal{D}(P_t \lVert P_0)\]

符号 定义 单位/类型 说明
\(\text{Accuracy}(t)\) 时刻 \(t\) 的准确率 标量 模型部署后经过时间 \(t\) 时的准确率。
\(\text{Accuracy}_0\) 初始准确率 标量 部署时的模型准确率。
\(\lambda\) 拟合灵敏度 标量 根据指定范围内的结果估计的局部系数,并非普适常数。(不表示波长。)
\(P_t\) 当前分布 分布 时刻 \(t\) 的数据分布。(不表示参数;参数数量使用 \(P\)。)
\(P_0\) 训练分布 分布 训练时的数据分布。
\(\mathcal{D}(P_t \lVert P_0)\) 统计散度 标量 \(\ge 0\) 衡量 \(P_t\) 偏离 \(P_0\) 的程度。常见选择包括 KL 散度、全变差距离和 Wasserstein 距离。(采用花体以避免与表示数据集大小的 \(D\) 冲突。)
\(\tau\) 响应阈值 标量 \(> 0\) 用于启动调查的运维阈值;它不会自动触发重新训练。

能耗推论

采用每字节和每次运算的有效能耗,工作负载的能耗可近似表示为: \[E_{\text{total}} \approx D_{\text{vol}} \times E_{\text{move}} + O \times E_{\text{compute}}\]

符号 定义 单位 说明
\(E_{\text{total}}\) 总能耗 焦耳 机器学习工作负载消耗的总能量,分解为数据搬移项和计算项。
\(E_{\text{move}}\) 每搬移一字节的能耗 焦耳/字节 有效搬移能耗;总能耗还取决于搬移的字节数和执行的运算次数。
\(E_{\text{compute}}\) 每次运算的能耗 焦耳/FLOP 单次算术运算的能量开销。

深度学习符号

本书遵循标准深度学习惯例 (Goodfellow et al. 2016),并对系统变量作出明确区分,以消除歧义。

Goodfellow, Ian, Yoshua Bengio, and Aaron Courville. 2016. Deep Learning. MIT Press.
符号 定义 维度/类型
\(B\) 批大小 整数。并行处理的样本数量。(绝不表示带宽。)
\(P\) 参数量 整数。模型标量参数的总数量,包括权重和偏置。(绝不表示峰值 FLOP/s。)
\(D\) 数据集大小 整数。训练样本数或词元数。(绝不表示以字节计的数据量;后者使用 \(D_{\text{vol}}\)。)
\(S\) 序列长度 整数。词元数或时间步数。
\(d\) 隐藏维度 整数。隐藏状态向量的大小。
\(d_{\text{head}}\) 注意力头维度 整数。注意力层中每个头的隐藏维度。
\(N_L\) 层数 整数。网络中的总层数。
\(N_{\text{heads}}\) 注意力头数 整数。多头注意力层中的注意力头数量。
\(H_{\text{KV}}\) 键值头数 整数。分组查询注意力或多查询注意力中的键值头数量。
\(\ell\) 层索引 整数。某一层的索引。索引层时使用此符号,而不使用无下标的 \(L\),因为 \(L\) 与损失和延迟的符号冲突。
\(\mathcal{L}\) 损失函数 标量。训练过程中最小化的目标函数。
\(\eta\) 学习率 标量。优化器的步长。(绝不使用无下标形式表示硬件效率;后者使用 \(\eta_{\text{hw}}\)。)
\(\theta\) 模型参数 参数集合,通常视为一个向量。所有可学习参数的集合。
\(p(x)\) 分布 随机变量的概率质量/概率密度。通用分布使用小写 \(p(\cdot)\),以避免与 \(P\)(参数数量)冲突。
\(p(y \mid x)\) 条件分布 条件概率/概率密度。通用标签关系使用此形式;\(P_0\) 和 \(P_t\) 专用于退化方程中的训练分布和当前分布。
\(\Pr(E)\) 事件概率 事件 \(E\) 的概率。用于 \(\Pr(\text{batch}=0)\) 等事件陈述;分布则使用 \(p(x)\) 和 \(p(y \mid x)\)。

以拉丁字母表示的矩阵和向量使用粗体(\(\mathbf{W}\)、\(\mathbf{x}\));标量、维度、索引和单个矩阵元素保持斜体(\(N\)、\(d\)、\(i\)、\(W_{ij}\))。通用参数符号 \(\theta\) 是惯例中的唯一例外,保持斜体。局部矩阵代数也遵循相同的粗体规则:矩阵操作数使用粗体(\(\mathbf{A}\)、\(\mathbf{B}\)、\(\mathbf{C}\)),例如通用矩阵乘法(GEMM)\(\mathbf{C}=\alpha \mathbf{A}\mathbf{B}+\beta \mathbf{C}\)。粗体形式标识矩阵操作数,与表示标量批大小的斜体 \(B\) 不同;后者在标量语境中仍表示批大小。

性能、模型服务与内存符号

可复用的性能与模型服务相关量遵循与铁律相同的符号避冲突规则。速率使用 \(R\) 或具有描述性含义的希腊字母;请求数量使用 \(Q_{\text{req}}\),避免让 \(N\) 承载多重含义;队列利用率使用带下标的 \(\rho\),使无下标的 \(\rho\) 可用于其他比率模型。

符号 定义 单位/类型 说明
\(I\) 算术强度 FLOP/byte 工作负载每搬移一字节所执行的浮点运算次数。Roofline 模型使用 \(I\) 作为自变量。
\(I_{\text{ridge}}\) Roofline 脊点 FLOP/byte \(I_{\text{ridge}} = R_{\text{peak}}/\text{BW}\)。优先使用这一明确形式,而非带星号的简写,以确保正文中的含义清晰。
\(R_{\text{attain}}\) 可达计算速率 FLOP/s Roofline 上界:\(R_{\text{attain}} \leq \min(R_{\text{peak}}, I \times \text{BW})\)。使用 \(R\) 而非 \(T\),因为该量是速率。
\(\text{MFU}\) 模型浮点运算利用率 无量纲 有效模型 FLOP/s 除以可用峰值 FLOP/s。使用文字缩写可避免让 \(\eta\) 承载多重含义。
\(r_{\text{comp}}\) 压缩比 无量纲 未压缩大小除以压缩后大小。压缩后载荷的大小为未压缩大小的 \(1/r_{\text{comp}}\);下标用于避免与无下标的 \(C\) 冲突。
\(Q_{\text{req}}\) 请求并发数 请求数 稳定模型服务系统中正在处理或等待处理的平均请求数(根据 Little 定律,\(Q_{\text{req}} = \lambda_{\text{arr}} \cdot T_{\text{lat}}\))。避免与分布式场景中表示设备数量的 \(N\) 冲突。
\(\lambda_{\text{arr}}\) 到达率 请求/秒 请求到达率。下标用于避免与表示退化灵敏度或故障率的 \(\lambda\) 冲突。
\(T_{\text{lat}}\) 请求在系统中的停留时间 秒 用于 Little 定律的端到端排队/服务延迟。不同于铁律中的固定延迟项 \(L_{\text{lat}}\)。
\(T_{\text{svc}}(B)\) 批服务时间 秒 为大小为 \(B\) 的批次提供服务所需的时间。
\(\mu_{\text{eff}}(B)\) 有效服务率 请求/秒 批处理服务率,通常为 \(\mu_{\text{eff}}(B) = B/T_{\text{svc}}(B)\)。
\(\rho_{\text{serv}}\) 服务利用率 无量纲 队列/服务器利用率。使用此符号代替无下标的 \(\rho\);后者保留用于分布式语境中的通信与计算比率。
\(M_{\text{total}}\) 总内存占用 字节 明确列出的各内存组成部分之和;避免无下标的 \(M\) 所带来的歧义。
\(M_{\text{weights}}\) 权重内存 字节 模型参数占用的内存。
\(M_{\text{gradients}}\) 梯度内存 字节 已存储梯度占用的内存。
\(M_{\text{optimizer}}\) 优化器状态内存 字节 动量、方差、主权重及相关优化器缓冲区。
\(M_{\text{activations}}\) 激活内存 字节 为反向传播保留的激活值,或服务过程中的中间结果。
\(s_{\text{elem}}\) 元素存储大小 字节/元素 每个已存储张量元素占用的字节数。

单位与精度

  • 物理单位:本书始终使用 SI(公制)单位,包括米、千克、秒、瓦和 °C,与标准工程及科学实践保持一致。如果源数据最初以英制单位报告,本书会将其转换为 SI 单位,并在括号中注明原始数值。数字与单位之间始终以空格分隔(例如,100 ms、2 TB/s)。
  • 数据与内存:本书仅使用十进制 SI 前缀:KB = \(10^3\) 字节,MB = \(10^6\),GB = \(10^9\),TB = \(10^{12}\)。正文中不使用二进制前缀单位;所有容量、吞吐量和模型大小均以十进制单位报告(例如,80 GB、2 TB/s、102 MB)。
  • 计算:符号体系区分运算次数与速率。总计算量使用 FLOPs(例如,GFLOPs、TFLOPs),吞吐量则使用带十进制前缀的 FLOP/s(例如,GFLOP/s、TFLOP/s)。
    • 1 TFLOP = \(10^{12}\) FLOPs
    • 1 TFLOP/s = 每秒 \(10^{12}\) 次浮点运算
    • 算术强度通常使用 FLOP/byte 这一比值单位(每搬移一字节所执行的浮点运算次数)。这是一个比值单位,而非总计算量符号或吞吐量符号。
  • 货币:美元金额使用美元符号($);除非另有说明,以美元计价的成本均指美元(USD)。
  • 精度:
    • FP64:双精度(8 字节)
    • FP32:单精度(4 字节)
    • TF32:TensorFloat-32(19 位 Tensor Core 计算模式;输入和存储仍采用 FP32)
    • FP16:半精度(2 字节,标准范围)
    • BF16:Brain float(2 字节,宽动态范围)
    • FP8:四分之一精度(1 字节,E4M3 或 E5M2 格式)
    • FP4:4 位浮点格式
    • INT8:8 位整数(1 字节)
    • INT4:4 位整数;更低的整数精度遵循相同的大写 INTn 模式(例如,INT3、INT2)

速查:消除符号冲突

机器学习系统文献中常见的符号冲突包括:

符号 机器学习中的含义 系统中的含义 本书约定
\(B\) 批大小 带宽 批大小。带宽使用 \(\text{BW}\)。
\(P\) 参数量 峰值 FLOP/s 参数量。峰值速率使用 \(R_{\text{peak}}\)。
\(D\) 数据集大小 数据量 数据集大小。搬移的字节数使用 \(D_{\text{vol}}\)。
\(L\) 损失 延迟 损失 \((\mathcal{L})\)。延迟使用 \(L_{\text{lat}}\)。
\(\eta\) 学习率 效率 学习率。效率使用 \(\eta_{\text{hw}}\)。

总体原则是:单字母符号优先遵循机器学习惯例,系统概念则使用下标或多字母符号。这体现了本书的主要读者定位(学习系统知识的机器学习从业者),同时保留了与大量机器学习文献的兼容性。

Back to top
← 中文书架