符号说明
符号说明
机器学习系统横跨机器学习(计算机科学与统计学)和系统(计算机体系结构与硬件)两个领域。各领域独立发展了各自的符号体系,许多符号在不同学术群体和出版物中具有不同含义。当这些学科交汇时,这种符号冲突会造成实质性的混淆。以下约定确立了一套统一的符号体系,以消除这种歧义。
考虑一个简单的陈述:“增大 \(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),并对系统变量作出明确区分,以消除歧义。
| 符号 | 定义 | 维度/类型 |
|---|---|---|
| \(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}}\)。 |
总体原则是:单字母符号优先遵循机器学习惯例,系统概念则使用下标或多字母符号。这体现了本书的主要读者定位(学习系统知识的机器学习从业者),同时保留了与大量机器学习文献的兼容性。