BLOOM 176B 训练技术概览
TL;DR
BLOOM 的 176 B 参数模型在 384 × 80 GB NVIDIA A100 GPU 上训练了 3.5 个月,使用了自定义的 Megatron‑DeepSpeed 堆栈,该堆栈结合了 ZeRO 数据并行、张量并行和流水线并行以及 BF16 混合精度,使得在法国的 Jean Zay 超级计算机上实现了 100 万 GPU‑hour 的运行。
项目概述
- 硬件:384 块 A100 80 GB GPU(48 个节点,每节点 8 块 GPU),配备 AMD EPYC 7543 CPU,每节点 512 GB RAM,Omni‑Path 互连,专用 NCCL 子网,GPFS 存储。
- 软件:Megatron‑DeepSpeed(一个合并了 Microsoft DeepSpeed 和 NVIDIA Megatron‑LM 的分支)。
- 架构:GPT‑3 风格的 transformer,加入了改进(ALiBi 位置编码、嵌入层 LayerNorm)。
- 数据集:来自 46 种语言的 350 B 令牌(约 1.5 TB 清洗文本),词表大小 250 680。
- 训练时长:约 3.5 个月(≈100 万 计算小时)。
关键贡献者
此工作依赖于六个主要团队:
- Hugging Face BigScience 团队(内部工程师和资金)。
- Microsoft DeepSpeed 团队(提供 DeepSpeed 库和集成帮助)。
- NVIDIA Megatron‑LM 团队(框架和建议)。
- IDRIS/GENCI 员工,负责管理 Jean Zay 超级计算机(提供计算资源)。
- PyTorch 核心团队(错误修复和可用性改进)。
- BigScience 工程工作组的志愿者。
值得注意的个人包括 Olatunji Ruwase、Deepak Narayanan、Jeff Rasley、Jared Casper、Samyam Rajbhandari 和 Rémi Lacroix。
Megatron‑DeepSpeed 堆栈
| 组件 | 由 DeepSpeed 提供 | 由 Megatron‑LM 提供 |
|---|---|---|
| ZeRO 数据并行 | ✅ | |
| 张量并行 | ✅ | |
| 流水线并行 | ✅ | |
| BF16 优化器 | ✅ | |
| 融合 CUDA 核 | ✅ | |
| DataLoader | ✅ |
该堆栈实现了 3‑D 并行:
- 数据并行 (DP) 将模型复制到多个 GPU 组,每个 GPU 处理一块数据。
- 张量并行 (TP) 将单个张量切分到多个 GPU 上,降低每个 GPU 的内存占用。
- 流水线并行 (PP) 将模型在 GPU 之间垂直切分,以流水线方式处理微批次,避免 GPU 空闲。
- ZeRO 进一步切分优化器状态、梯度,甚至权重,以适配大模型。
并行细节
ZeRO 数据并行
与完整模型复制不同,每个 GPU 只保存参数、梯度和优化器状态的一部分,并在需要时即时重建完整张量。这大幅降低了内存开销。
张量并行
权重矩阵在 GPU 之间按列切分;每个 GPU 计算矩阵乘法的相应切片并在本地进行激活。此方式需要高速互连;在 BLOOM 中,TP 的度数在每个节点上限制为 4(每个张量切片对应一块 GPU)。
流水线并行
模型层被划分为多个阶段;微批次在这些阶段之间流动,使所有 GPU 保持忙碌。“chunks”(或 GAS)超参数控制微批次数量,在流水线空泡与微批大小之间取得平衡。BLOOM 使用了 72 个流水线阶段(包括两个嵌入阶段),以在 GPU 之间平衡内存。
组合 DP + PP + TP(3‑D 并行)
最终的训练配置使用 DP 进行数据分配,TP 进行张量切分,PP 进行层分布,实现了对 384 GPU 集群的高效利用。
BF16 优化器
在 FP16 下训练导致早期实验出现发散(例如 104 B 模型)。BLOOM 切换到 BF16 混合精度,使用自定义的 BF16Optimizer,其:
- 保持 FP32 的指数范围,避免溢出。
- 所有累加均在 FP32 中进行。
- 在流水线微批次之间以 FP32 累积梯度。 该优化器使 176 B 模型的损失曲线保持稳定。
融合 CUDA 核
为最小化 GPU 空闲时间,使用了 Megatron‑LM 的自定义融合核,用于:
- LayerNorm
- 组合缩放、掩码和 softmax
- 加偏置的 GeLU(通过 PyTorch JIT) 这些核通过将中间结果保存在寄存器中,降低了内存流量。
数据集处理
训练数据流水线:
- 将 1.5 TB 清洗后的多语言文本标记化为 350 B 令牌。
- 为固定序列长度 2048 创建每个样本的索引。
- 按 epoch 打乱顺序,以确保均匀曝光。
- 将索引保存到磁盘,以避免重启时重新计算。
- 多个数据集以可配置权重进行混合。
架构微调
- 嵌入层 LayerNorm:在第一个嵌入后添加 LayerNorm 稳定了训练,灵感来源于 bitsandbytes 中的
StableEmbedding实现。 - ALiBi 位置编码:用线性偏置注意力(ALiBi)取代绝对位置嵌入,使得能够外推到比训练长度(2048)更长的序列。
工程挑战
- 硬件故障:每周 1–2 块 GPU 故障;每 3 小时保存一次检查点,将每次故障的损失工作限制在约 1.5 小时。
- 软件错误:需要
CUDA_LAUNCH_BLOCKING=1、优化器组拆分以及自定义 SLURM 终止开关以进行多用户作业控制。 - 停机时间:因死锁、磁盘空间耗尽等问题导致 5–10 小时中断;整体训练仍在计划的 3.5 个月窗口内完成。
- 值班协调:分布在欧洲和加拿大西海岸,实现了 24/7 监控,无需专用呼叫器。
结论
最密集的阶段是两个月的准备工作,包括 BF16 优化器的后期开发以及大规模并行的调试。一旦堆栈稳定,176 B 模型即可顺利训练,证明在提供足够计算资源和协作工具的情况下,开源团队能够训练最先进的多语言模型。
资源
- 训练文档:https://github.com/bigscience-workshop/bigscience/blob/master/train/tr11-176B-ml/README.md
- TensorBoard:https://huggingface.co/bigscience/tr11-176B-ml-logs/tensorboard
- SLURM 脚本:https://github.com/bigscience-workshop/bigscience/blob/master/train/tr11-176B-ml/tr11-176B-ml.slurm
- 编年史:https://github.com/bigscience-workshop/bigscience/blob/master/train/tr11-176B-ml/chronicles.md
关键论文
- Megatron‑LM:Efficient Large‑Scale Language Model Training on GPU Clusters(arXiv:2104.04473)
- DeepSpeed ZeRO:ZeRO: Memory Optimizations Toward Training Trillion Parameter Models(arXiv:1910.02054)
- ALiBi:Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation(arXiv:2108.12409)