PyTorch 分布式训练和启动脚本torch.distributed.launch torchrun slurm

1、DataParallel

如果当前有4个GPU,batch_size=16,那么模型将被复制到每一个GPU上,在前向传播时,每一个gpu将分到4个batch,每个gpu独立计算依据分到的batch计算出结果的梯度,然后将梯度返回到第一个GPU上,第一个GPU再进行梯度融合、模型更新。在下一次前向传播的时候,将更新后的模型再复制给每一个GPU。

1、DP在每个训练批次(batch)中,因为模型的权重都是在 一个进程上先算出来 然后再把他们分发到每个GPU上,所以网络通信就成为了一个瓶颈,而GPU使用率也通常很低。

2、因为它在每一次的前向传播的时候把模型也复制了(即每次更新都复制一遍模型),并且单进程多线程会造成GIL contention(全局解释器锁争用) 这里进程计算权重使通信成为瓶颈造成了大量的时间浪费,因此引入了DDP。

2、DistributedDataParallel

DDP采用多进程控制多GPU,共同训练模型,一份代码会被pytorch自动分配到n个进程并在n个GPU上运行。 DDP运用Ring-Reduce通信算法在每个GPU间对梯度进行通讯,交换彼此的梯度,从而获得所有GPU的梯度。对比DP,不需要在进行模型本体的通信,因此可以加速训练。

参考https://zhuanlan.zhihu.com/p/489011749

在所有节点上运行命令来初始化上面创建的 DDP 作业:

torchrun --nnodes**=**2 --nproc_per_node**=**8 --rdzv_id**=**100 --rdzv_backend**=**c10d --rdzv_endpoint**=**$MASTER_ADDR:29400 elastic_ddp.py

这里torchrun将启动8个进程并调用elastic_ddp.py 其启动的节点上的每个进程,但用户还需要应用slurm等集群管理工具才能在2个节点上实际运行此命令。

srun --nodes=2 ./torchrun_script.sh

启动脚本

无论 DDP 应用程序如何启动,每个进程都需要一种机制来了解其rank等,使用torch提供的分布式脚本可以通过环境变量将世界大小、全局等级、主地址和主端口以及本地等级作为命令行参数传递给每个实例,初始化的时候选择环境变量初始化就很方便 (就不应该使用启动子进程torch.multiprocessing.spawn 了)。

torch.distributed.launch

python -m torch.distributed.launch --nproc_per_node 8 test.py

https://github.com/pytorch/pytorch/blob/main/torch/distributed/launch.py

import torchimport os
import timeprint("|| MASTER_ADDR:",os.environ["MASTER_ADDR"],"|| MASTER_PORT:",os.environ["MASTER_PORT"],"|| LOCAL_RANK:",os.environ["LOCAL_RANK"],"|| RANK:",os.environ["RANK"], "|| WORLD_SIZE:",os.environ["WORLD_SIZE"])

单机启动八个worker的运行结果

/home  $ python -m torch.distributed.launch   --nproc_per_node 8 test.py                                            2 ↵
*****************************************
Setting OMP_NUM_THREADS environment variable for each process to be 1 in default, to avoid your system being overloaded, please further tune the variable for optimal performance in your application as needed.
*****************************************
|| MASTER_ADDR: 127.0.0.1 || MASTER_PORT: 29500 || LOCAL_RANK: 0 || RANK: 0 || WORLD_SIZE: 8
|| MASTER_ADDR: 127.0.0.1 || MASTER_PORT: 29500 || LOCAL_RANK: 1 || RANK: 1 || WORLD_SIZE: 8
|| MASTER_ADDR: 127.0.0.1 || MASTER_PORT: 29500 || LOCAL_RANK: 5 || RANK: 5 || WORLD_SIZE: 8
|| MASTER_ADDR: 127.0.0.1 || MASTER_PORT: 29500 || LOCAL_RANK: 4 || RANK: 4 || WORLD_SIZE: 8
|| MASTER_ADDR: 127.0.0.1 || MASTER_PORT: 29500 || LOCAL_RANK: 3 || RANK: 3 || WORLD_SIZE: 8
|| MASTER_ADDR: 127.0.0.1 || MASTER_PORT: 29500 || LOCAL_RANK: 2 || RANK: 2 || WORLD_SIZE: 8
|| MASTER_ADDR: 127.0.0.1 || MASTER_PORT: 29500 || LOCAL_RANK: 6 || RANK: 6 || WORLD_SIZE: 8
|| MASTER_ADDR: 127.0.0.1 || MASTER_PORT: 29500 || LOCAL_RANK: 7 || RANK: 7 || WORLD_SIZE: 8

多机


/home# python -m torch.distributed.launch --nproc_per_node 8 --nnodes 2 --node_rank 0 --master_addr "替换成你的IP地址" --master_port 1234 test.py|| MASTER_ADDR: IP地址 || MASTER_PORT: 1234 || LOCAL_RANK: 3 || RANK: 3 || WORLD_SIZE: 16
|| MASTER_ADDR: IP地址 || MASTER_PORT: 1234 || LOCAL_RANK: 4 || RANK: 4 || WORLD_SIZE: 16
|| MASTER_ADDR: IP地址 || MASTER_PORT: 1234 || LOCAL_RANK: 5 || RANK: 5 || WORLD_SIZE: 16
|| MASTER_ADDR:|| MASTER_ADDR: IP地址  IP地址|| MASTER_PORT:  || MASTER_PORT:1234  1234|| LOCAL_RANK:  || LOCAL_RANK:1  7|| RANK:  || RANK:1  7|| WORLD_SIZE:  || WORLD_SIZE:16
16
|| MASTER_ADDR: IP地址 || MASTER_PORT: 1234 || LOCAL_RANK: 6 || RANK: 6 || WORLD_SIZE: 16
|| MASTER_ADDR: IP地址 || MASTER_PORT: 1234 || LOCAL_RANK: 2 || RANK: 2 || WORLD_SIZE: 16
|| MASTER_ADDR: IP地址 || MASTER_PORT: 1234 || LOCAL_RANK: 0 || RANK: 0 || WORLD_SIZE: 16第二个机器运行同样的命令(除了noderank❯ python -m torch.distributed.launch --nproc_per_node 8 --nnodes 2 --node_rank 1 --master_addr "IP地址" --master_port 1234 test.py*****************************************
|| MASTER_ADDR: IP地址 || MASTER_PORT: 1234 || LOCAL_RANK: 0 || RANK: 8 || WORLD_SIZE: 16
|| MASTER_ADDR: IP地址 || MASTER_PORT: 1234 || LOCAL_RANK: 1 || RANK: 9 || WORLD_SIZE: 16
|| MASTER_ADDR: IP地址 || MASTER_PORT: 1234 || LOCAL_RANK: 3 || RANK: 11 || WORLD_SIZE: 16
|| MASTER_ADDR: IP地址 || MASTER_PORT: 1234 || LOCAL_RANK: 4 || RANK: 12 || WORLD_SIZE: 16
|| MASTER_ADDR: IP地址 || MASTER_PORT: 1234 || LOCAL_RANK: 2 || RANK: 10 || WORLD_SIZE: 16
|| MASTER_ADDR: IP地址 || MASTER_PORT: 1234 || LOCAL_RANK: 5 || RANK: 13 || WORLD_SIZE: 16
|| MASTER_ADDR: IP地址 || MASTER_PORT: 1234 || LOCAL_RANK: 6 || RANK: 14 || WORLD_SIZE: 16
|| MASTER_ADDR: IP地址 || MASTER_PORT: 1234 || LOCAL_RANK: 7 || RANK: 15 || WORLD_SIZE: 16

torchrun

torchrun 提供了 torch.distributed.launch 功能的超集,并具有一些附加功能:

从 torch.distributed.launch 过渡到 torchrun

https://pytorch.org/docs/stable/elastic/run.html

代码中需要改成从环境变量中读取

slurm多机启动

上面的torch.distributed.launch或者torchrun启动如果多机的话要手动在多个机器执行,使用slurm提交一个命令脚本slurm会分发到多个node来执行。

srun --nodes=2 ./torchrun_script.sh

https://github.com/pytorch/tutorials/blob/main/intermediate_source/ddp_tutorial.rst

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

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

相关文章

以CS32F031为例浅说国产32位MCU的内核处理器

芯片内核又称CPU内核,它是CPU中间的核心芯片,是CPU最重要的组成部分。由单晶硅制成,CPU所有的计算、接受/存储命令、处理数据都由核心执行。各种CPU核心都具有固定的逻辑结构,一级缓存、二级缓存、执行单元、指令级单元和总线接口…

django bootstrap html实现左右布局,带折叠按钮,左侧可折叠隐藏

一、实现的效果 在django项目中,需要使用bootstrap 实现一个左右分布的布局,左侧区域可以折叠隐藏起来,使得右侧的显示区域变大。(为了区分区域,左右加了配色,不好看的修改颜色即可) 点击折叠按钮,左侧区域隐藏,右侧区域铺满: 二、实现思路 1、使用col-md属性,让左…

改进的智能优化算法定性分析:收敛行为分析(Analysis of the convergence behavior )

目录 一、智能优化算法改进收敛行为分析运行结果 二、收敛性分析 三、GWO1在F1收敛性运行结果 四、改进灰狼算法GWO1 五、代码获取 一、智能优化算法改进收敛行为分析运行结果 本文以改进的灰狼算法 GWO1 为例,在 CEC2005 测试函数上进行定性分析实验。 F1:…

【微信小程序】导出 Excel 报表并分享,使用xlsx库生成 Excel,使用echars插入图表、使用pdfmake导出为PDF文件

这里写目录标题 生成EXCEL插入汇总和图表导出为PDF 生成EXCEL 要在微信小程序中导出 Excel 报表并分享,可以使用第三方库 xlsx 来生成 Excel 文件,并使用 wx.saveFile 方法将文件保存到本地,然后使用 wx.shareFile 方法来分享文件。 以下是…

【前端知识】React 基础巩固(三十六)——RTK中的异步操作

React 基础巩固(三十六)——RTK中的异步操作 一、RTK中使用异步操作 引入RTK中的createAsyncThunk,在extraReducers中监听执行状态 import { createSlice, createAsyncThunk } from "reduxjs/toolkit"; import axios from "axios";export cons…

代理模式——对象的间接访问

1、简介 1.1、概述 由于某些原因,客户端不想或不能直接访问某个对象,此时可以通过一个被称为“代理”的第三者来实现间接访问,该方案对应的设计模式被称为代理模式。 代理模式是一种应用很广泛的结构型设计模式,而且变化很多。…

微信小程序如何调用微信支付接口?

开发前准备 小程序appid,商户id,商户密钥(key),付款用户的(openid) 调用微信支付接口 (流程:首先调用微信统一下单接口,之后在调用wx.requestPayment(OBJECT)发起微信支付) 获取openid wx.login({succ…

Rust之错误处理

在Rust中,将错误分为两种,可恢复错误和不可恢复错误。所谓可恢复错误就是指类似于文件未找到这类错误,一般需要将它们报告给用户并再次尝试进行操作,而不可恢复错误往往就是Bug,需要停止程序的运行。 1、不可恢复错误…

Elasticsearch 全文检索 分词检索-Elasticsearch文章四

文章目录 官方文档地址refercence文档全文搜索体系match简单查询match 多词/分词单字段分词match多个词的逻辑控制match的匹配精度match_pharse_prefix分词前缀方式match_bool_prefixmulti_match多字段匹配 query string类型Interval类型DSL查询之Term详解聚合查询之Bucket聚合…

Git reset、revert用法

reset reset是删除之前的提交记录&#xff0c;所有的提交点都会被清除&#xff0c;我们看下执行前后的git log区别 D:\workspace\android>git log commit 87c1277a57544c53c603b04110e3dde100da8f57 (HEAD -> develop_main) Author: test <test.com> Date: Wed…

图论-简明导读

计算机图论是计算机科学中的一个重要分支&#xff0c;它主要研究图的性质和结构&#xff0c;以及如何在计算机上有效地存储、处理和操作这些图。本文将总结计算机图论的核心知识点。 一、基本概念 计算机图论中的基本概念包括图、节点、边等。图是由节点和边构成的数据结构&am…

maven中的properties标签

在maven构建项目的时候经常遇到如下所示的标签配置&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId> <version>4.2.6</version></dependency><dependency><gr…

P3373 【模板】线段树 2

题目 思路 作为线段树模板题&#xff0c;这题主要考查了对lazytag以及先乘后加的使用&#xff0c; 线段树详解 因为是模板&#xff0c;所以这里证明略 代码 #include<bits/stdc.h> using namespace std; #define int long long const int maxn1e55; int n,m,p; int a[…

汽车后视镜反射率测定仪

汽车后视镜位于汽车头部的左右两侧&#xff0c;顶部以及汽车内部的前方。汽车后视镜反映汽车正后方视野、两侧视野和汽车前端区域视野&#xff0c;以便驾驶员可以间接看清楚这些位置的情况&#xff0c;它起着“第二只眼睛”的作用&#xff0c;扩大了驾驶者的视野范围&#xff0…

华为数通HCIA-ARP(地址解析协议)详细解析

地址解析协议 (ARP) ARP &#xff08;Address Resolution Protocol&#xff09;地址解析协议&#xff1a; 根据已知的IP地址解析获得其对应的MAC地址。 ARP&#xff08;Address Resolution Protocol&#xff0c;地址解析协议&#xff09;是根据IP地址获取数据链路层地址的一个…

【Ubuntu 18.04 搭建 DHCP 服务】

参考Ubuntu官方文档&#xff1a;https://ubuntu.com/server/docs/how-to-install-and-configure-isc-dhcp-server dhcpd.conf 手册页 配置&#xff1a;https://maas.io/docs/about-dhcp 实验环境规划 Ubuntu 18.04&#xff08;172.16.65.128/24&#xff09;dhcp服务端Ubuntu…

微信小程序使用editor富文本编辑器 以及回显 全屏弹窗的模式

<!--富文本接收的位置--><view class"white-box"><view class"title"><view class"yellow-fence"></view><view class"v1">教研记录</view></view><view class"add-btn"…

从零开始学python(十二)如何成为一名优秀的爬虫工程师

前言 回顾之前讲述了python语法编程 必修入门基础和网络编程&#xff0c;多线程/多进程/协程等方面的内容&#xff0c;后续讲到了数据库编程篇MySQL&#xff0c;Redis&#xff0c;MongoDB篇&#xff0c;和机器学习&#xff0c;全栈开发&#xff0c;数据分析前面没看的也不用往…

SonarQube入门 - 搭建本地环境

一、SonarQube是什么&#xff1f; SonarQube是一种自我管理的自动代码审查工具&#xff0c;可以系统地帮助您交付干净的代码。作为我们Sonar 解决方案的核心元素 &#xff0c;SonarQube 集成到您现有的工作流程中并检测代码中的问题&#xff0c;以帮助您对项目执行持续的代码检…

Meta-Transformer 多模态学习的统一框架

Meta-Transformer是一个用于多模态学习的新框架&#xff0c;用来处理和关联来自多种模态的信息&#xff0c;如自然语言、图像、点云、音频、视频、时间序列和表格数据&#xff0c;虽然各种数据之间存在固有的差距&#xff0c;但是Meta-Transformer利用冻结编码器从共享标记空间…