欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > accelerate 笔记:梯度同步的时间效率

accelerate 笔记:梯度同步的时间效率

2025/10/15 18:00:22 来源:https://blog.csdn.net/qq_40206371/article/details/139471264  浏览:    关键词:accelerate 笔记:梯度同步的时间效率

1 介绍 

  • PyTorch 的分布式模块通过在系统中所有GPU之间进行来回通信来操作。
    • 这种通信需要时间,并且确保所有进程了解彼此的状态
    • 在使用ddp模块时会在特定的触发点发生
      • 这些触发点被添加到PyTorch模型中,特别是它们的 forward() 和 backward() 方法中
  • 当通过 optimizer.step() 更新模型参数时。如果不进行梯度累积,所有模型实例需要更新它们计算、汇总和更新的梯度,然后才能继续到下一批数据。
    • 这种无谓的进程间通信可能会导致显著的减速
  • 进行梯度累积时,会累积 n 个损失梯度并跳过 optimizer.step(),直到达到 n 批次
  • 如果不注意梯度同步和GPU通信,当这些GPU在不必要的时期相互通信时,可能会浪费大量时间

1.1直观感受一下速度的差异

先直观看一下不进行任何改进的话,每个batch都进行通信,会是什么样的速度:

考虑以下设置:

  • 两个单GPU节点、一个有两个GPU的节点
  • 每个GPU都是T4,并托管在GCP上
  • 每个GPU的批次大小为16,梯度每4步累积一次

比较的内容:

  • 基线:没有使用任何同步实践【同步实践后面会说】
  • no_sync使用不当:只在backward调用时使用no_sync,而不是在forward
  • 正确使用no_sync:正确使用no_sync模式
  • 使用accumulate:正确使用accumulate()

以下是每种设置在单节点和双节点设置上迭代29批数据的平均秒数:

2 解决方法1:no_sync

  • 通过 no_sync 上下文管理器
  • 在此上下文管理器下,PyTorch 将跳过在调用 .backward() 时同步梯度
  • 此上下文管理器外的第一次调用 .backward() 将触发同步

另一种写法是:

3 解决方法2:accumulate 梯度累计

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com