在DigitalOcean 的多节点GPU裸金属服务器上训练大语言模型,性能表现如何?
DigitalOcean ( 以下简称:DO) 云平台的用户有时候会询问我们:DO的AI基础设施到底能不能扛得 […]

DigitalOcean ( 以下简称:DO) 云平台的用户有时候会询问我们:DO的AI基础设施到底能不能扛得住大规模训练的压力?毕竟自己亲自测试太费时费力了。为了给大家吃一颗定心丸,我们用开源框架LLM Foundry从头开始训练和微调了MosaicML的MPT大语言模型。本文将记录这一实践结果。
我们将在多节点的 H100 裸金属服务器集群上运行该实验,从 1 个节点扩展到 8 个节点。在所有配置中,基础设施随着节点的增加持续提供预期的性能改进,并高效利用 CPU、GPU、存储和互连网络资源 。你会发现DigitalOcean的基础设施已经完全准备好,能够轻松应对像大模型训练这种对计算资源要求很高的任务。也就是说,如果你打算做这类工作,不用再为调优基础设施操心,直接放心用就好。
实践梗概
本报告对在多节点环境中预训练和微调大型语言模型的端到端效率和性能进行了全面分析 。我们使用 DO 的 8 个节点裸金属基础设施 。MosaicML LLM Foundry 提供了一个框架,支持多节点预训练和微调,不仅包括模型微调,还包括通过评估验证模型推理功能和模型准确性,代表了一个真正的端到端系统 。
微调工具 :
- MosaicML LLM Foundry
任务 :
- 从头开始进行完整的预训练
- 预训练模型的微调
模型 :
- 预训练 ,MPT-125M, 350M, 760M, 1B, 3B, 7B, 13B, 30B, 70B
- 微调 ,MPT-7B-Dolly-SFT 、MPT-30B-Instruct
数据 :
- 预训练 ,C4
- 微调 ,Dolly HH-RLHF ,以及Instruct-v3
关键指标 :
- 吞吐量 (tok/s)
- 模型 FLOPS 利用率 (MFU)
- 运行时 (墙钟时间)
场景维度 :
- 预训练
- 模型大小:125M, 350M, 760M, 1B
- 微调
- 节点数量:1, 2, 4, 8
我们设计的实验旨在反映真实世界的使用情况,并通过在受控环境下运行本地托管的完全自动化测试来最大程度地减少方差 。有关硬件、软件、预训练和微调数据集以及网络速度测试的完整详细信息,请参阅文章后面的附录 。
结果与讨论
在本节中,我们检查了完整预训练和微调实验的结果 。我们发现模型预训练和微调均成功在 DO 多节点的裸金属服务器上运行,并且用户可以运行 。
完整预训练
我们的完整预训练运行结果如表 1 所示 。由于行数较少以及表中包含的各种相关结果,我们不将其绘制成图表 。
| Model | Training data | Max duration (batches) | Ratio params / 125M params | Ratio batches / 125M batches | Evaluation interval (batches) | No. nodes | Actual runtime (wallclock) | Actual runtime (s) | Ratio runtime / 125M runtime | Throughput (tokens/s) | Model FLOPS utilization (MFU) | Memory per GPU (from 82GB) | Checkpoint size | Conversion, inference & evaluation ok? | Evaluation accuracy |
| MPT-125M | C4 | 4800 | 1 | 1 | 1000 | 8 | 9m7.873s | 547.9 | 1 | 6,589,902 | ~0.1 | 13.4 | 1.5G | Y | 0.53 |
| MPT-350M | C4 | 13400 | 2.8 | 2.8 | 1000 | 8 | 38m10.823s | 2291 | 4.18 | 3,351,644 | ~0.145 | 8.91 | 4.0G | Y | 0.56 |
| MPT-760M | C4 | 29000 | 6.08 | 6 | 2000 | 8 | 103m23.136s | 6203 | 11.32 | 2,737,276 | ~0.27 | 12.5 | 8.6G | Y | 0.56 |
| MPT-1B | C4 | 24800 | 8 | 5.2 | 2000 | 8 | 208m24.319s | 12504 | 22.82 | 2,368,224 | ~0.33 | 16.3 | 15G | Y | 0.58 |
表 1:MosaicML 模型从 125M 到 1B 参数在 8 个节点上的完整预训练运行结果
完整预训练的主要观察结果:
- 在所有情况下,都验证了使用训练模型进行推理以及通过对未见测试数据进行评估而得出的模型准确性。
- 训练后模型转换为 Hugging Face 格式(可提供更轻量级的模型,推理效率更高)也已验证。
- MPT 系列中更大的模型,MPT-3B、-7B、-13B、-30B 和 -70B,将以完全相同的方式运行,但需要越来越多的墙钟时间。
- 运行时预测表明,最大模型 MPT-70B,可以在 DO 上以 8 个节点大约 2 个月或 64 个节点大约 1 周的时间内完成预训练。
- 模型 FLOPS 利用率 (MFU) 是衡量 GPU 使用情况比 LLM Foundry 提供的原始利用率更有效的指标,该指标表现良好,表明运行时增加是由于更大的模型需要更大的计算量,而不是基础设施效率低下。
微调
与预训练类似,我们在表 2 中列出了微调结果。
| Model | Finetuning data | Max training duration (epochs) | Evaluation Interval (epochs) | No. Nodes | Actual runtime (wallclock) | Actual runtime (s) | Speedup versus one node | Throughput (tokens/s) | Memory per GPU (from 82GB) | Inference & evaluation ok? | Evaluation accuracy |
| MPT-7B-Dolly-SFT | mosaicml/dolly_hhrlhf | 2 | 1 | 1 | 78m28.121s | 4708 | – | 7124 | 24.9 | Y | 0.85 |
| MPT-7B-Dolly-SFT | mosaicml/dolly_hhrlhf | 2 | 1 | 2 | 29m24.485s | 1764 | 2.67x | 13,844 | 19.9 | Y | 0.84 |
| MPT-7B-Dolly-SFT | mosaicml/dolly_hhrlhf | 2 | 1 | 4 | 18m21.026s | 1101 | 4.28x | 28,959 | 17.5 | Y | 0.84 |
| MPT-7B-Dolly-SFT | mosaicml/dolly_hhrlhf | 2 | 1 | 8 | 13m35.352s | 815 | 5.77x | 50,708 | 9.37 | Y | 0.84 |
| MPT-30B-Instruct | kowndinya23/instruct-v3 | 2 | 1 | 8 | 125m12.579s | 7513 | 3.76x | 52,022 | ~36 | Y | 0.85 |
表 2:MosaicML MPT-7B 和 MPT-30B 模型在 1-8 个节点上的完整微调运行结果
微调的主要观察结果:
- 相对于一个节点的理想加速比是 N 个节点的 N 倍。
- 我们观察到 2、4 和 8 个节点分别为 2.67 倍、4.28 倍和 5.77 倍。这表明 2-4 个节点获得了显著的增益,而 8 个节点的增益略小。每个 epoch 后保存模型检查点存在一些开销,但这是正常操作。
- 在所有情况下,都验证了使用训练模型进行推理以及通过对未见测试数据进行评估而得出的模型准确性。
- 模型在未见数据上的评估准确性高于预训练的小型模型,这符合预期。
附录
预训练和微调数据集
预训练数据集
对于大型语言模型,从头开始进行完整的预训练需要一个大型通用数据集来训练模型,以赋予其基本的语言能力。MosaicML 的 LLM Foundry 支持 C4 数据集,我们在整个预训练过程中都使用了该数据集。C4 是用于预训练大型语言模型的标准文本数据集,包含超过 100 亿行数据。它是 Common Crawl 网络语料库的清理版本。作为 LLM Foundry 对预训练的端到端支持的一部分,数据会被下载和预处理。
微调数据集
微调数据集比预训练数据集更专业、更小。我们再次使用了 MosaicML 支持的两个示例,并对 30B 模型进行了一些修改。
MPT-7B-Dolly-SFT
为了微调 7B 模型,我们使用了 Dolly HH-RHLF 数据集 。根据数据集卡片:“该数据集是 Databrick 的 dolly-15k 数据集和 Anthropic 的 HH-RLHF 过滤子集的组合。它还包括一个测试集,这在原始的 dolly 数据集中缺失。该测试集由 200 个随机选择的 dolly 样本 + 4,929 个通过过滤过程的 HH-RLHF 测试集样本组成。训练集包含 59,310 个样本;其中 15,014 – 200 = 14,814 个来自 Dolly,其余 44,496 个来自 HH-RLHF。”
MPT-30B-Instruct
为了微调 30B 模型,我们使用了 Instruct-v3 数据集,该数据集包含用于指令微调的提示和响应 。原始的 MosaicML 位置存在一个错误,其中数据集的列不正确,所以我们使用了 kowndinya23/instruct-v3 中的一个副本,其中已进行了相关更正 。这比手动更正更可取,因为默认情况下,端到端过程指向 Hugging Face 等远程数据集位置 。
网络速度:NCCL 测试
NCCL 测试在用于此项目的机器上运行,验证了网络的效率。我们的目的是简单的硬件验证,DO 基础设施团队已在其他地方进行了更广泛的测试。然而,这些结果对于对多节点工作感兴趣的客户而言,作为我们典型网络速度的可用表示,一直备受关注,因此我们在此提供。以下命令用于生成结果:
mpirun \
-H hostfile \
-np 128 \
-N 8 \
--allow-run-as-root \
-x NCCL_IB_PCI_RELAXED_ORDERING=1 \
-x NCCL_IB_CUDA_SUPPORT=1 \
-x NCCL_IB_HCA^=mlx5_1,mlx5_2,mlx5_7,mlx5_8 \
-x NCCL_CROSS_NIC=0 -x NCCL_IB_GID_INDEX=1 \
$(pwd)/nccl-tests/build/all_reduce_perf -b 8 -e 8G -f 2 -g 1
结果在下表中列出,针对 16 个节点的情况。
| Size (B) | Count (elements) | Type | Redop | Root | Out-of-place Time (us) | Out-of-place Algbw (GB/s) | Out-of-place Busbw (GB/s) | Out-of-place #Wrong | In-place Time (us) | In-place Algbw (GB/s) | In-place Busbw (GB/s) | In-place #Wrong |
| 8 | 2 | float | sum | -1 | 63.25 | 0 | 0 | 0 | 65.28 | 0 | 0 | 0 |
| 16 | 4 | float | sum | -1 | 63.1 | 0 | 0 | 0 | 62.37 | 0 | 0 | 0 |
| 32 | 8 | float | sum | -1 | 62.9 | 0 | 0 | 0 | 63.54 | 0 | 0 | 0 |
| 64 | 16 | float | sum | -1 | 63.23 | 0 | 0 | 0 | 63.4 | 0 | 0 | 0 |
| 128 | 32 | float | sum | -1 | 64.08 | 0 | 0 | 0 | 63.23 | 0 | 0 | 0 |
| 256 | 64 | float | sum | -1 | 63.81 | 0 | 0.01 | 0 | 63.33 | 0 | 0.01 | 0 |
| 512 | 128 | float | sum | -1 | 67.62 | 0.01 | 0.02 | 0 | 66.06 | 0.01 | 0.02 | 0 |
| 1024 | 256 | float | sum | -1 | 71.55 | 0.01 | 0.03 | 0 | 70.99 | 0.01 | 0.03 | 0 |
| 2048 | 512 | float | sum | -1 | 76.07 | 0.03 | 0.05 | 0 | 74.32 | 0.03 | 0.05 | 0 |
| 4096 | 1024 | float | sum | -1 | 75.73 | 0.05 | 0.11 | 0 | 76.28 | 0.05 | 0.11 | 0 |
| 8192 | 2048 | float | sum | -1 | 77.84 | 0.11 | 0.21 | 0 | 75.27 | 0.11 | 0.22 | 0 |
| 16384 | 4096 | float | sum | -1 | 78.7 | 0.21 | 0.41 | 0 | 75.98 | 0.22 | 0.43 | 0 |
| 32768 | 8192 | float | sum | -1 | 81.08 | 0.4 | 0.8 | 0 | 76.56 | 0.43 | 0.85 | 0 |
| 65536 | 16384 | float | sum | -1 | 80.14 | 0.82 | 1.62 | 0 | 77.5 | 0.85 | 1.68 | 0 |
| 131072 | 32768 | float | sum | -1 | 91.96 | 1.43 | 2.83 | 0 | 95.47 | 1.37 | 2.72 | 0 |
| 262144 | 65536 | float | sum | -1 | 108.5 | 2.42 | 4.79 | 0 | 106.5 | 2.46 | 4.88 | 0 |
| 524288 | 131072 | float | sum | -1 | 113.9 | 4.6 | 9.13 | 0 | 113.6 | 4.62 | 9.16 | 0 |
| 1048576 | 262144 | float | sum | -1 | 122.6 | 8.55 | 16.97 | 0 | 121.3 | 8.64 | 17.15 | 0 |
| 2097152 | 524288 | float | sum | -1 | 140.5 | 14.92 | 29.61 | 0 | 140.8 | 14.89 | 29.55 | 0 |
| 4194304 | 1048576 | float | sum | -1 | 179.8 | 23.33 | 46.29 | 0 | 178.8 | 23.45 | 46.54 | 0 |
| 8388608 | 2097152 | float | sum | -1 | 241.4 | 34.75 | 68.96 | 0 | 239.9 | 34.96 | 69.38 | 0 |
| 16777216 | 4194304 | float | sum | -1 | 343.9 | 48.78 | 96.8 | 0 | 343 | 48.92 | 97.07 | 0 |
| 33554432 | 8388608 | float | sum | -1 | 548.5 | 61.18 | 121.4 | 0 | 550.1 | 61 | 121.04 | 0 |
| 67108864 | 16777216 | float | sum | -1 | 943.5 | 71.13 | 141.15 | 0 | 940.8 | 71.33 | 141.55 | 0 |
| 134217728 | 33554432 | float | sum | -1 | 1490.7 | 90.04 | 178.67 | 0 | 1489.5 | 90.11 | 178.81 | 0 |
| 268435456 | 67108864 | float | sum | -1 | 2547.9 | 105.36 | 209.07 | 0 | 2549.8 | 105.28 | 208.91 | 0 |
| 536870912 | 134217728 | float | sum | -1 | 4241.8 | 126.57 | 251.16 | 0 | 4248.9 | 126.35 | 250.73 | 0 |
| 1073741824 | 268435456 | float | sum | -1 | 6753.1 | 159 | 315.52 | 0 | 6739.1 | 159.33 | 316.17 | 0 |
| 2147483648 | 536870912 | float | sum | -1 | 12466 | 172.26 | 341.83 | 0 | 12383 | 173.43 | 344.14 | 0 |
| 4294967296 | 1073741824 | float | sum | -1 | 23774 | 180.65 | 358.49 | 0 | 23871 | 179.93 | 357.04 | 0 |
表:本报告中使用的机器的 NCCL 测试结果,针对 16 个节点。这些结果验证了其网络具有适合我们模型预训练和微调的适当带宽。相同的结果在图中绘制,总线带宽是 1-8 个节点的函数。

图:本报告中使用的机器的 NCCL 总线带宽测试结果,针对 1-8 个节点
硬件和软件
DigitalOcean 裸金属服务器
DO 裸金属服务器由 8 个 H100x8 节点组成,这些节点通过一个具有公共 VPC 的 RDMA over Converged Ethernet (RoCE) 网络连接,并提供一个共享存储文件系统,提供数 TB 的存储空间。每个节点由 8 个通过 NVLink 连接的 H100 GPU 组成,总共有 64 个 GPU 。作为裸金属服务器,提供了 Ubuntu 操作系统,然后从 Docker 容器运行 MosaicML 。由于 MosaicML 使用共享驱动器而不需要 SLURM,因此 Docker 容器必须在每个节点上复制,但一旦完成,微调运行就可以在每个节点上使用单个命令执行。机器的共享性质导致本项目使用了 16 个节点中的 8 个。
MosaicML LLM Foundry
这是一个开源工具,允许在多节点环境中预训练和微调模型。此工具的突出优点包括 :
- 强调端到端使用,包括数据准备、模型训练/微调、推理和评估,就像真实的客户用例一样 。
- 基于命令行的界面,允许在此设置中实例化预训练和微调,而无需编写大量特定于特定应用程序的代码 。
- 共享磁盘多节点设置,避免了设置和使用 SLURM 的需要,这与大多数引入这种复杂额外开销(来自 HPC 世界)的多节点工具不同。
- 通过模型 FLOPS 利用率 (MFU) 指标证明了 GPU 计算的有效使用。
- MosaicML 提供的现有基准测试可以校准预期(例如 MFU),尽管是在不同的机器上,因此与我们的数字不具有 1:1 的可比性。
- 支持 MPT 系列中的真实世界大型语言模型。
- Weights & Biases 日志集成。
以上便是我们实践的结果,如果你对于 DigitalOcean 的 GPU 服务器有任何疑问,或希望了解更多测试细节,或是希望亲自测试一下 DigitalOcean的H100、H200、MI300X、L40s 等型号的 GPU 服务器,欢迎直接联系 DigitalOcean 中国区独家战略合作伙伴卓普云,预约申请测试。
