YOLOX源码之 wait_for_the_master

2024-06-03 01:44
文章标签 源码 master wait yolox

本文主要是介绍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()后,所有进程的阻塞被解除,继续执行后续的代码。

这篇关于YOLOX源码之 wait_for_the_master的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1025687

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

kubelet组件的启动流程源码分析

概述 摘要: 本文将总结kubelet的作用以及原理,在有一定基础认识的前提下,通过阅读kubelet源码,对kubelet组件的启动流程进行分析。 正文 kubelet的作用 这里对kubelet的作用做一个简单总结。 节点管理 节点的注册 节点状态更新 容器管理(pod生命周期管理) 监听apiserver的容器事件 容器的创建、删除(CRI) 容器的网络的创建与删除

red5-server源码

red5-server源码:https://github.com/Red5/red5-server

linux 下Time_wait过多问题解决

转自:http://blog.csdn.net/jaylong35/article/details/6605077 问题起因: 自己开发了一个服务器和客户端,通过短连接的方式来进行通讯,由于过于频繁的创建连接,导致系统连接数量被占用,不能及时释放。看了一下18888,当时吓到了。 现象: 1、外部机器不能正常连接SSH 2、内向外不能够正常的ping通过,域名也不能正常解析。

java线程深度解析(四)——并发模型(Master-Worker)

http://blog.csdn.net/daybreak1209/article/details/51372929 二、Master-worker ——分而治之      Master-worker常用的并行模式之一,核心思想是由两个进程协作工作,master负责接收和分配任务,worker负责处理任务,并把处理结果返回给Master进程,由Master进行汇总,返回给客