Pytorch DDP分布式细节分享

news2024/9/21 10:02:49

自动微分和autograde

自动微分

机器学习/深度学习关键部分之一:反向传播,通过计算微分更新参数值。
自动微分的精髓在于它发现了微分计算的本质:微分计算就是一系列有限的可微算子的组合。
自动微分以链式法则为基础,依据运算逻辑把公式整理出一张有向无环图(DAG)
自动微分将一个复杂的数学运算过程分解为一系列简单的基本运算, 其中每一项基本运算都可以通过查表得出来。
自动微分法被认为是对计算机程序进行非标准的解释。
在这里插入图片描述

Torch autograde

pytorch实现了torch.autograd的内置反向自动微分引擎,号称能支持任何计算图的梯度自动计算。
autograd 记录了一个计算图,记录每一个张量的操作历史。在创建张量时,如果设置 requires_grad 为Ture,那么 Pytorch 就知道需要对该张量进行自动求导。
autograde具体动作如下:

前向传播计算时

  • 运行请求的操作以计算结果张量
  • 建立一个计算梯度的DAG图,在DAG图中维护所有已执行操作(包括操作的梯度函数以及由此产生的新张量)的记录 。每个tensor梯度计算的具体方法存放于tensor节点的grad_fn属性中。

在 DAG 根上调用.backward() 来执行后向传播

  • 利用.grad_fn计算每个张量的梯度,并且依据此构建出包含梯度计算方法的反向传播计算图。
  • 将梯度累积在各自的张量.grad属性中,并且使用链式法则,一直传播到叶子张量。
  • 每次迭代都会重新创建计算图,这使得我们可以使用Python代码在每次迭代中更改计算图的形状和大小。

前向传播

策略:

  • DDP 获取输入并将其传递给本地模型。
  • 每个进程读去自己的训练数据,DistributedSampler确保每个进程读到的数据不同。
  • 使用 _rebuild_buckets 来重置桶(需要计算梯度的参数已经分桶)
  • 模型进行前向计算,结果设置为 out。

如果find_unused_parameters设置为True,DDP 会分析本地模型的输出,从 out 开始遍历计算图,把未使用参数标示为 ready,因为每次计算图都会改变,所以每次都要遍历。
此模式(Mode)允许在模型的子图上向后运行,并且 DDP 通过从模型输出out遍历 autograd 图,将所有未使用的参数标记为就绪,以减少反向传递中涉及的参数。

tips:遍历 autograd 图会引入额外的开销,因此应用程序仅在必要时才设置 find_unused_parameters为True

后向传播

策略:

  • Autograd 引擎进行梯度计算;当一个梯度准备好时,它在该梯度累加器上的相应 DDP hooks将自动触发
  • 在 autograd_hook 之中进行all-reduce。如果某个桶里面梯度都ready,则该桶是ready。
  • 当一个桶中的梯度都准备好时,会在该桶上Reducer启动异步all-reduce以计算所有进程的梯度平均值。(一边做反向计算,一边做梯度规约)
  • 所有桶都准备好时,Reducer将阻塞等待所有allreduce操作完成。完成此操作后,将平均梯度写入param.grad所有参数的字段。
  • 在向后传播完成之后,跨不同DDP进程的对应的相同参数上的 grad 字段应该是相等的。
  • 梯度被归并之后,会再传输回autograd引擎。

数据并行

假设显卡数量为N,将每张卡的梯度分为N个桶,每张卡的梯度总量是K。
每张卡Scatter Reduce阶段:接收 N-1 次数据
每张卡allgather 阶段:接收 N-1 次数据
每张卡传输数据总量:2K*(1-1/N) ~= 2K
[图片]

[图片]

                                                                                                 ...

[图片]

[图片]

数据并行细节总结:

  • DDP中的Allreduce使用的是ring-allreduce,并且使用bucket来引入异步
  • Allreduce发生在前向传播后的梯度同步阶段,并且与反向传播计算重叠
  • Ring-allreduce优化了带宽,适用于中规模的集群,但其可能存在精度问题,不适合大规模的集群?
  • allreduce的速度受到环中相邻GPU之间最慢连接的限制(木桶效应)

参考文档:

  1. pytorch ddp实现论文 2020-08-01

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1685147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

笔记-Apriori算法介绍(Python实现)

1.Apriori算法简介 Apriori算法是经典的挖掘频繁项集和关联规则的数据挖掘算法。A priori在拉丁语中指"来自以前"。当定义问题时,通常会使用先验知识或者假设,这被称作"一个先验"(a priori)。Apriori算法的名…

回溯算法05(leetcode491/46/47)

参考资料: https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html 491. 非递减子序列 题目描述: 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素…

基于python的k-means聚类分析算法,对文本、数据等进行聚类,有轮廓系数和手肘法检验

K-means算法是一种常见的聚类算法,用于将数据点分成不同的组(簇),使同一组内的数据点彼此相似,不同组之间的数据点相对较远。以下是K-means算法的基本工作原理和步骤: 工作原理: 初始化&#x…

Java面试八股之start()和run()的区别

start()和run()的区别 在Java中,run()方法和start()方法是与线程操作紧密相关的,两者之间存在本质的区别: start()是Thread类的一个实例方法,它的主要作用是启动一个新的线程。当调用线程对象的start()方法时,Java虚…

教师专属的成绩发布小程序

还在为成绩发布而烦恼?还在担心家长无法及时获得孩子的学习反馈?是否想要一个既安全又高效的工具来简化你的教学工作?那么,易查分小程序可能是你一直在寻找的答案。 现在的老师们有了超多的工具来帮助我们减轻负担,提高…

数据结构之二叉树的超详细讲解(2)--(堆的概念和结构的实现,堆排序和堆排序的应用)

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 数据结构之二叉树的超详细讲解(2)--(堆的概念和结构的实现,堆排序和堆排序的应用) 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记…

python从0开始学习(十二)

目录 前言 1、字符串的常用操作 2、字符串的格式化 2.1 格式化字符串的详细格式(针对format形式) ​编辑 总结 前言 上一篇文章我们讲解了两道关于组合数据类型的题目,本篇文章我们将学习新的章节,学习字符串及正则表达式。 …

Gradle和Maven项目解决Spring Boot Configuration Annotation Processor not configured警告

问题描述 写了一个配置类,加了注解@ConfigurationProperties(prefix = “xxx”) 后一直报警告:Spring Boot Configuration Annotation Processor not configured 意思是 Spring boot 未配置注解处理器 解决过程 出现这个问题后,百度查了解决方式 1.maven项目 maven项目是…

logback 配置

https://zhuanlan.zhihu.com/p/673142694 配置结构 root 在 Logback 配置文件中, 元素用于配置根 Logger,它是整个日志系统的根节点。根 Logger 拥有最高级别,通常用于设置全局的日志级别和全局的 Appender(附加器)。…

[Algorithm][动态规划][路径问题][不同路径][不同路径Ⅱ][珠宝的最高价值]详细讲解

目录 1.不同路径1.题目链接2.算法原理详解3.代码实现 2.不同路径 II1.题目链接2.算法原理详解3.代码实现 3.珠宝的最高价值1.题目链接2.算法原理详解3.代码实现 1.不同路径 1.题目链接 不同路径 2.算法原理详解 思路: 确定状态表示 -> dp[i][j]的含义 走到dp[…

Mac 安装 git

文章目录 前言一、介绍二、下载三、验证四、配置五、Git常用命令六、git提交和撤销工作流程代码提交和提交同步代码撤销和撤销同步 FAQ1.homebrew 下载解决方法一(强烈推荐):解决方法二: 总结 前言 Git 是一个开源的分布式版本控…

JavaScript 中的 Range 和 Selection 对象

JavaScript 中的 Range 和 Selection 对象 前言 最近在做鼠标框选的需求,鼠标框选就需要用到 Range 和 Selection 对象。 Range 表示选择的区间范围,Selection 表示选择的文档内容。 下面就详细说下这两个对象 一、Range Range 接口表示一个包含节…

太速科技-FMC125-两路125Msps AD,两路160Msps DA FMC子卡

FMC125-两路125Msps AD,两路160Msps DA FMC子卡 一、板卡概述 板卡可实现2路14bit 125Msps AD 和2路16bit 160MspsDA功能,FMC LPC连接器用于扩展到xilinx用于模拟信号、中频信号采集,信号发出等应用。 二、性能指标 板卡功能 参…

Vue3 Uncaught SyntaxError: Unexpected token <‘ 错误参考解决方法

1.最近在做一个登录首页的动画效果,动画组件是用的网上类似csdn方式,但是本地引入完全没问题,打包正式环境,直接报错,动画直接不起作用. 关于vue2的解决方法: 1.检查引用的 JavaScript 文件是否正确:确认所有引用的外部 JavaScript 文件路径是否正确,可…

陪玩系统源码,高质量的陪玩系统源码,游戏陪玩APP源码开发,语音陪玩源码搭建,整合需求精准定位

如今越来越多的人看到了游戏行业的市场,作为最近几年出现的一个新兴产业,需求是巨大的,因此开发陪玩app源码,正好可以优化服务体验来整合该市场。 原生陪玩源码or混合开发陪玩源码 游戏陪玩APP源码,基本上都是原生的&…

Docker安装MongoDB(Linux版)

文章目录 前言一、Docker环境的准备1.安装依赖2.安装Docker 二、使用Docker安装MongoDB1.mongo版本选取2.拉取合适的镜像3.宿主机创建MongoDB需要挂载的文件夹4.第一次无认证创建mongo用户5.启动需要认证的mongo容器 问题汇总总结 前言 本文章主要介绍在Centos系统&#xff0c…

ROS | 用IMU实现航向锁定

基本原理: 引入速度控制模块: /cmd_vel 设置目标角度,计算偏移差值 然后消息传递在z轴移动的角度 代码实现: C: CPP文件还需要编辑CMAKE文件 Python: Python文件需要给于权限:chmod x imu_node.py

【Muduo】三大核心之Poller、EPollPoller

Poller 在Muduo中,Poller负责基于IO多路复用机制进行IO事件监听和处理的组件,作为EPollPoller的基类,为后者提供了与PollPoller统一的IO复用接口,并且声明了一个关键的创建派生类的成员函数: static Poller *newDefa…

NDIS小端口驱动(五)

在需要的时候,我们也许需要NDIS微型端口程序信息,下面会从多个方面来讨论如何查询NDIS微型端口驱动。 查询无连接微型端口驱动程序 若要查询无连接微型端口驱动程序维护的 OID,绑定协议调用 NdisOidRequest 并传递 一个NDIS_OID_REQUEST 结…

OSPF多区域组网实验(华为)

思科设备参考:OSPF多区域组网实验(思科) 技术简介 OSPF多区域功能通过划分网络为多个逻辑区域来提高网络的可扩展性和管理性能。每个区域内部运行独立的SPF计算,而区域之间通过区域边界路由器进行路由信息交换。这种划分策略适用…