PyTorch与Meta:通过40多项优化实现超过90%的有效训练时间,MegaCache将PT2编译时间缩短40%
为什么重要
Meta发布了如何在2025年底为其推荐模型的离线训练实现超过90%的有效训练时间(ETT)。方法包括PyTorch生态系统中超过40项新优化、将PT2编译时间缩短40%的MegaCache、每个任务节省30分钟的独立模型发布,以及异步检查点。这些改进已通过PyTorch和TorchRec开源。
Meta的16名工程师团队与PyTorch项目贡献者于2026年4月17日发布了详细文章,介绍如何在2025年底实现推荐模型离线训练超过90%的有效训练时间(ETT)。这篇文章由Ruilin Chen、Yuzhen Huang、Hang Qi等作者共同撰写,包含40多项具体优化的列表。
ETT是什么以及为何重要
Meta引入了新指标——有效训练时间(ETT%)——衡量实际用于高效训练的总端到端wall time百分比。
公式很简单:
ETT% = 100% - 空闲% - 失败%
Meta将ETT分为三个子指标:
- 启动时间 — 从硬件分配到首批数据消耗
- 恢复时间 — 故障后重启和恢复需要多久
- 失败次数 — 基础设施相关中断总数
这之所以重要:经典指标模型FLOPs利用率(MFU)只衡量训练内部的效率,但忽略了训练前、中、后的所有事情。在扩展时,“中间”阶段成为主要成本。
MegaCache:编译时间减少40%
主要创新之一是MegaCache——PT2(PyTorch 2.0)组件的综合缓存系统:
- Inductor缓存
- Triton bundler
- AOT Autograd
- Dynamo PGO
- 自动调优设置
Meta将它们合并到一个统一缓存中,执行一次后可在后续任务中重复使用。
结果:平均PT2编译时间减少约40%。额外优势包括减少对远程服务器的请求、更快的模型设置,以及为重试任务提供更可靠的启动。
检查点管理
检查点对恢复至关重要,但通常会阻塞训练。Meta在三个方向上开展工作:
异步检查点:
- 创建检查点的CPU内存副本
- 主训练器继续运行,后台进程上传
- 减少GPU空闲时间
PyTorch原生暂存:
- 替换自定义C++暂存实现
- 使用新的PyTorch原生API
- 权衡:训练器内存增加,换取阻塞时间减少
间隔优化:
- 未保存训练时间 = (失败次数) × (检查点间隔) / 2
- 检查点保存阻塞时间 = (训练循环时间) / (检查点间隔) × (每次检查点阻塞时间)
- 最优间隔使总损失时间最小化
独立模型发布:减少30分钟
经典流程:训练结束,然后同一GPU继续进行模型发布(导出为生产格式、验证、上传)。
Meta将发布与训练分离:
- 训练创建锚点检查点
- 单独的基于CPU的独立任务并行发布模型
结果:每个任务节省约30分钟。对于每天运行数百个训练任务的公司,这意味着每月节省数百小时。
训练器初始化
通信优化:
- 消除不必要的进程组创建
- 不必要的元数据all_gather调用
- 取而代之,在分片计划广播后本地构建全局rank元数据
流水线优化:
- 并行化独立初始化阶段
- PT2编译与使用”快速批次”数据的DDP热身重叠
- 对具有长数据加载的基础模型特别有用
故障减少
Meta确定了两个主要故障原因:
- 任务抢占(并发任务越多=冲突越多)
- 服务回归
响应是双管齐下:与基础设施团队合作开发新调度算法+组件级可观察性仪表板,实时显示TTS、TTR、未保存训练时间和检查点保存时间。
开源贡献
PyTorch 2.0改进:
- 用于动态形状处理的
TORCH_COMPILE_DYNAMIC_SOURCES - MegaCache端到端缓存系统
- PyTorch原生暂存API
TorchRec改进:
- 分片计划优化(消除all_gather开销)
- 通信优化模式
所有内容均可在PyTorch文档中获取,供其他组织复制。
对行业的启示
Meta帖子中最深刻的教训是优化范式的转变:从”如何更快地训练每次迭代”转向”如何减少所有非真正训练的内容”。当社区专注于MFU和提高吞吐量时,Meta表明10%的ETT增益与10%的MFU增益同样有价值——而且通常通过工程手段更容易实现。
对于正在扩展AI训练的组织,ETT与MFU一样重要。
本文由人工智能基于一手来源生成。