YOLO-V5 系列算法和代码解析(六)—— 分布式训练

news2025/7/14 4:37:33

文章目录

    • 预备知识
    • DP
    • DDP
    • DP和DDP对比
    • YOLO-V5 实际使用
    • 参考链接

预备知识

  为了更好的理解分布式相关的内容,需要提前熟悉一些基本概念和特定的名称。分布式训练涉及到设备端(CPU,GPU),算法端(梯度更新,反向传播)等基本概念,具体陈述如下:

  1. 基本概念

    网络参数:【w,b】是训练过程中,需要更新的参数,也称为权重和偏置;w 的更新公式如下,
    w ∗ = w − α ⋅ ∂ E ∂ w (1) w^*=w-\alpha\cdot \frac{\partial E}{\partial w} \tag1 w=wαwE(1)
      注: w ∗ w^* w 是待更新的权重参数, w w w 是上一次迭代的权重参数, α \alpha α 是学习率(w更新的步长), ∂ E ∂ w \frac{\partial E}{\partial w} wE 表示梯度,w 更新的方向。
    损失函数:网络的输出与真实标签的误差项,训练过程就是不断的最小化误差项 E,得到最优的网络参数【w,b】,
    E = ∑ x ∣ ∣ f w ( x ) − y ∣ ∣ 2 (2) E = \sum_x||f_w(x)-y||^2 \tag2 E=x∣∣fw(x)y2(2)
    前向传播:上述公式(2)中的 f w ( x ) f_w(x) fw(x) 表示前向计算过程,x是输入,y是标签;
    反向传播:对上述(2)进行链式求导,可以得到全部【w,b】的偏导数(梯度),然后应用公式(1)更新参数【w,b】;

  2. 反向传播
    关于反向传播的具体推导过程,可以参考链接:https://zhuanlan.zhihu.com/p/40378224,作者写的非常详细,【通俗易懂】,要仔细看看。

  3. 分布式特定名称

    group:进程组,一般就需要一个默认的,通常使用较少;
    world size:全局进程总数量;
    rank:进程的ID,0为主进程,一个进程可以控制多个GPU;
    local_rank:某个节点上的进程id,隐式参数,torch自动分配;
    local_word_size:单个节点上的进程数量,通常很少用到;

    图示上述概念,官方参考链接:DDP基本概念及理论, 其它参考链接:分布式相关概念(详细)

    官方图例解析:假设有两台机器或者节点(NODE),每个机器上有4块GPU,图中有4个进程,即【world_size=4】,进程ID rank=【0,1,2,3】。每一个进程控制【2】块GPU设备。通常情况下,综合考虑设备IO、负载,一般为每一个进程分配【1】块GPU 设备。

在这里插入图片描述

DP

  DP (DataParallel) 是单进程,多线程的工作模式,针对单机多卡训练的情况。DP 执行过程中,始终会有一个主GPU来【汇总】和【分发】数据(包括每个GPU的输出,梯度值,网络参数等),通常【0号】GPU被称为主GPU。

  1. GPU数据更新逻辑

    1. 主GPU将输入数据(images)平均分发到其它GPU,同时也将模型以及初始的模型参数分发到其它GPU,因此初始的网络参数是一样的,输入图像数据是不同的;
    2. 各个GPU独立进行网络前向计算,得到输出;
    3. 主GPU将网络输出汇总到主GPU,结合真实的标签值,计算损失,然后对损失求导,记 ∂ l o s s \partial loss loss,然后将该导数分发到其它GPU;
    4. 每个GPU得到 ∂ l o s s \partial loss loss 后,独立进行反向传播(链式求导),得到所有网络参数的偏导数,也即是梯度;
    5. 主GPU将各个GPU的梯度汇总到主GPU,得到平均梯度。根据公式(1)更新网络参数【w,b】,然后将新更新的网络参数分发至其它GPU,这样每个GPU的网络参数依然保持一致;
    6. 循环上述过程,至训练结束;

    下图的引用链接为:Training Neural Nets on Larger Batches: Practical Tips for 1-GPU, Multi-GPU & Distributed setups

    在这里插入图片描述

  2. DP的不足

    显卡负载:主GPU的负载较大,通常显存占用比其它显卡大很多。
    通信开销:假设有 N 个 GPU, 完成一次通信需要时间 t,总共需要花费时间
    T = 2 ( N − 1 ) ⋅ t T=2(N-1)\cdot t T=2(N1)t
    性能瓶颈:Global Interpreter Lock (GIL)全局解释器锁,简单来说就是,一个 Python 进程只能利用一个 CPU kernel,即单核多线程并发时,只能执行一个线程。考虑多核,多核多线程可能出现线程颠簸 (thrashing) 造成资源浪费,所以 Python 想要利用多核最好是多进程。

  3. 实例展示
    YOLO-V5 中的DP使用方式如下,只需添加一行代码即可,如下代码片段所示,

    # DP mode
    if cuda and RANK == -1 and torch.cuda.device_count() > 1:
        LOGGER.warning('WARNING: DP not recommended, use torch.distributed.run for best DDP Multi-GPU results.\n'
                       'See Multi-GPU Tutorial at https://github.com/ultralytics/yolov5/issues/475 to get started.')
        # 只需添加该行代码即可,其它不必动
        model = torch.nn.DataParallel(model)
    

DDP

  DDP (DistributedDataParallel) 是多进程的工作方式,针对多机多卡(也包含单机多卡)。与 DP 不同的是,不需要全程使用主GPU来汇总和分发数据。

  1. GPU更新逻辑

    (1) 各个GPU独立的从硬盘加载输入数据,加载相同的模型;
    (2) 各个GPU独立的进行前向传播,损失计算,反向传播;
    (3) 每两个相邻的GPU进行梯度的汇总和分发;
    (4) 各个GPU进行独立的更新网络参数;

  2. 梯度汇总分发策略
    对于GPU之间的数据传递,主要采用【The Ring Allreduce】策略。几乎查阅了全网的资源,很少能够解析的比较全面,并且通俗易懂。经过仔细筛选和对比,可以仔细阅读【参考链接,2.,3. 】,详细讲解了DDP的梯度更新策略,并且很容易理解。如果后面有时间,我会详细解析该内容

  3. 通信时间
    假设有N个GPU,将传输的梯度分为N份,那么汇总需要传递N-1次,分发需要N-1次。假设传输的数据总量为K,则总的传输时间为,
    T = 2 ( N − 1 ) ⋅ K N T = 2(N-1)\cdot \frac{K}{N} T=2(N1)NK
    注:通过上式可以看到,通信时间几乎与GPU数量无关。

  4. 示例展示
    YOLO-V5 中的DDP使用方式如下,主要包含两部分:首先,初始化线程组(L12);然后调用【DDP】API 接口,拷贝模型;代码片段如下所示,

    # DDP mode
    device = select_device(opt.device, batch_size=opt.batch_size)
    if LOCAL_RANK != -1:
        msg = 'is not compatible with YOLOv5 Multi-GPU DDP training'
        assert not opt.image_weights, f'--image-weights {msg}'
        assert not opt.evolve, f'--evolve {msg}'
        assert opt.batch_size != -1, f'AutoBatch with --batch-size -1 {msg}, please pass a valid --batch-size'
        assert opt.batch_size % WORLD_SIZE == 0, f'--batch-size {opt.batch_size} must be multiple of WORLD_SIZE'
        assert torch.cuda.device_count() > LOCAL_RANK, 'insufficient CUDA devices for DDP command'
        torch.cuda.set_device(LOCAL_RANK)
        device = torch.device('cuda', LOCAL_RANK)
        dist.init_process_group(backend="nccl" if dist.is_nccl_available() else "gloo")
    
    # DDP mode
    if cuda and RANK != -1:
        model = DDP(model, device_ids=[LOCAL_RANK], output_device=LOCAL_RANK)
    

DP和DDP对比

  1. 在DP模式中,总共只有一个进程(受到GIL很强限制),DDP 采用多进程,避免了GIL的限制。
  2. DP 的通信成本随着 GPU 数量线性增长,而 DDP 支持 Ring AllReduce,其通信成本是恒定的,与 GPU 数量无关。
  3. DDP 模式下,每一个GPU的显存占用是基本相同的,负载基本一致;
  4. 分布式训练时,基本就使用 DDP模式;

YOLO-V5 实际使用

  机器配置:单机,Ubuntu,四张显卡,2080Ti,12G 显存

  1. 单机单卡

    python train.py --data coco.yaml --epochs 300 --weights '' --cfg yolov5s.yaml --batch-size 32
    
  2. DP

    DP 训练速度较慢,与单卡训练相比,速度提升有限,不建议使用

    python train.py  --batch 32 --data coco.yaml --weights '' --cfg yolov5s.yaml --device 0,1
    
  3. DDP

    nproc_per_node:指定GPU的数量;
    device:指定具体使用的 GPU ID;
    batch:总共的batch,下面的例子,每一个GPU的输入数据数量为【 64/2=32】;

    python -m torch.distributed.run --nproc_per_node 2 train.py 
    								--batch 64 
    								--data coco.yaml 
    								--weights ''
    								--cfg yolov5s.yaml 
    								--device 0,1
    

参考链接

  1. DP模式下GPU数据通信逻辑
  2. DDP模式下GPU数据通信逻辑
  3. MMLab关于DP和DDP的解析
  4. https://zhuanlan.zhihu.com/p/56991108
  5. https://zhuanlan.zhihu.com/p/178402798
  6. Pytorch 分布式理论的论文

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

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

相关文章

项目团队承诺管理的3个重要因素

每一个项目都需要一个强有力的领导者,以获得适当的成功机会。与一个优柔寡断、缺乏经验的项目领导者相比,一个有组织的领导者在管理一个精心策划的项目时,更有可能取得项目的成功和客户的满意。再加上一个非常投入和负责任的项目团队&#xf…

[ docker相关知识 ] 删除 docker 拉取的镜像 -- 释放内存

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

Speckle 3d数据引擎Python开发实战

在这个教程中,我们将使用 Speckle 数据并使用它来创建一个超级简单的仪表板。 我们将从Speckle流中接收几何图形,更新数据,并使用它来使用 Plotly 和 Dash 进行一些计算和简单绘图。 我们假设你具有 Python 和 Speckle 的一般知识。 如果有任…

信号处理——MATLAB音频信号加噪、滤波

音频信号叠加噪声及滤波一、前言二、信号分析及加噪三、滤波去噪四、总结很抱歉大家,最近经常有朋友私信问我关于这篇信号处理的一些问题,因为最近比较忙所以没能一一回复,给大家说句抱歉,希望那些给我私信的人可以看到。大家问的…

golang 垃圾回收-三色标记法(白话版)

对于golang 垃圾回收的了解,我理解更多的就是了解,实际做项目能用到垃圾回收的知识点不多,但有些晦涩难懂的语言,是我们的绊脚石,对于技术怎么能理解就怎么记忆。 1. golang垃圾回收的基础:标记&#xff08…

ESNI 和ECH的前世今生

这边文章中提到过虽然 TLS 能够加密整个通信过程,但是在协商的过程中依旧有很多隐私敏感的参数不得不以明文方式传输,其中最为重要且棘手的就是将要访问的域名,即 SNI(Server Name Indication)。同时还有用于告知客户端…

javaEE高阶---MyBatis

一 : 什么是MyBatis MyBatis是更简单完成程序和数据库交互的工具,也就是更简单的操作和读取数据库的工具.MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获取结果集的动作 . MyBatis …

[oeasy]python0037_终端_terminal_电传打字机_tty_shell_控制台_console_发展历史

换行回车 回忆上次内容 换行 和 回车 是两回事 换行 对应字节0x0ALine-Feed 水平 不动垂直 向上喂纸 所以是 feed 回车 对应字节0x0DCarriage-Return 垂直 不动水平 回到纸张左侧 可移动的打印头 运输字符 的 装置 (Carriage)回到 行首 所以是 Return tty、terminal、shell、…

【视觉SLAM】DM-VIO: Delayed Marginalization Visual-Inertial Odometry

L. v. Stumberg and D. Cremers, “DM-VIO: Delayed Marginalization Visual-Inertial Odometry,” in IEEE Robotics and Automation Letters, vol. 7, no. 2, pp. 1408-1415, April 2022, doi: 10.1109/LRA.2021.3140129. 论文阅读方法:Title,Abstract…

百趣代谢组学文献分享:学科交叉研究,微生物回收重金属机制研究

发表期刊:Environment International 影响因子:7.297 发表时间:2019年 合作单位:福建农林大学 百趣代谢组学文献分享,该文章是BIOTREE协助客户2019年发表在Environment International上的关于微生物回收重金属机制研…

Tomcat的Connector启动过程分析

一. 前言 前面分析了tomcat的整体架构和tomcat的启动过程,在分析启动过程的时候只讲了整体的启动过程,本篇来重点分析一下tomcat的Connector(连接器)组件的启动过程。 二.从Connector的构造开始 那么org.apache.catalina.connector.Connector是在什么…

文献学习06_利用句法指示符和句子上下文加强关系抽取

论文信息 Subjects: Computation and Language (cs.CL) (1)题目:Enhancing Relation Extraction Using Syntactic Indicators and Sentential Contexts (利用句法指示符和句子上下文加强关系抽取) (2&…

论文精读:RPM-Net: Robust Point Matching using Learned Features

论文地址:https://arxiv.org/pdf/2003.13479.pdf 点云配准任务 点云配准可以当做一个基础的上游任务,根据从不同视角下获取的点云数据配准为完整的点云数据,下游任务众多 基本任务:求一个变换矩阵,使得两个具有未知点的点云数据重合。 刚性与非刚性: 刚性配准:旋转和平…

Leetcode 121买卖股票的最佳时机

题目描述: 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔…

solr集群配置(使用solr自带的Jetty实现集群配置)

看了很多的资料发现基本集群搭建都是通过tomcat的方式实现的,但是在高版本的solr中,可以通过solr自带的jetty实现集群的搭建 准备 1.虚拟机安装linux 2.安装jdk 3.下载solr并解压 步骤 1.进入到解压后solr的bin目录下,并执行 ./solr -e clo…

赛狐ERP | 如何高效管理亚马逊广告!用这款亚马逊ERP就够了!

亚马逊的广告管理是是每一位亚马逊运营的必修课,除自然流量外,广告来带的流量与转化占比都极高,广告做活了,就是打虎上山;广告搞砸了,就是骑虎难下:不开广告吧没有流量卖不动、开了广告吧财务账…

#B. 部落联盟

一,题目Description在草原上有N个部落,每个部落都有其坐标(xi,yi)每个部落都有个武力值,可正可负由于部落间只能通过马匹来传递信息于是只有当两个部落间的距离为1的时候,两个部落才有可能进行联系,距离计算公式为abs(xi-xj)abs(y…

人生的喜悦、不快与成长,都在那一篇篇的文字中得到记录 | 2022 年终总结

又是一年的总结,不知道自己今年又该写点什么。但提笔总是好的,也算对今年的一个交代和对未来的一份期许。窗外的阳光正好,对面楼的敲打声叮叮咚咚,窗台上的两只猫睡得依旧奔放和舒适。这样一个看似美好的下午,一个平凡…

Internet Download Manager2023最好用的HTTP下载神器

Internet Download Manager 介绍2023最佳下载利器。Internet Download Manager (简称IDM) 是一款Windows 平台功能强大的多线程下载工具,国外非常受欢迎。支持断点续传,支持嗅探视频音频,接管所有浏览器,具有站点抓取、批量下载队…

机器学习100天(二十六):026 k近邻分类算法-理论

机器学习100天,今天讲的是:K 近邻分类算法-理论。 《机器学习100天》完整目录:目录 一、什么是 K 近邻算法 K 近邻算法也叫 KNN(k-Nearest Neighbor)算法,它是一个比较成熟也是最简单的机器学习算法之一。K 近邻分类算法的思路是:如果一个样本在特征空间中与 K 个实例最…