首页优化地图方法索引基础概念
返回技术汇总表 ↗

M026 · 独立详解

通信分桶、预取与计算重叠

让已经就绪的通信与不依赖该结果的计算并行,缩短关键路径上的等待。

通信与互联调度与并行详解已编写

先看短片 · 建立直觉

计算与通信重叠:把等待藏进独立计算里

1 分 51 秒
中文合成旁白 · 中文字幕查看讲解稿 ↗
按章节观看 · 5 个片段
↓ 文字详解 · 原理、算例与实现
本页目录

01 · 反向结束再归约,为何容易留下长尾

反向通常从最后一层向前推进。后层梯度已经就绪时,前层仍在计算;若等所有梯度都完成才启动归约,就把本可穿插的通信堆到反向末尾。系统会出现“设备仍在通信,但优化器还不能更新”的尾部等待。

除了梯度归约,完整分片训练还可以提前汇集下一层参数;流水线也可将已就绪激活发送与其他 microbatch 计算穿插。共同条件是存在可以独立推进的工作,不是所有通信都能任意提前。

依据:PyTorch · DDP 执行机制(main) ↗ · NeMo · Communication Overlap ↗

02 · 分桶与依赖如何配合

把多个梯度组织成 bucket。桶里所有所需梯度就绪后启动归约,计算流继续产生其他桶的梯度。参数更新必须等待所需归约完成;同一集合通信组的调用顺序在所有 rank 上保持一致,即使各 rank 的本地就绪时刻不同。

教学伪代码 · 展示依赖,不是可直接部署的实现
on_gradient_ready(parameter):
    bucket = bucket_of(parameter)
    mark_ready(bucket, parameter)
    if bucket_is_ready_in_collective_order(bucket):
        launch_async_reduce(bucket)

finish_remaining_backward()
wait_for_required_reductions()
optimizer_step()

大桶可以减少启动与小消息开销,但首个桶更晚就绪;小桶更早启动,却可能让延迟成本占比变大。DDP 的桶和 FSDP2 的模块通信组不是同一种配置接口。

依据:PyTorch · DDP 分桶接口 ↗ · PyTorch · FSDP2 fully_shard(main) ↗

03 · 三个桶的时间线

自设等时例子:三个计算块每块 2 ms,三个通信块每块 1 ms。全部算完再传,总共 6+3=9 ms。按块就绪发送:算1在0–2,传1在2–3且算2在2–4;传2在4–5且算3在4–6;传3在6–7。总共7 ms,尾部仍有1 ms。

计算—通信时间线 · 按就绪块重叠

理想双引擎、同块先算后传;未计启动、争用与切块导致的性能变化。

当每块通信改成 4 ms,通信流会排队:三个发送在2–6、6–10、10–14,总长14 ms。串行原本18 ms,重叠仍不能消除通信瓶颈。改变下面的时间,观察能隐藏多少等待。

04 · 如何从 profiler 找到可优化的等待

  • 确认通信开始前的输入是否已经就绪,判断等待来自数据依赖还是晚启动。
  • 沿最后完成的一条关键路径检查归约长尾,而不是只看通信区间的总和。
  • 分别实验桶大小、参数预取粒度和调度配置,一次只改一个变量。
  • 查看重叠后计算是否变慢、同时驻留缓冲是否增加,以及集合通信顺序是否一致。

设置 async_op 或多条 stream 只是提供异步执行机会。若紧接着 wait,或消费者立刻需要结果,或者底层资源冲突,实际仍可能串行。预取下一层参数必须在下一层使用之前完成。

依据:PyTorch · DDP 执行机制(main) ↗ · NeMo · Communication Overlap ↗

05 · 三类“融合”不要混在一起

方法主要改变
消息聚合 / 梯度分桶若干小消息合成较大通信,降低频繁启动。
跨算子计算通信重叠在运行时将独立计算与通信安排并行。
MC² 等通算融合在复合算子内部共同切块、编排并控制局部依赖。

不同方法可以共同出现。重叠通常不改变必须传输的语义数据量,而是尝试隐藏等待;算法或分片策略的改变才可能另外改变字节数。

06 · NVIDIA 与昇腾怎样对照

NVIDIA 可看 DDP / NeMo 的梯度归约、参数预取和 NCCL 执行时间线。昇腾侧检查框架调度、HCCL 与设备 profiler 的对应区间。相同算法在不同互联、消息大小和计算强度下,能隐藏的通信比例可能不同。

依据:NeMo · Communication Overlap ↗ · MindSpeed Core · 特性清单 ↗

07 · 自查与小实验

  • 在 profiler 里标注首个桶就绪、归约开始、最后计算结束和最后归约结束。
  • 分别使用较大 / 较小桶,记录总步耗时和通信长尾,而不是只记调用次数。
  • 说明某层需要上一层 AllGather 结果时,为什么不能把二者任意重叠。

流程位置与关联方法

这个方法可能出现在多个位置;计算线包含模型计算与算子实现,执行线包含运行时、内存和通信。

资料与核查范围

原理依据以原始论文和官方文档为主;算例与时间线是教学推导。文档核查日期:2026-10-10。引用 main / latest 文档时,实际接口以安装版本为准。

代码为接入片段或教学伪代码;本页没有声称完成 NVIDIA / 昇腾硬件实测。

← 返回总表中的 M026继续阅读:通算融合:MC² 等 →
AI Infra 知识库 · 总览 → 独立讲解网站更新 2026-10-08
搜索知识库

搜索方法与基础概念 · Esc 关闭