DDP、pytorch的分布式 torch.distributed.launch 训练说明

embedded/2024/10/18 8:27:48/

0、DDP的运行原理

执行步骤:

  1. 将data分为多个不同的batch,每个gpu得到batch都是不一样的
  2. 然后将每个batch放在每个gpu上独立的执行
  3. 最后得到的梯度求平均
  4. 将平均梯度平分给每个gpu
  5. 执行下一次迭代

这也就意味着你有多少个gpu,训练的速度也会提升多少倍

1个gpu和多个gpu输出相同的日志(step)?

例如给你一个下面的代码:

def run_loop(self):while (not self.lr_anneal_steps or self.step + self.resume_step < self.lr_anneal_steps):# 准备数据batch, cond = next(self.data)# 执行前后向传播self.run_step(batch, cond)# 更新日志 + save checkpointif self.step % self.log_interval == 0:logger.dumpkvs()if self.step % self.save_interval == 0:self.opt.consolidate_state_dict()self.save()# Run for a finite amount of time in integration tests.if os.environ.get("DIFFUSION_TRAINING_TEST", "") and self.step > 0:returnself.step += 1if self.step % 1000 == 0:logger.log("The current step is :", self.step)logger.log("The current time is :", datetime.datetime.now())

每个GPU上的进程都会独立地执行run_loop函数,那么N个gpu就会执行N个run_loop(),所以一次就会打印出N个"The current step is 1000",如果你使用1个gpu,它同样会打印1个"The current step is 1000",你此时如果不懂原理可能会认为是不是DDP没有起到加速作用,怎么多个gpu和1个gpu在相同时间内执行的都是相同的step呢?

虽然logger输出是一样的step,但是这并不意味着你的多个gpu执行的速度和1个gpu执行的速度是一样的,虽然4个gpu输出的是100个step,但是他比1个gpu执行的batch数多4倍,也就意味着训练速度提升了4倍

 

一、参数说明: 

我们在训练分布式时候,会使用到 torch.distributed.launch,可以通过命令,来打印该模块提供的可选参数 python -m torch.distributed.launch --help

usage: launch.py [-h] [--nnodes NNODES] [--node_rank NODE_RANK][--nproc_per_node NPROC_PER_NODE] [--master_addr MASTER_ADDR] [--master_port MASTER_PORT] [--use_env] [-m] [--no_python] [--logdir LOGDIR]training_script ...

 

torch.ditributed.launch参数解析(终端运行命令的参数):

  • nnodes:节点(主机)的数量,通常一个节点对应一个主机
  • node_rank:指的是当前启动的是第几台服务器,从 0 开始。
  • nproc_per_node:一个节点中显卡的数量
  • -master_addr:master节点的ip地址,也就是0号主机的IP地址,该参数是为了让 其他节点 知道0号节点的位,来将自己训练的参数传送过去处理
  • -master_port:master节点的port号,在不同的节点上master_addr和master_port的设置是一样的,用来进行通信


torch.ditributed.launch相关环境变量解析(代码中os.environ中的参数):

  • WORLD_SIZE:os.environ[“WORLD_SIZE”]所有进程的数量(可以简单记为gpu的总数)。如果你有2台服务器,每台服务器有4张卡,那么 World Size 就是 2 x 4 = 8。
  • LOCAL_RANK:os.environ[“LOCAL_RANK”]每张显卡在自己主机中的序号,从0开始。
  • RANK:os.environ[“RANK”]进程的序号,一般是1个gpu对应一个进程。标识一个进程的序号,从 0 开始。按照上面例子的配置,第一台机器上的 0, 1, 2, 3 卡对应的进程序号就是 0, 1, 2, 3,第二台机器上 0, 1, 2, 3 对应的进程序号就是 4, 5, 6, 7。需要确保每个进程的序号没有重复。其中 0 号进程为主进程,负责一些同步操作的通信。

二、启动方式说明:

使用 PyTorch 启动工具启动程序

PyTorch 提供了一个 torch.distributed.launch 帮助我们启动进程。

这个工具其实就是帮你计算 WORLD_SIZE = nproc_per_node * nnodes,然后执行一个循环,启动本机进程,利用这种方式,我们就只需要指定 --nproc_per_node 与 --nnodes 即可,就不需要指定WORLD_SIZE了。

单机多卡需要使用下面命令进行运行Python程序:

其中 python -m torch.distributed.launch --nproc_per_node=4 --nnodes=1 --node_rank=1 这一串中的参数不要少任何一个参数

python -m torch.distributed.launch --nproc_per_node=4 --nnodes=1 --node_rank=1  train.py  --args XXX

三、数据加载加速说明

dataloader提速的参数

num_workers: 加载数据的进程数量,默认只有1个,增加该数量能够提升数据的读入速度。(注意:该参数>1,在低版本的pytorch可能会触发python的内存溢出) pin_memory: 锁内存,加快数据在内存上的传递速度。 若数据加载成为训练速度的瓶颈,可以考虑将这两个参数加上。

data_loader_train = torch.utils.data.DataLoader(dataset=data_set, batch_size=32,num_workers=16,pin_memory=True)

PyTorch分布式训练基础--DDP使用 - 知乎

PyTorch 多卡分布式训练 – CodeTalks

pytorch记录】pytorch分布式 torch.distributed.launch 命令在做什么呢-CSDN博客


http://www.ppmy.cn/embedded/10109.html

相关文章

level2行情+在线金融数据库

jvQuant&#xff1a;一站式金融量化服务平台 jvQuant作为一个领先的金融量化服务平台&#xff0c;为广大投资者和量化分析师提供了全面、高效、稳定的数据接入和量化分析服务。该平台涵盖了多个关键功能&#xff0c;包括交易接入、WebSocket行情接入、历史行情查询、在线数据库…

E-MapReduce极客挑战赛季军方案

前一段时间我参加了E-MapReduce极客挑战赛&#xff0c;很幸运的获得了季军。在这把我的比赛攻略给大家分享一下&#xff0c;希望可以抛砖引玉。 赛题分析与理解 赛题背景&#xff1a; 大数据时代&#xff0c;上云已成为越来越多终端客户大数据方案的落地选择&#xff0c;阿里…

milvus 相似度检索的底层原理

Milvus作为一款专为向量相似度检索设计的开源搜索引擎&#xff0c;其底层原理涉及高效的向量索引结构、并行计算优化、分布式架构设计等多个关键技术点。以下是对Milvus进行相似度检索时底层原理的简要概述&#xff1a; ### 1. **向量索引结构** #### **近似最近邻搜索 (Appr…

LSB隐写是什么?

LSB隐写是什么&#xff1f; 所需知识二进制位LSB的概念LSB在数值中的作用LSB在量化中的应用小结 LSB隐写原理应用威胁与挑战改进补充资料 所需知识 二进制数 位&#xff08;bit&#xff09; LSB概念 二进制 在计算机科学中&#xff0c;二进制数是一种数制&#xff0c;使用两…

ESP32与SD卡交互实现:文件读写实战与初始化详解及引脚定义

本代码实现ESP32与SD卡的交互&#xff0c;包括定义SPI引脚、创建自定义SPI类实例、编写WriteFile与ReadFile函数进行文件读写。setup函数初始化串口、SPI、SD卡&#xff0c;向“/test.txt”写入“myfirstmessage”&#xff0c;读取并打印其内容。loop函数留空待扩展。 1. 需要…

MongoDB聚合运算符:$setIntersection

MongoDB聚合运算符&#xff1a;$setIntersection 文章目录 MongoDB聚合运算符&#xff1a;$setIntersection语法使用举例元素数组举例检索授予当前用户角色的文档创建角色创建用户创建集合使用John登录检索文档检查文档使用Jane登录检索文档验证文档 $setIntersection聚合运算符…

Oracle故障处理:ORA-00600错误处理思路

提前说明&#xff1a; 该故障&#xff0c;我只是旁观者。 但处理该故障的DBA工程师&#xff0c;思路很清晰&#xff0c;我非常受教&#xff01;在此也将经验分享。 目录 项目场景 问题分析 优化建议 项目场景 在某项目数据库运维群&#xff0c;有现场同事发了张报错截图如下…

【FineBI】强大处理、分析和可视化数据的工具

文章目录 前言功能丰富的数据处理深入的数据分析交互式的数据可视化协作与共享无缝的集成 总结 前言 在当今数据驱动的商业环境中&#xff0c;企业需要强大的工具来处理、分析和可视化数据&#xff0c;以便做出更明智的决策。FineBI就是这样一个工具&#xff0c;它是一个全面的…