news 2026/9/14 1:20:53

Megatron-LM 在 256 节点以上训练时如何优化数据加载避免 barrier 等待?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Megatron-LM 在 256 节点以上训练时如何优化数据加载避免 barrier 等待?

Megatron-LM 在 256 节点以上训练时如何优化数据加载避免 barrier 等待?

【免费下载链接】Megatron-LMOngoing research training transformer models at scale项目地址: https://gitcode.com/GitHub_Trending/me/Megatron-LM

在 256 节点及以上规模的 Megatron-LM 分布式训练中,数据加载的主要瓶颈不是原始数据带宽,而是**索引构建(index building)**和barrier 同步。官方指南 Data Loading at Scale 指出:Megatron 初始化时由 Rank 0 构建 document index、sample index 和 shuffle index 三个索引数组并以.npy文件写入缓存目录,所有其他 rank 在torch.distributed.barrier()上等待,然后才通过内存映射(numpy.load(mmap_mode='r'))读取缓存索引。在一个 512 节点任务中,Rank 0 构建索引期间意味着 4,095 块 GPU 处于空转状态。本文基于该文档,给出一条可执行的优化路径:合并数据文件、离线预构建缓存、启用 fast-path 加载参数,最后用文档给出的排查方法验证效果。

先建立性能基线:用 --mock-data 定位瓶颈

在调优数据加载之前,文档建议先用--mock-data跑一次,完全绕过数据管道,得到你当前配置在没有 dataloader 开销下的最大吞吐。--mock-data性能与真实数据性能之间的差距,就是 dataloader 造成的成本。这个基线也是后续排查"训练中持续慢"与"仅启动慢"的判断依据。

第一步:合并小文件数据集

大规模场景下的常见问题是数据集被拆成大量小文件前缀:几千个 100 MB 的文件在构建缓存和运行期文件访问上都显著差于几十个 10 GB 以上的文件。仓库中的合并工具 tools/merge_datasets.py 可以把一个目录里的多个小前缀合并成大文件:

python tools/merge_datasets.py \ --input /path/to/input-directory \ --output-prefix /path/to/output/merged

其中--input是存放所有待合并文档文件的目录(必须是已存在的目录),--output-prefix是输出二进制文件的前缀路径(不含后缀),其所在目录必须已存在。文档给出的目标是每个文件至少 10 GB,这样能减少初始化时的文件描述符数量、元数据查找和索引构建工作量。

第二步:离线预构建数据集缓存

把 GPT 数据集缓存的构建从训练中剥离,是大型任务推荐的工作流。仓库工具 tools/prepare_cache.py 作为独立步骤在训练前运行:

python tools/prepare_cache.py \ --data-path <your-data-config> \ --split 99,1,0 \ --data-cache-path /path/to/cache \ --global-batch-size <global-batch-size> \ --seq-length <seq-length> \ ...

尖括号占位符需要你按自己的数据替换:--data-path指向你的数据配置,--data-cache-path指定索引.npy文件的缓存目录(多节点任务必须放在所有 rank 可读的共享存储上),--global-batch-size--seq-length需与后续训练一致。

两种情况需要额外加一个参数:

  • 后续训练任务没有设置--global-batch-size
  • 构建缓存的机器与未来训练拓扑不匹配。

此时传入--prepare-cache-world-size <future-world-size>,使预构建缓存的样本数与训练预期保持一致(该参数用于推导>python tools/build_sequences_per_dataset.py \ --data-path <your-data-config> \ --per-dataset-sequences-path sequences.json

这个 JSON 记录每个数据集路径对应的(sequence_count, document_count)。单数据集训练可以跳过此步。

第四步:启动训练时启用 fast-path 参数

缓存就绪后,在训练启动命令中打开这些参数(文档以 512 节点任务为例展示):

torchrun --nproc_per_node=8 --nnodes=512 ... pretrain_gpt.py \ --dataloader-fast-cache-load \ --dataloader-defer-npy-index-mmap \ --per-dataset-sequences-path sequences.json \ --data-cache-path /path/to/cache \ --num-workers 2 \ ...

各参数的作用与建议(默认值均取自文档的 Flag reference):

Flag默认建议作用
--dataloader-fast-cache-loadoff开启假设缓存已存在,跳过 Rank 0 barrier,所有 rank 并行构建自己的 dataset 视图。文档称这是规模场景下最大的单项收益,也是直接消除 barrier 等待的开关
--dataloader-defer-npy-index-mmapoff开启.npy索引文件的内存映射推迟到首次访问;配合--num-workers > 0后,索引加载与训练迭代重叠,不再阻塞启动
--per-dataset-sequences-pathNone混合多数据集时设置指向第三步生成的 JSON,用单次查询替代逐文件元数据读取
--data-cache-pathNone设置索引.npy缓存目录,多节点任务必须在共享存储上
--num-workers2按需保持最小值DataLoader worker 进程数,目标是"处理一个 batch 的时间 > 准备一个 batch 的时间",超过需要的值会浪费 CPU 和内存
--no-mmap-bin-filesmmap 开启两种方式都测mmap.bin文件会利用 OS 页缓存,但最优设置取决于文件系统;文档明确没有统一答案,需要你在自己的存储上实测

如果数据在 S3 或 Multi-Storage Client(MSC)而非 POSIX 文件系统上,改用对象存储路径:索引文件(.idx)缓存在本地object_storage_cache_path下,二进制.bin文件按需以 256 MB 块流式读取,并设置--no-mmap-bin-files(内存映射对对象存储不适用)。同时确保索引缓存路径在后续 dataset 构建运行位置可见。

验证效果与排查

文档给出的三个现象与对应判断方法,可作为优化前后的核对清单:

训练启动时挂起数分钟

  • 现象成因:Rank 0 正在构建索引,其他 rank 全部等待 barrier。
  • 对应处理:用tools/prepare_cache.py预构建缓存,并开启--dataloader-fast-cache-load

训练启动瞬间 I/O 尖峰,随后恢复正常

  • 现象成因:所有 rank 在 barrier 后同时内存映射索引文件,造成页错误和 I/O 突发。
  • 对应处理:开启--dataloader-defer-npy-index-mmap,让索引加载与训练重叠。

训练期间(而非仅启动阶段)数据加载慢

  • 先用--mock-data确认瓶颈确实在 dataloader;
  • 如果主要是启动阶段而非稳态吞吐问题,尝试--dataloader-defer-npy-index-mmap
  • 如果混合了大量数据集前缀,尝试--per-dataset-sequences-path
  • 测试--no-mmap-bin-files,文档强调最优值取决于你的文件系统。

从扩展性角度,文档说明这些优化后索引文件全部只读、依赖 OS 页缓存且无锁;索引通过共享文件系统分发而非torch.distributed.broadcast;各 contenteditable="false">【免费下载链接】Megatron-LMOngoing research training transformer models at scale项目地址: https://gitcode.com/GitHub_Trending/me/Megatron-LM

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/14 1:20:48

50元DIY完整指南:ESPHome + ESP8266 零代码漏水检测与远程告警

50元DIY完整指南&#xff1a;ESPHome ESP8266 零代码漏水检测与远程告警 【免费下载链接】esphome ESPHome is a system to control your ESP32, ESP8266, BK72xx, RP2040 by simple yet powerful configuration files and control them remotely through Home Automation sys…

作者头像 李华
网站建设 2026/9/14 1:18:47

Python爬虫环境搭建与依赖管理实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/14 1:16:51

MOSFET 栅极原理拆解:为什么“推一下门闩“就能控制大电流?

MOSFET 栅极原理拆解&#xff1a;为什么"推一下门闩"就能控制大电流&#xff1f; 这篇内容适合第一次接触单片机、想看懂一个硬件动作的零基础读者。看完后&#xff0c;你能沿真实接线和信号顺序复述工作原理&#xff0c;并用文中的仪器步骤完成验证。 先说结论 这篇…

作者头像 李华
网站建设 2026/9/14 0:56:15

鼎阳SDS7404A H10示波器:10-bit高分辨率与4GHz带宽的工程实践指南

1. 项目概述&#xff1a;这台示波器不是“测电压的盒子”&#xff0c;而是信号世界的显微镜与时间标尺 鼎阳 SDS7404A H10 数字示波器&#xff0c;光看型号就藏着三重关键信息&#xff1a;SDS 是鼎阳科技&#xff08;Siglent&#xff09;的示波器产品线代号&#xff0c;7404A 表…

作者头像 李华
网站建设 2026/9/14 0:43:53

PCL点云坡度计算:基于法向量的逐点地形倾斜角估计

简介&#xff1a;本资源是一份面向三维点云处理初学者与GIS/计算机视觉从业者的实用代码包&#xff0c;聚焦地形分析中关键的坡度计算任务&#xff0c;解决点云数据中单点坡度量化与可视化难题。压缩包为1KB的RAR格式&#xff0c;内含1个核心C源文件&#xff08;slopeNoraml.cp…

作者头像 李华
网站建设 2026/9/14 0:41:17

天津壁挂炉水泵卡死导致暖气不循环,欧米到家师傅上门拆检并制定维修方案

文章简介天津壁挂炉出现不点火、不供暖、水压下降、热水忽冷忽热、漏水、异响或故障代码时&#xff0c;应结合燃气供应、采暖水路、点火系统和控制系统综合判断。欧米到家为天津用户提供壁挂炉检测、维修、清洗保养、配件更换及使用调试等服务。天津用户可通过电话或官网预约壁…

作者头像 李华