原计划64块H100,实际单块GH200,21B MoE预训练MFU达50.7%
我是一名独立研究者。由于预算限制,我将原本计划在 64 块 H100 上运行的 21B MoE 预训练任务,转移到了单块 NVIDIA GH200(每小时 2.29 美元)上,并把这一过程中测得的各项指标整理成了一篇论文。
希望对那些预算有限、刚开始接触 LLM 的人有所帮助。
以下是我在组合现有技术时,每个阶段记录下来的指标。
环境配置
- 模型:MoE(Mixture of Experts,混合专家),总参数 20.99B,激活参数 3.36B(30 层,从 64 个专家中选择 4 个)
- 238.5 GiB 的 FP32 训练数据全部存放在 CPU 内存中,GPU 的优化器内核通过 NVLink-C2C 直接更新这些数据
- 云服务商将 GPU 功耗限制在 700 W
结果
- 基准测试 MFU:21.1% → 50.7%(13 个测量点,其中 1 个涉及模型变更)
- 真实数据训练 MFU:36.5% → 48.9–49.1%(10.9B tokens;从 4B tokens 开始,由两块 GH200 通过 DiLoCo(分布式低通信训练)连接)
- 计入同步时间后,估算为 47.6–47.8%
- 失败的情况也很少
其他技术观察:
- Transformer Engine FP8、逐行 FP8:GEMM 变快了,但量化核函数反而更慢
- 将所有激活值卸载到 CPU 的方法;在 GPU 与 CPU 之间做累积式分区
- CPU 加法问题:相同设置下,每次运行的速度在 22% 到 32% 之间波动(使用 C++ OpenMP 内核解决)
局限性
- 只测试了一种模型和一种硬件
- 各阶段的指标并不是严格的消融实验,因为混合了不同的代码版本和测量方法
- 我们无法验证 FP8 对质量的影响
- 我们只覆盖了 Stage 1 的前约 11B tokens
代码与论文
代码、基准测试记录和训练日志:https://github.com/DW-dev-UE/LLM-from-scratch/tree/main/apex3
论文:https://zenodo.org/records/23316135
如果你在测量方法或数值分析中发现了任何错误,请告诉我。
我目前在 21B 预训练过程中观察到了额外的涌现能力。
另外,如果有机会,我也想把这篇文章提交到 arXiv 🫠
高票评论
+2 u/ClearApartment2627:这肯定不算错误,但可能是个遗漏:MFU 的全称是 Model FLOPs Utilization(模型浮点运算利用率)。虽然你在论文里定义了它,但我没看到你明确写出全称。对于很多第一次深入接触模型训练的读者来说,写出全称有助于他们的直观理解。