YOLOX源码之 wait_for_the_master

主进程读取数据

在函数 get_data_loader 中,下面这段代码的作用是在多节点分布式训练时,每个节点的主进程负责读取数据。

if self.dataset is None:with wait_for_the_master():assert cache_img is None, \"cache_img must be None if you didn't create self.dataset before launch"self.dataset = self.get_dataset(cache=False, cache_type=cache_img)

在 PyTorch 的分布式训练中,每个节点的主进程负责数据加载、模型初始化和一些其他的准备工作。这意味着在每个节点的主进程中,都会有一份数据加载的代码。

这样做的好处是:

  1. 减轻主节点压力:每个节点的主进程可以独立地负责数据加载,减轻了主节点的负担,有助于更好地利用各个节点的资源。
  2. 数据分发效率高:在每个节点加载数据的情况下,数据可以直接在本地节点内分发给其他进程,避免了网络传输的开销,提高了数据加载的效率。 

接下来我们看下函数 wait_for_the_master 的实现

from contextlib import contextmanager@contextmanager
def wait_for_the_master(local_rank: int = None):"""Make all processes waiting for the master to do some task.Args:local_rank (int): the rank of the current process. Default to None.If None, it will use the rank of the current process."""if local_rank is None:local_rank = get_local_rank()if local_rank > 0:dist.barrier() yieldif local_rank == 0:if not dist.is_available():returnif not dist.is_initialized():returnelse:dist.barrier()

@contextmanager

@contextmanager是一个装饰器,用于定义上下文管理器(context manager)。上下文管理器可以用于创建一个资源的上下文,然后在进入和退出这个上下文时执行特定的操作,比如资源的获取和释放。 

在python中要自定义一个上下文管理器,需要定义一个类,并实现其__enter__()和__exit()__方法。但使用装饰器@contextmanager可以更简洁的实现这点,具体来说,@contextmanager 装饰器可以将一个生成器函数转换成一个上下文管理器。生成器函数中的 yield 语句之前的代码会在进入上下文时执行,而 yield 语句之后的代码会在退出上下文时执行。

dist.barrier()

这里首先获取每个节点的local_rank,大于0说明不是主进程,dist.barrier() 是 PyTorch 中分布式通信库 torch.distributed 提供的一个同步操作,它的作用是在分布式环境中同步所有参与通信的进程,确保它们在某一点上同时到达了同步点。

在分布式训练中,dist.barrier()的作用通常是用来同步各个进程的执行,以保证它们在某个重要的时刻处于同步状态。当一个进程调用了dist.barrier()后,它会被阻塞,直到所有参与通信的进程也都调用了dist.barrier(),此时所有进程才会解除阻塞,继续执行后续的代码。

具体来说,dist.barrier() 的作用有以下几点:

  1. 同步数据加载:在数据加载完毕之后,可以使用 dist.barrier() 来确保所有进程都已经加载完数据,然后再开始训练。
  2. 同步模型初始化:在模型初始化完成之后,可以使用 dist.barrier() 来确保所有进程都已经初始化完成,然后再开始训练。
  3. 同步参数更新:在每个训练步骤中,可以使用 dist.barrier() 来确保所有进程都已经计算完梯度,并更新了参数,然后再进行下一步的计算。
  4. 同步模型评估:在模型评估阶段,可以使用 dist.barrier() 来确保所有进程都已经完成了评估任务,然后再进行汇总或其他后续操作。

结合上面两段代码来看,在进入上下文后,每个节点的非主进程会阻塞在yield前的dist.barrier()处,而主进程则会执行self.get_dataset()读取数据,在每个节点的主进程都执行完self.get_dataset()后,会退出上下文,此时非主进程还是停留在yield前的dist.barrier()处,而主进程则会执行yield后的dist.barrier(),当所有进程都调用了dist.barrier()后,所有进程的阻塞被解除,继续执行后续的代码。

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

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

相关文章

Python | A + B问题|||

if语句:if、elif、else 关系运算符 逻辑运算符:and(&&)、or(||)、not(!) break退出循环 continue:只能出现在for、while循环内部,用法…

图解大模型分布式并行各种通信原语

背景 在分布式集群上执行大模型任务时候,往往使用到数据并行,流水线并行,张量并行等技术,这些技术本质上也就是对数据进行各种方案的切分,然后放到不同的节点上运算。不同节点在计算的过程中需要对数据分发或者同步等…

【精读文献】J. Environ. Manage.|青藏高原生态恢复项目下植被覆盖动态及其对生态系统服务的约束效应

目录 文章简介 01 文章摘要 02 研究背景、目标及创新点 2.1 研究背景 2.2 研究现状 03 研究区域与数据集 3.1 研究区域 3.2 研究数据 04 研究方法 4.1 趋势分析 4.2 残差趋势分析 4.3 偏相关 4.4 生态系统服务评价 4.5 约束线的定义和提取 05 研究结果 5.1 植被…

秒杀基本功能开发(不考虑高并发情况)

文章目录 1.显示秒杀状态1.controller修改GoodsController.java的toDetail方法,响应秒杀状态和秒杀剩余时间 2.前端1.goodsDetail.html 图片下面添加一行秒杀开始时间2.goodsDetail.html 添加计时器js代码 3.测试1.秒杀进行中2.修改db的秒杀开始时间为明天3.出现秒杀…

<Rust><iced>基于rust使用iced库构建GUI实例:动态改变主题色

前言 本专栏是Rust实例应用。 环境配置 平台:windows 软件:vscode 语言:rust 库:iced、iced_aw 概述 本篇构建了这样的一个实例,可以动态修改UI的主题,通过菜单栏来选择预设的自定义主题和官方主题&#…

python列表的扩展操作

列表的扩展操作 zip() 函数 我们先学习 zip() 函数,将排名与分数挂钩。 还记得期中考试的顺序排名和分数吗?我们把排名放在了列表 midterm_rank 中,把分数放在了 scores 中。不过当时 scores 并没有排序,我们要对数据进行预处理…

深入理解文件系统和日志分析

文件是存储在硬盘上的,硬盘上的最小存储单位是扇区,每个扇区的大小是512字节。 inode:存储元信息(包括文件的属性,权限,创建者,创建日期等等) block:块,连续…

小白跟做江科大32单片机之LED闪烁

原理介绍 原理介绍详见: 【STM32】江科大STM32学习笔记汇总(已完结)_stm32江科大笔记-CSDN博客https://blog.csdn.net/u010249597/article/details/134762513 项目准备 1.在项目文件夹中新建3-1 LED文件夹 2.keil新建项目,打开新建的3-1 LED&#xf…

ros2 launch 用法以及一些基础功能函数的示例

文章目录 launch启动一个节点的launch示例launch文件中添加节点的namespacelaunch文件中的话题名称映射launch文件中向节点内传入命令行参数launch文件中向节点内传入rosparam使用方法多节点启动命令行参数配置资源重映射ROS参数设置加载参数文件在launch文件中使用条件变量act…

【CC2530-操作外部flash】

zigbee cc2530操作flash,以cc2530读flash_id为例子; void InitIO() {CLKCONCMD & ~0x40; //设置系统时钟源为32MHZ晶振 while(CLKCONSTA & 0x40); //等待晶振稳定为32M CLKCONCMD & ~0x47; //设置系统主时钟频率为32MHZ…

Python知识点20---池

提前说一点:如果你是专注于Python开发,那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了,而如果你和作者一样只是操作其他技术的Python API那就足够了。 如果看了我发的线程和进程的知识点的朋友,如果发散思维能…

面试(五)

目录 1. 知道大顶堆小顶端吗,代码怎么区分大顶端小顶端 2. 计算机中栈地址与内存地址增长方向相反吗? 3. %p和%d输出指针地址 4. 为什么定义第二个变量时候,地址反而减了 5. 12,32,64位中数据的占字节?…

物质的量质量,它们可不是一个概念

物质的量&质量,它们可不是一个概念。 物质的量&质量 乍一听物质的量,还以为是和质量有什么关系,是不是?其实物质的量和质量没什么直接的联系。 物质的量是国际单位制中7个基本物理量之一,其符号为n&#xf…

Aras Innovator-Team(群组)的使用方法

当Aras Innovator在处理权限时,在不使用Team的情况下,系统的权限配置可以满足大部分业务场景,如:常见的按照组织架构,成员和角色分配权限,按照生命周期分配权限等。 如果遇到比较复杂的权限需求&#xff0c…

AltiumDesigner/AD添加数据库连接

1.首先确保本机电脑有无对应的数据库驱动,例如我这边要添加MySQL的数据,则需要首先下载MySQL数据驱动:MySQL :: Download MySQL Connector/ODBC (Archived Versions) 2.运行“odbcad32.exe”,如下图添加对应的数据库配置&#xf…

SpringMVC:向三大域对象存数据

1. 简介 Servlet中的三个域对象 请求域:request会话域:session应用域:application 主要是通过:setAttribute getAttribute方法来完成在域中数据的传递和共享。 点击跳转Servlet详细概念 // 向域中存储数据 void setAttribute(St…

智能sql LLM

DB-GPT:彻底改变数据库与私有LLM技术的交互 智能SQL生成:后端技术与LLM的完美结合 智能SQL生成:后端技术与LLM的完美结合_llm sql-CSDN博客 GitHub - eosphoros-ai/DB-GPT: AI Native Data App Development framework with AWEL(Agentic Wor…

【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

golang字符串实用函数库go-str-utils 之字符串命名转换 大小驼峰, snake, kebab命名转换

在go语言的开发中,字符串的处理是最为频繁的, 今天给大家介绍的这个 go-str-utils 专门的字符串处理实用函数库中的 字符串命名转换 大小驼峰, snake, kebab命名转换。 各种命名转换规则和示例 CamelStr 大驼峰 单词全部首字母大写 如: User…

[补题记录]LeetCode 167.两数之和 II - 输入有序数组

StarryCoding 是面向计算机专业学生的综合学习与刷题平台&#xff0c;欢迎同学们的加入&#xff01; 传送门&#xff1a;两数之和 II - 输入有序数组 Thought/思路 答案只需要返回两个下标&#xff0c;表示和为 target 的两个数。 我们可以用一个 map<int, vector> 维…