多GPU并行训练

参考:https://zhuanlan.zhihu.com/p/178402798
1.常见的多GPU使用方法:
模型并行,数据并行。
模型并行,可用于训练大型网络,模型分块进行训练,对于训练速度影响不大。数据并行,相当于加大了batchsize的数量,加快了训练速度。
在这里插入图片描述
在这里插入图片描述
2.数据在不同设备之间如何分配?误差如何在不同设备之间通讯?
每一个step求梯度之后,会把不同的GPU之间的梯度求平均。
BN如何在不同设备间同步?
在不同设备间同步计算均值和方差时,需要计算所有的特征矩阵(多个GPU的总和)在每一个channel上的均值和方差,可提升约一个点的精度。但训练速度会降低。在这里插入图片描述

每个BN层求的均值和方差都是针对每一个gpu上的batchsize数据,例如batchsize等于二的时候,计算的是第一个GPU上的两张照片的BN。

3.pytorch训练方法:
Dataparallel和DistributedDataParallel。
第一种方法一般用于单机多卡,第二种方法可以用于单机多卡或多机多卡。第二种方法速度一般,高于第一种方法。
pytorch中多gpu训练的方法:
torch.distributed.lanunch和torch.multiprocessing。第一种方法代码量更少,启动速度更快。第二种方法拥有更好的控制和灵活性。
在这里插入图片描述
使用多GPU的场景,需要同步多个GPU之间的进度,最后返回该轮当中的平均损失值。

1、DDP:DistributedDataParallel是一个支持多机多卡。
Pytorch中troch.distributed.
DDP属于数据并行,,通过提高batch size来增加并行度。
通过多个进程方式来减轻Python GIL的限制。显著的快于DP。目前最流行的多机多卡的加速方法。
import torch.distributed as dist
2、DDP基本原理:
假设有N张显卡:在DDP模式下,将有N个进程被启动,每个进程在一张卡上加载一个模型,这些模型的参数在数值上是相等的。模型训练过程中通过Ring-Reduce方法与其他进程之间相互通信,交换各自梯度从而得到所有进程的梯度。在参数更新过程中,个进程之间的参数是通过平均梯度进行更新,由于各个进程的初始参数、更新参数一直,所以更新后的参数也是完全一致的。
3、DP:DataParallel很早出现的单机多卡、参数服务器的多卡训练模式。
model = torch.nn.DataParallel(model)
该模式下只有一个进程,master相当于一个参数服务器,会像其他卡广播参数。这种参数更新方式master节点任务、通讯量重,导致网络堵塞、训练速度减慢。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于PaddlePaddle的多GPU并行训练,你可以使用PaddlePaddle提供的数据并行和模型并行两种方式进行。 对于数据并行,你可以使用`paddle.DataParallel`来实现。它可以自动将数据分发到多个GPU上进行并行计算,并在反向传播时自动进行梯度的聚合和同步。你只需要将模型包装在`paddle.DataParallel`中即可实现多GPU并行训练。 以下是一个简单示例: ```python import paddle import paddle.nn as nn # 创建模型 model = nn.Linear(10, 10) # 使用DataParallel进行多GPU并行训练 model = paddle.DataParallel(model) # 定义输入数据 inputs = paddle.randn([32, 10]) # 前向计算 outputs = model(inputs) # 计算损失并进行反向传播 loss = paddle.mean(outputs) loss.backward() ``` 对于模型并行,你可以使用`paddle.ModelParallel`来实现。模型并行将模型的不同部分分配到不同的GPU上,分别进行计算,并通过消息传递机制进行通信。这可以在模型较大时有效地减少显存占用。 以下是一个简单示例: ```python import paddle import paddle.nn as nn # 创建模型 model = nn.Linear(10, 10) # 在模型的第一层之前插入一个模型并行层 model = paddle.ModelParallel(model, [0, 1]) # 定义输入数据 inputs = paddle.randn([32, 10]) # 前向计算 outputs = model(inputs) # 计算损失并进行反向传播 loss = paddle.mean(outputs) loss.backward() ``` 希望以上内容对你有所帮助!如果有更多问题,欢迎继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

。七十二。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值