Pytorch DDP分布式细节分享

自动微分和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.mzph.cn/bicheng/13890.shtml

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

相关文章

kubeadm部署k8s v1.28

一、主机准备 主机硬件配置说明 作用IP地址操作系统配置k8s-master01192.168.136.55openEuler-22.03-LTS-SP12颗CPU 4G内存 50G硬盘k8s-node01192.168.136.56openEuler-22.03-LTS-SP12颗CPU 4G内存 50G硬盘k8s-node02192.168.136.57openEuler-22.03-LTS-SP12颗CPU 4G内存 50G…

安全生产月答题pk小程序怎么做

在当今信息化时代,小程序已成为人们日常生活和工作中不可或缺的一部分。特别是在安全生产领域,通过小程序进行答题PK活动,不仅可以提高员工的安全意识,还能促进团队间的协作与交流。本文将详细介绍如何制作一款安全生产月答题PK小…

初识DataX3.0

目前接到任务,让同步表数据。市面很多同步工具不一一尝试了,信赖阿里,所以调研了一下阿里的dataX,一点点来吧,学习为主 环境准备:linux6.8 python自带的2.7 MySQL 5.7.1 1.先下载: wget http://datax-o…

油猴脚本使用cookie一般是某请求返回的setcookie,一般不是js生成的,直接请求拼接

写完hook脚本 删除页面cooike,打开开发者模式,刷新页面 cookie一般是某请求返回的setcookie,一般不是js生成的,直接请求拼接带cookie请求 看网络里的cookie httponly打钩的是服务器返回的,但不一定对,还是要看保存日…

MPLS VPN

不是公司的产品,是运营商对外提供的一种服务 没咋懂,oh my god

安防监控视频平台EasyNVR级联视频上云系统EasyNVS出现“Login error”报错的原因排查

EasyNVR安防视频云平台是旭帆科技TSINGSEE青犀旗下支持RTSP/Onvif协议接入的安防监控流媒体视频云平台。平台具备视频实时监控直播、云端录像、云存储、录像检索与回看、告警等视频能力,能对接入的视频流进行处理与多端分发,包括RTSP、RTMP、HTTP-FLV、W…

Milvus的执行引擎Knowhere

前言 本文将会介绍Knowhere这个概念,它是milvus向量执行引擎的核心。 概览 Knowhere是milvus向量咨询引擎的核心,它将好几个向量相似搜索库聚集在一起(包括faiss、hnswlib、annoy)。Knowhere也被设计支持异构计算。它控制在什么…

电商平台api接口:采购比价可用的比价工具推荐

电商平台api接口 目前,许多企业在进行内部采购时都有比价的需求。企业利用比价采购这一方式,能通过对比不同平台上、不同供应商的报价,进而选择最符合其需求和预算的产品或服务。 在比价采购的流程中,最重要的步骤就是企业在明确…

C#Csharp,SharpPcap网络抓包程序及源码(适合网络分析直接使用或源码二次开发)

目录 1.程序简介2.程序截图3.程序源码 1.程序简介 C#Csharp,SharpPcap网络抓包程序及源码(适合网络分析直接使用或源码二次开发) 2.程序截图 3.程序源码 https://download.csdn.net/download/xzzteach/89325817

沃创云外呼系统——能够企业带来什么样的帮助

沃创云外呼系统是一款功能强大的呼叫系统,能够助力企业提升营销效率,实现业绩增长。以下是沃创云外呼系统具体可以为企业带来的帮助 01节约成本 沃创云外呼系统能够自动拨打海量客户电话号码,降低企业成本,提高工作效率。使用沃创…

EI会议论文的格式和模板在哪里可以找到?

要找到EI会议论文的格式和模板,首先访问会议的官方网站,这是最直接的途径。会议网站通常在下载中心或投稿指南中提供详细的模板和格式要求。此外,你也可以查阅会议通知邮件、合作出版社平台、往届会议论文,或者直接联系会议组织者…

go语言中的一个特别的语法 //go:embed 可将将静态文件内容读取到string, []byte和 embed.FS 变量并直接打包到exe包中

go语言中的一个特别的语法 //go:embed 看上去像是注释,实则是golang中的一个内置的语法,而且是仅在你的go代码编译时生效的语法, 借助他我们可以将我们的静态资源文件读取到FS直接打包到我们的exe执行文件中。 同时他还支持文件的模式匹配…

计算机网络学习小结_数据链路层

数据链路和帧 帧:数据链路层传输基本单元。链路层将网络层传过来的数据构成帧发到链路上,并将发到链路层的帧取出数据交给网络层 数据报/分组/包:网络层传输基本单元 三个基本问题 即封装成帧、透明传输、差错检测 封装成帧 概念&#…

Docker Portainer使用

Portainer是什么 Docker Portainer是一个轻量级的 Web UI 管理界面,可以用来管理Docker环境。它提供了一个直观的控制台,用户可以通过它来管理Docker主机、容器、网络、卷等Docker资源。 Portainer的主要功能和特点包括: 容器管理:可以查看、启动、停止、删除容器,以及查看容器…

VSCODE调试C++(本人是openfoam求解器)时无法显示Vector,map等容器的值

一维数组&#xff1a; 可以在watch内添加表达式&#xff1a;*(type(*)[size])vectorName 例如&#xff1a;想查看vector<int> nums(6), 可以添加*(int(*)[6])nums。 上面是一维数组情况&#xff1a; ((double (*)[1000])&U[1000]) 表示从下标1000开始访问1000-200…

Qt 科目一考试系统(有源码)

项目源码和资源&#xff1a;科目一考试系统: qt实现科目一考试系统 一.项目概述 该项目是一个基于Qt框架开发的在线考试系统&#xff0c;主要实现了考试题目的随机抽取、考试时间限制、成绩统计等功能。用户可以通过界面操作进行考试&#xff0c;并查看自己的考试成绩。 二.技…

threejs的基本属性

1.创建场景,摄像机,渲染器,几何体,材质,网格 网格 物体材质 场景.add(网格),网格加入场景中 场景.add(坐标辅助器) 渲染 场景摄像机 相机的轨道控制器是个单独的对象 import ./style.css import * as THREE from three import { OrbitControls } from three/examples/j…

利用element实现简单右键

利用element-plus中的el-menu实现简单右键 实现如下 <template><main class"mainClass" contextmenu"showMenu($event)"> </main><el-menu:default-active"1"class"el-menu-demo"mode"vertical":col…

操作系统入门系列-MIT6.828(操作系统工程)学习笔记(一)---- 操作系统介绍与接口示例

MIT6.S081&#xff08;操作系统&#xff09;学习笔记 操作系统入门系列-MIT6.S081&#xff08;操作系统&#xff09;学习笔记&#xff08;一&#xff09;---- 操作系统介绍与接口示例 操作系统入门系列-MIT6.828&#xff08;操作系统工程&#xff09;学习笔记&#xff08;二&a…

8.11 矢量图层线要素单一符号使用三(插值线)

文章目录 前言插值线&#xff08;Interpolated Line&#xff09;QGis设置线符号为插值线&#xff08;Interpolated Line&#xff09;二次开发代码实现插值线&#xff08;Interpolated Line&#xff09; 总结 前言 本章介绍矢量图层线要素单一符号中插值线&#xff08;Interpol…