题目重点:由 m×512 和 512×1048576 矩阵估 FLOPs、算术强度、访存与显存,分析 72 层及 tensor/pipeline parallel 的通信边界。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 先用一次浮点乘加算 2 FLOPs,矩阵均为连续存储、无稀疏性;精度以 2 字节/元素的 FP16 训练例说明,若 FP32/其他精度则字节数成比例改变。
- 只估理想下界:矩阵至少各读一次、输出至少写一次;实际 kernel 有 tile 复用、cache、额外读写、workspace 与启动开销。不给不存在于题目的峰值 TFLOPS/带宽数值。
- 72 层的 type 1/type 2 维度排列未附完整计算图、激活复用和并行切分位置,因此不能直接把单层时间乘 72 当成精确端到端时延。
解题路线
- 单层 FLOPs 为 `2mkn`,代入 k=512、n=2^20,等于 `2^30·m`;m=2 时约 2.15×10^9 FLOPs,m=8192 时约 8.80×10^12 FLOPs。
- 最低 HBM 流量 `s·(mk+kn+mn)` 字节,s 为每元素字节。FP16 时 B 固定 1GiB;m=8192 时输出 16GiB、输入 A 8MiB,总至少约 17.008GiB。算术强度 `2mkn / [s(mk+kn+mn)]`;小 m 时主要被巨大的 B 读入支配,大 m 时算术强度上升。
- 以可用计算峰值 P、可用内存带宽 BW 写 roofline:`T ≥ max(FLOPs/P, bytes/BW)`,再加 kernel launch、重排和网络通信项;P 与 BW 应使用给定硬件精度模式和实测有效值。显存检查则按同时驻留的输入、输出、权重、workspace 与框架开销求和,并辨别 GB 与 GiB。
- 72 层要画出每层的输入/权重/输出形状和是否能覆盖/释放前一层激活,统计峰值 live bytes 而非所有中间张量机械相加。若 72 份同样的 B 权重同时驻留,FP16 光 B 就约 72GiB,明显超 40GB;若逐层流式加载,容量可下降但增加数据传输。
- 双 GPU tensor parallel 把某维矩阵切开,计算/权重约减半,但输出需要 all-gather 或 partial sum 需要 all-reduce;pipeline parallel 把层分段分给 GPU,权重驻留分摊,microbatch 数影响流水线空泡。分别写出计算、跨卡字节和峰值 live set 后再比较,不能只说两卡快两倍。
手动走一遍
m=8192、FP16 时,A 为 8192×512×2=8MiB,B 为 512×2^20×2=1GiB,C 为 8192×2^20×2=16GiB;三者理想同时驻留约 17.008GiB,表面低于 40GB,但若 kernel workspace、其他层权重及 runtime 超过剩余空间仍可能 OOM。m=2 时 C 仅 4MiB,B 的 1GiB 读取主导最低流量。
规模与取舍
算单层 FLOPs/字节/容量为 O(1) 代数估算;真正执行的算术量 Θ(mkn),理想最少访存 Θ(mk+kn+mn) 个元素。72 层与双 GPU 的时间模型应累加各层计算、内存与通信约束,并取重叠执行时的关键路径。
易错点与追问
容易失分的边界
- 把 40GB 当成可全部放张量,不留 workspace、runtime、KV/cache 或其他权重。
- 把 GB 与 GiB 混用;16GiB 输出不是 16GB。
- 用 FLOPs 除峰值算力得到精确时间,忽略带宽、形状、精度模式和 launch。
- tensor parallel 只算计算量减半,漏算跨卡归约和激活通信。
- 题目未明确 A100 具体 P/BW、72 层完整图,不应编造单个毫秒答案。
继续深挖
- 小 m 与大 m 分别更可能落在 roofline 哪一侧,实测如何验证?
- 如果只能同时保留一份输入、一份输出和当前层权重,流水线/重计算能把峰值 live set 降到多少?
- 两 GPU 的互连带宽改变时,tensor 与 pipeline 的优劣何时反转?
