深度学习——分布式训练

news2024/12/23 17:41:21

目录

  • 1. 前言
  • 2.分布式训练的分类
  • 3.不并行(单机单卡)
  • 4. 数据并行 DP和DDP
    • 4.1 异同点
    • 4.2 原理
    • 4.3 DP 实现(单机多卡)
    • 4.4 DDP 实现(单机多卡,多机分布式)
      • 4.4.1DDP 基本概念
      • 4.4.2 DDP之单机多卡
      • 4.4.4 DDP之多机分布式
  • 参考文献

1. 前言

最近开始上手进行分布式训练,于是在网上开始搜各种教程和资料,看到了许多写得很好的文章,但是有些文章又不是特别的全面,于是决定对这些文章进行归纳和总结,方便后来者的学习和查阅。这里友情提醒一下,大家查资料的时候不要仅仅局限于百度,有时候在百度上查半天,不如去官方文档或者google搜一下,立马就能看到很多优质的解答。

2.分布式训练的分类

关于分布式训练的分类,网上的分类方法五花八门,目前看的这么多文章中最为清晰的要属这篇文章了大模型LLM之分布式训练,简单来讲,分布式训练方法可以分为以下几类:

  • 数据并行
  • 模型并行(包含流水线并行张量并行
  • 混合并行

关于分布式训练分类大家也可以去看一下Hugging Face上的一篇文章Efficient Training on Multiple GPUs,它的分类方式和我们上面提到的有些不同。

接下来的内容主要来自这篇文章:分布式并行训练(DP、DDP、DeepSpeed、Accelerate、Trainer)

3.不并行(单机单卡)

判断GPU是否可用:device = "cuda" if torch.cuda.is_available() else "cpu"
模型拷贝:model.to(device)
数据拷贝:data.to(device)
模型加载:torch.load(xx.pt, map_location=device)
模型保存:torch.save(model, "model.pt")

4. 数据并行 DP和DDP

Pytorch提供的分布式数据并行有两种Data Parallel(DP)和Distributed Data Parallel(DDP) 目前pytorch官网更推荐大家使用的是DDP模式,详见官方文档Data Parallel 和官方文档Distributed Data Parallel

4.1 异同点

DP 和DDP在工作模式上有着共同点和差异,这里博采众长,做一下梳理和总结:

  • 共同点:都是数据并行,都是即插即用

  • 不同点:

    • DP:仅支持单机多卡, 显存负载不均衡(device[0]负载大),不支持Apex混合精度训练,GPU利用不均衡,因Python GIL争用影响 仅支持单进程多线程,训练速率低。
    • DDP:支持单机多卡&多机多卡,数据分配均衡,支持Apex混合精度训练,借助All-Reduce的数据交换方式提高GPU的通讯效率,支持多进程,训练速率高,如果模型特别大,DDP也可以和模型并行一起工作,这个在官方教程中有提到

    在这里插入图片描述
    关于DP和DDP的区别还可以看一下这篇有深度的文章:Distributed data parallel training using Pytorch on AWS

4.2 原理

DP原理
在这里插入图片描述

  • 将模型权重从主卡(默认GPU:0)复制到所有GPU上,输入的bacth大小的数据会分散到各个GPU上(每张卡上输入batch / 4,假设有四张卡)。
  • 之后独自在各张卡上执行前向过程,每张卡的输出结果会被聚合到主卡上,然后在主卡上计算总的损失,总损失是一个标量,一般可以求平均值,再通过损失函数求导,得到损失的梯度,分发到各个GPU上。
  • 在每个GPU根据链式法则继续计算各个参数的梯度,再将所有设备上的梯度回传到主卡上进行梯度累加并求梯度均值。在主卡上通过平均梯度更新模型权重。最后将更新后的模型参数 广播 到其余 GPU 中进行下一轮的前向传播。

DDP 原理
DDP背后的实现是依靠Ring-AllReduce 具体细节可以参考这两篇文章:
Pytorch 分布式训练DDP(torch.distributed)详解-原理-代码
分布式训练(中)——DP、DDP模式

4.3 DP 实现(单机多卡)

在Pytorch中torch.nn.DataParallel()包含三个参数:
在这里插入图片描述
module:参数传入具体的模型,比如ResNet,Unet等
device_ids:传入gpu编号例如:[0,1,2,3],默认为None即使用所有GPU
output_device:指定中心设备(参数服务器),用于汇总梯度的 GPU 是哪个,默认device_ids[0]

 os.environ["CUDA_VISIBLE_DEVICES"] = "0,1,2"   #设置可见的gpu
 net=Unet()  #初始化一个模型
 device_ids=[2,0,1]   #gpu编号,这里故意写成2,0,1而不是0,1,2是为了方便大家理解特殊请情况
 net.to(device_ids[0]) #设置中心设备,注意是device_ids[0] 这一行不能少
 net = torch.nn.DataParallel(net, device_ids=[2, 0, 1]) 
 batch_data.to(device_ids[0])  #
 output = net(batch_data) 

模型的加载和保存,为了和单机单卡保持一致,可以这样写:
保存

if isinstance(net,torch.nn.DataParallel):
  torch.save(net.module.state_dict(), "model.pth")
else:
  torch.save(net.state_dict(), "model.pth")

加载

if isinstance(self.model, torch.nn.DataParallel):
	net.module.load_state_dict(torch.load("model.pth"), strict=False)
else:
	net.load_state_dict(torch.load("model.pth"), strict=False)

注:

  • os.environ[“CUDA_VISIBLE_DEVICES”] = “0,1,2” 设置可见的GPU
  • 在上述的代码中net.to(device_ids[0])设置的是中心设备,这一行不能少,这里device_ids=[2,0,1]是为了方便大家理解device_ids[0]不代表一定是cuda:0。
  • torch.nn.DataParallel() 是对模型进行包裹
  • 关于使用中的一些详细的细节可以看这两篇博客torch.nn.DataParallel使用细节和pytorch GPU torch.nn.DataParallel (DP)多卡并行

4.4 DDP 实现(单机多卡,多机分布式)

DDP相比于DP要复杂得多,这里首先推荐官网的教程,教程很详细,一定要认真看,官方的教程看明白了再看接下来的内容!!!

官方教程 Tutorials
官方API DistributedDataParallel

4.4.1DDP 基本概念

  • WORLD:

    • world 表示包含所有进程的组(所有gpu的集合)。
    • 每个进程通常对应一个 GPU, world 中的进程可以相互通信,这使得使用分布式数据并行(Distributed Data Parallel, DDP)进行训练成为可能。
  • WORLD_SIZE(gpu个数/进程个数):

    • world_size 表示分布式训练环境中的总进程数/gpu数。
    • 每个进程都会被分配一个唯一的标识符(rank),从 0 到 world_size-1。
  • RANK(进程标识符):

    • rank 是分配给world中每个进程的唯一标识符,用于标识每个进程在分布式训练中的角色。
  • LOCAL RANK:

    • local rank是分配个单个node中每个进程的标识符,world中可能有多个node。每个进程的local_rank都不一样。 判断master GPU:if local_rank == 0:
  • NODE(节点):

    • node 可以理解为一个服务器,代表着物理设备上的一个实体。
    • 在多机分布式训练中,每台机器被视为一个节点,节点之间需要进行通信。例如,如果有2 个node/server,每个 node/server/machine 各有4张卡(4 gpus)。total_world_size = 2(节点数) * 4(每个节点的 GPU 数量)= 8, rank 的取值范围为 [0, 1, 2, 3, 4, 5, 6, 7], local_rank 的取值范围为 [0, 1, 2, 3],[0, 1, 2, 3] 分别对应着不同的节点上的进程。

    这里可以参考这篇博客中的例子,如图所示,有三个node,每个node有4个GPU(则每个node会有四个进程,一个进程对应一个GPU)
    在这里插入图片描述

4.4.2 DDP之单机多卡

Pytorch支持的分布式框架的后端主要有 Gloo、MPI 和 NCCL 三种。PyTorch 官方的规则是:如果是分布式 GPU 训练,优先推荐 NCCL:如果是分布式 CPU 训练,优先推荐 Gloo,其次是 MPI。

三种方式:torch.distributed.launch,torch.multiprocessing,torchrun
https://zhuanlan.zhihu.com/p/681694092
https://zhuanlan.zhihu.com/p/561218626
https://blog.csdn.net/m0_46294481/article/details/130608283
https://blog.csdn.net/weixin_54338498/article/details/133308570
【深度学习实战(27)】「分布式训练」DDP单机多卡并行指南
Multi-GPU Training in PyTorch with Code (Part 3): Distributed Data Parallel

这部分以后有空再补,实在没时间写了。

CUDA_VISIBLE_DEVICES : 环境变量,用于指定哪些GPU设备可见。0,1表示设备编号为0和1的两个GPU将被使用。如果你有多个GPU,但只想使用其中一部分,可以通过设置CUDA_VISIBLE_DEVICES来限制使用的GPU。

torchrun: 分布式训练的工具。它是PyTorch提供的用于启动和管理分布式训练的命令。

standalone:指定使用独立的分布式训练方式,即在单个节点上进行多卡训练。(所谓的节点是指训练服务器的数量)。如果我想在多个节点训练,需要讲这个参数改为multinode

nnodes:指定节点的数量,即参与训练的节点数。在这里,设置为1表示只有一个节点。

nproc_per_node:每个节点使用的GPU数量,即每个节点上的GPU数目。在这里,设置为2表示每个节点上会使用两个GPU进行训练。

node_rank:物理节点的序号,每个电脑的序号,在多机分布式中使用

在训练过程中难免会遇到一些问题,这时候需要调试,可以参考这篇文章:pycharm进行torchrun的调试

4.4.4 DDP之多机分布式

一般情况下不会用到这种情况所以,我们这里不做讲解,感兴趣的可以看这篇博客:PyTorch分布式训练基础–DDP使用

参考文献

大模型LLM之分布式训练
A Survey of Large Language Models
Pytorch 分布式训练DDP(torch.distributed)详解-原理-代码
Efficient Training on Multiple GPUs
分布式训练(中)——DP、DDP模式
torch.nn.DataParallel使用细节
pytorch GPU torch.nn.DataParallel (DP)多卡并行
DistributedDataParallel
Tutorials
pycharm进行torchrun的调试
PyTorch分布式训练基础–DDP使用
Distributed data parallel training using Pytorch on AWS

DDP
分布式并行训练(DP、DDP、DeepSpeed、Accelerate、Trainer)
Pytorch多卡训练
分布式训练(上)——rank local_rank node

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

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

相关文章

知识付费小程序搭建

近期,我的一位教育培训机构的朋友巧妙运用了一款知识付费小程序,成功解锁了教育创新的新篇章。这个月,他的教学平台迎来了显著的增长,新增生源高达200人,这一成就令人瞩目。他巧妙地将线上教学的便捷性与线下互动的沉浸…

一个php快速项目搭建框架源码,带一键CURD等功能

介绍: 框架易于功能扩展,代码维护,方便二次开发,帮助开发者简单高效降低二次开发成本,满足专注业务深度开发的需求。 百度网盘下载 图片:

汉服文化平台网站

您好!本篇论文将详细介绍汉服文化平台网站的设计与实现,该项目基于Java语言,采用SSM框架,结合MySQL数据库完成开发。如果您对汉服文化或本项目有任何兴趣或疑问,欢迎随时与我联系。 开发语言 Java 数据库 MySQL 技…

C#多项目统一版本号

问题 如果C#项目有个项目组合成,每次升级都需要修改csproj里面的版本号,处理起来比较麻烦 案例 common.targets 有如下两个项目,Main引用ClassLibrary1 namespace ClassLibrary1 {public class Class1{public void SayHello(){Console.W…

BSV区块链发布Golang软件开发工具包

​​发表时间:2024年8月8日 BSV区块链团队正式发布为Golang语言开发的软件开发工具包(SDK)。这个Golang SDK(以下称Go SDK)为开发可扩展的BSV区块链应用提供了一套升级且标准化的接口和工具。 请在GitHub上访问Go SDK…

1Panel应用推荐:MeterSphere开源持续测试工具

1Panel(github.com/1Panel-dev/1Panel)是一款现代化、开源的Linux服务器运维管理面板,它致力于通过开源的方式,帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用,1Panel特别开通应用商店&am…

【protobuf入门学习(一)】 —— protobuf安装教程

目录 (一)protobuf 的基本介绍 1. 序列化概念 2. ProtoBuf 是什么 3. ProtoBuf 的使用特点 (二)protobuf 安装 2.1 protobuf ——Windows 1. 下载ProtoBuf编译器 2. 配置环境变量 3. 检查是否配置成功 2.2 protobuf —— L…

【数字时序】时钟树延迟偏差——CPPR adjustment

接上一篇文章Innovus的时序报告解读,新版的貌似多了一些信息,比如CPPR Adjustment和Derate。不太清楚这两个是什么概念,搜索之后转载2篇后端工程师的博客如下: 搜到个这个网站好像有很多后端相关的知识点分享一哈: Co…

Linux文件编程(进阶)

文章目录 Linux文件编程文件操作的基本元素(文件在磁盘上的操作)软链接和硬链接原理文件系统范围创建方式示例:在终端使用指令创建软硬链接软链接硬链接 删除源文件影响软链接和硬链接实现的具体原理link函数unlink函数代码示例:使…

【链栈的实现】--------本质为不带头结点的 头插法建立起来的单链表

1.链栈的基本属性与特征: 链栈是运算受限的单链表,只能在链表头部进行操作 2.链栈的相关基础操作汇总 初始化操作:操作结果:构造一个空栈 S。 InitStack(LinkStack *s)判定S是否为空栈: 初始条件:栈S 已存在 操作结果:若栈S为…

【Linux】全面解析进程:优先级、环境变量与地址空间

文章目录 1. 进程概念1.1 什么叫做进程?1.2 进程和程序的区别 2. linux下的进程2.1 task_struct 包含哪些内容2.2 访问(查看)进程信息2.3 通过系统调用获取进程标示符2.4 通过系统调用创建进程2.5 进程状态2.6 如何查看进程状态(指…

鸿蒙开发5.0【基于CameraKit,通过avrecorder进行录像】

1 场景描述 录像是相机应用的最重要功能之一,录像是循环帧的捕获。本文通过CameraKit自定义相机并通过avrecorder进行录像。 2 效果图 3 自定义相机录像流程图 4 方案描述 4.1 整体描述: 总体可分为:1、相机输入,2、同时输出预览流录像流…

【Python机器学习】NLP分词——利用分词器构建词汇表(三)——度量词袋之间的重合度

如果能够度量两个向量词袋之间的重合度,就可以很好地估计他们所用词的相似程度,而这也是它们语义上重合度的一个很好的估计。因此,下面用点积来估计一些新句子和原始的Jefferson句子之间的词袋向量重合度: import pandas as pdse…

win10配置安装apache服务

Welcome! - The Apache HTTP Server Project

redisson watchdog 原理

目录 1、使用2、加锁解析1、getLock2、tryLock2.1、当ttl为null时为加锁成功,返回true,否则继续往下执行,判断是否超过等待时间,当前时间减去获取锁前时间就是获取锁花费时间。2.2、tryAcquire(leaseTime, unit, threadId)2.3 、renewExpirat…

黑悟空!一区预定!原创首发!SLWCHOA-Transformer-LSTM混合改进策略的黑猩猩优化算法多变量时间序列预测

黑悟空!一区预定!原创首发!SLWCHOA-Transformer-LSTM混合改进策略的黑猩猩优化算法多变量时间序列预测 目录 黑悟空!一区预定!原创首发!SLWCHOA-Transformer-LSTM混合改进策略的黑猩猩优化算法多变量时间序…

帮助检测SQL注入漏洞的工具

目录 SQLMap与Burp Suite相比,哪个更适合进行大规模的SQL注入检测? OWASP ZAP在检测SQL注入时的优势体现在哪些方面? 对于SQL注入漏洞检测,Havij和acunetix有什么区别? 在检测SQL注入漏洞方面,有几款工具…

shell脚本-采集容器内自定义端口tcp连接数并通过http接口推送到Prometheus

目录 1、脚本编写 2、脚本说明 3、运行脚本 1、脚本编写 脚本监控服务器 5000 端口的 TCP 连接数。使用 netstat 工具获取连接数,并通过一个简单的 shell 服务器提供 /connect 接口。具体功能如下: vim prometheus_tcp_monitor.sh 编写脚本&#…

Docker 安装消息队列RabbitMQ

拉取镜像 docker pull rabbitmq拉取最新镜像 创建并运行 docker run -d --hostname my-rabbit --name rabbit-p 15672:15672 -p 5673:5672rabbitmq开启Web管理 进入容器 docker exec -it rabbitmq /bin/bash开启web管理 rabbitmq-plugins enable rabbitmq_managementhttp:…

一文通透DeepSeek-V2(改造Transformer的中文模型):从DeepSeek LLM到DeepSeek-V2的MLA与MoE

前言 成就本文有以下三个因素 24年5.17日,我在我司一课程「大模型与多模态论文100篇」里问道:大家希望我们还讲哪些论文 一学员朋友小栗说:幻方发布的deepseek-v224年5.24日,我司一课程「大模型项目开发线上营1」里的一学员朋友…