流水线气泡时间网格
流水线并行最疼的一笔账:启动时下游没事干、收尾时上游没事干,这些空转就是气泡。好在有个免费的气泡阀——把全局批次拆成越多份 micro-batch,气泡越薄。拧两个旋钮看网格怎么被填满、气泡怎么从 46.7% 压到 9.9%,再拧过头看看「矩阵乘变矮」的墙在哪。
纯前端纯几何:气泡率 = (p−1)/(m+p−1),网格每行 = 段 i 的空转头(i−1) + 忙(m) + 空尾(p−i),空转格 p×(p−1) 与公式严格同源(拧任何参数两处读数恒一致);文章三档 8 段 × m=8/32/64 → 46.7%/17.9%/9.9% 逐位复现;1F1B 调度压在飞激活显存、气泡率同式(文章原文)。零 API、零随机。
时间网格:每段一行,青 = 干活、灰 = 空转
时间轴 39 格 · 空转 56 / 忙 256左侧空位 = 启动时下游等着第一份 micro-batch 流过来;右侧空位 = 收尾时上游已经干完。两块空位合计恒为 p−1 格/段。
8 段流水线、32 份 micro-batch:时间轴 39 格里空转 56 格——气泡率 17.9%(文章三档之一:46.7% / 17.9% / 9.9%)。把 m 再往上拧一档,看气泡怎么变薄;拧过头则撞「矩阵乘变矮」的计算效率墙(文章:权衡)。 启动时下游没事干、收尾时上游没事干——左边空的是下游,右边空的是上游。
那边是账本:ZeRO 分片省多少显存、通信代价排序、加并行度前的三笔账——气泡率只是其中一行数字。 这边是时间结构本身:启动/收尾的空转长什么样、m 怎么把气泡压薄、p 怎么把它撑厚—— 「为什么 PP 的侵入性最深还要用」的那笔疼账,看一眼网格就懂了。
网格与公式严格同源:空转格 p×(p−1)、忙格 p×m,气泡率 = 空转 ÷ 全格——拧任何参数两处读数永远一致。 1F1B(前向反向交错)压的是在飞激活的显存占用,气泡率与朴素调度同式(文章原文)。零 API、纯几何。