F21|算得快与装得下:复杂度、带宽、批处理和并行
从具体对象与小例子开始,理解计算过程与适用条件。
本章目录
算得慢,可能是东西搬得慢
为什么一块算力更高的GPU,不一定让任务同比变快?
把GPU想成工厂只适合记住一个有限类比:运算像加工,读写像运输。加工设备翻倍但运输仍堵塞,整体不会同比快。真正的分析应回到运算数、搬运字节数、设备速率与测量,而不是只看某个宣传峰值。
输入与适用条件:固定教学任务与理想速率。第二、三帧是各自恢复基准后只改一个因素的独立对照;不宣称真实运行时间。
1 / 4 · 先问算力和搬运谁更慢
窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。
教学任务:1,000,000次浮点运算;8,000,000字节搬运。假定算力10亿次/秒、带宽10亿字节/秒。
计算=1ms;搬运=8ms默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。
为什么需要
先定位主导瓶颈,才知道该优化矩阵计算、显存读写还是调度。
怎样实现
用分账估计指导Profile,再用同任务实测检查。
可能的代价与误解
提高吞吐可能增加单请求排队;分片省内存可能增加网络通信。
如何判断是否做对
观察端到端时间及各阶段Trace,避免只测某一个最快算子。
先区分三本账
计算量是需要做多少次运算;存储量是要保存多少数据;数据移动量是需要在不同存储层或设备间搬多少数据。少存一些,不一定少算;增加并行,不一定让一个请求更快。
FLOP常指一次浮点运算;FLOPS是每秒浮点运算数量。二者差一个S,却分别是工作量与速率。一次乘加是否计为两次FLOP要看统计约定。
O(T²)到底是什么意思
复杂度Big-O描述输入规模变大时工作量增长的级别。若T个查询都要与T个Key比较,就有T²对关系。T翻倍,关系数变为4倍,因此常说注意力分数部分关于T是二次增长。
这不是说某实现必然花T²秒,也不保证端到端时间刚好变4倍,因为硬件、隐藏宽度、内存移动和其他层也参与。写复杂度时应说明哪个变量在增长、其他什么暂时固定。
为什么存储足够也可能算不快
硬件有计算能力上限,也有每秒读取数据的带宽上限。若每读很多数据只做少量运算,可能被带宽限制;若数据能重复利用而计算很多,可能被计算能力限制。
用粗略下界估算:任务做C次运算、移动M字节,计算速率R、带宽BW,耗时至少受到max(C/R, M/BW)约束。这类思路属于Roofline(屋顶线)分析。实际还有排队和同步开销,不能当精确计时公式。
FlashAttention省的是什么
普通概念实现会显式形成很大的T×T分数或权重表。FlashAttention通过分块等方法,在计算时管理局部块和归一化统计,避免把整张中间表反复存取外部显存。
它没有简单把精确注意力变成只读几个Token,也不等于KV缓存。前者安排单次注意力计算的读写,后者跨生成步骤复用历史K/V。高级Q027会推导在线softmax,先用“同样目标,换一种中间存储和访问次序”理解它。
PagedAttention与连续组批
分页把缓存切成固定大小的块,用映射表记住每条序列的逻辑块对应哪块物理存储,帮助管理不同长度请求和共享前缀。它与操作系统分页有相似管理思想,但具体对象是KV数据,不是整个程序的所有内存。
连续组批continuous batching允许某个请求完成后释放位置,再加入新请求,而不是整批必须同步结束。它可以提高资源利用,但prefill、decode、长短请求之间仍要调度。
多GPU到底切哪部分
| 方法 | 主要分法 | 你需要追踪的代价 |
|---|---|---|
| 数据并行DP | 多份模型处理不同样本 | 训练时同步梯度等 |
| 张量并行TP | 拆矩阵或算子到多个设备 | 层内通信与组合 |
| 流水并行PP | 不同层放不同设备 | 阶段等待与传输 |
| ZeRO类分片 | 分摊训练参数、梯度或优化器状态 | 取用和同步开销 |
更多设备不是无条件加速。如果一次通信时间大于省下的计算时间,可能更慢。训练分片与推理分离服务也不能用同一个名词代替。
训练保存、推理缓存与检查点
训练为求梯度可能保留激活;activation checkpointing保存部分节点、在反向时重算其他部分,用计算换内存。KV缓存则用内存换重复推理计算。它们甚至体现相反的资源取舍。
磁盘上的模型检查点保存恢复所需权重或训练状态;Agent任务检查点保存工作进展。名字都叫checkpoint,保存对象完全不同。
先数计算与搬运,再决定是不是GPU算力不够
输入与条件。假想操作要做1,000,000次浮点运算,并搬运8,000,000字节。假想设备峰值100GFLOP/s、带宽10GB/s,单位按十进制。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1算纯计算下界 | 10^6/10^11秒 | 0.00001秒,即10微秒。 |
| 2算纯搬运下界 | 8×10^6/10^10秒 | 0.0008秒,即800微秒。 |
| 3取更大瓶颈 | 理想充分重叠时取max | 至少约800微秒,而不是10微秒。 |
| 4减少搬运 | 若融合操作只需4MB | 搬运下界约400微秒;算力没变也可能更快。 |
| 5改成平方配对 | T从100增到200 | 注意力位置对从10,000变40,000,不是只多一倍。 |
把过程连起来。“省内存读写”和“减少数学配对数量”是不同优化。不能看到GPU峰值很高就忽略搬运。
边界与反例。这些是理想化下界,不是实际性能;还未计调度、通信、核启动、缓存命中和重叠不足。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。
课后自检
输入T翻倍,T×T关系数怎样变?是否代表整个系统必然慢4倍?
查看参考答案收起参考答案
FlashAttention、KV Cache和量化能互相替代吗?
查看参考答案收起参考答案
延伸阅读:相关系统问题
04|输出是怎样一个Token一个Token生成的05|训练的一步:从正确标签到参数真正改变
07|KV Cache、FlashAttention与PagedAttention的内部过程
08|推理服务:调度、吞吐、延迟和并行
25|生产运行:Trace、成本、队列、灰度与回滚
机制依据:[FLASH][PAGED][TP][ZERO][SRE]。本节数值与情景除另注外均为原创教学示例;来源不代替中文讲解。