ℹ️ Skipped - page is already crawled
| Filter | Status | Condition | Details |
|---|---|---|---|
| HTTP status | PASS | download_http_code = 200 | HTTP 200 |
| Age cutoff | PASS | download_stamp > now() - 6 MONTH | 0.7 months ago |
| History drop | PASS | isNull(history_drop_reason) | No drop reason |
| Spam/ban | PASS | fh_dont_index != 1 AND ml_spam_score = 0 | ml_spam_score=0 |
| Canonical | PASS | meta_canonical IS NULL OR = '' OR = src_unparsed | Not set |
| Property | Value |
|---|---|
| URL | https://blog.csdn.net/ytusdc/article/details/122091284 |
| Last Crawled | 2026-03-17 19:01:31 (21 days ago) |
| First Indexed | 2021-12-25 07:44:14 (4 years ago) |
| HTTP Status Code | 200 |
| Meta Title | Pytorch 分布式训练(DP/DDP)_pytorch分布式训练-CSDN博客 |
| Meta Description | 文章浏览阅读3.8w次,点赞130次,收藏550次。本文详细介绍PyTorch中DataParallel和DistributedDataParallel的使用方法,包括模型并行、数据并行的概念,多卡训练的实现细节,分布式训练的流程,以及模型评估和保存的相关技巧。 |
| Meta Canonical | null |
| Boilerpipe Text | 参考(需要看):
0、
实操教程 | GPU多卡并行训练总结(以pytorch为例)
1、
PyTorch 源码解读之 DP & DDP:模型并行和分布式训练解析 - 知乎
2、
pytorch中分布式训练DP、DDP原理 - 知乎
3、
pytorch中多卡训练_ytusdc的博客-CSDN博客_pytorch多卡训练
4、github代码机械:
https://github.com/ytusdc/pytorch-distributed
5、
PyTorch 分布式数据并行入门_w3cschool
6、
Pytorch一机多卡分布式并行训练及混合精度训练_David's Tweet-CSDN博客_pytorch混合精度训练
7、
深度学习分布式训练实战(一)_小肥柴不是小废柴的博客-CSDN博客_分布式深度学习
8、
如何理解深度学习分布式训练中的large batch size与learning rate的关系?-51CTO.COM
9、
Broadcast,Scatter,Gather,Reduce,All-reduce分别是什么?_aiwanghuan5017的博客-CSDN博客
10、
Ring AllReduce简介 - 墨天轮
11、
PyTorch分布式官方文档
12、
官方文档写PyTorch分布式程序
1、分布式训练:模型并行和数据并行
分布式训练根据并行策略的不同,可以分为模型并行和数据并行。
模型并行
模型并行主要应用于模型相比显存来说更大,一块 GPU 无法加载的场景,通过把模型切割为几个部分,分别加载到不同的 GPU 上,来进行训练
数据并行
这个是日常会应用的比较多的情况。即每个 GPU 复制一份模型,将一批样本分为多份分发到各个GPU模型并行计算。因为求导以及加和都是线性的,数据并行在数学上也有效。采用数据并行相当于加大了batch_size,得到更准确的梯度或者加速训练。
模型并行不是这里的讨论重点
常用的 API 有两个:
torch.nn.DataParallel(
DP
)
torch.nn.DistributedDataParallel(
DDP
)
DP 相比 DDP 使用起来更友好(代码少),但是 DDP 支持多机多卡,训练速度更快,而且负载相对要均衡一些。所以优先选用 DDP 吧。
1.1、数据并行
数据并行的操作要求我们将数据划分成多份,然后发送给多个 GPU 进行并行的计算。
注意:多卡训练要考虑通信开销的,是个trade off的过程,不见得四块卡一定比两块卡快多少,可能是训练到四块卡的时候通信开销已经占了大头
下面是一个简单的示例。要实现数据并行,第一个方法是采用
nn.parallel
中的几个函数,分别实现的功能如下所示:
复制(Replicate):将模型拷贝到多个 GPU 上;
分发(Scatter):将输入数据根据其第一个维度(通常就是 batch 大小)划分多份,并传送到多个 GPU 上;
收集(Gather):从多个 GPU 上传送回来的数据,再次连接回一起;
并行的应用(parallel_apply):将第三步得到的分布式的输入数据应用到第一步中拷贝的多个模型上。
实现代码如下
replicas = nn.parallel.replicate(module, device_ids)
inputs = nn.parallel.scatter(
input
, device_ids)
outputs = nn.parallel.parallel_apply(replicas, inputs)
result = nn.parallel.gather(outputs, output_device)
python
PyTorch也提供了简单的函数
torch.nn.DataParallel(module, device_ids=None, output_device=None, dim=0)
,只用几行代码可实现简单高效的并行GPU计算。通过device_ids参数可以指定在哪些GPU上进行优化,output_device指定输出到哪个GPU上
new_net= nn.DataParallel(net, device_ids=[
0
,
1
])
output= new_net(
input
)
python
1.2、并行数据加载
流行的深度学习框架(例如Pytorch和Tensorflow)为分布式培训提供内置支持。从广义上讲,从磁盘读取输入数据开始,加载数据涉及四个步骤:
将数据从磁盘加载到主机
将数据从可分页内存传输到主机上的固定内存。请参阅
此
有关分页和固定的内存更多信息。
将数据从固定内存传输到GPU
在GPU上向前和向后传递
PyTorch
中的
Dataloader
提供使用多个进程(通过将
num_workers
> 0
设置)从磁盘加载数据以及将多页数据从可分页内存到固定内存的能力(通过设置
pin_memory = True
)。
一般的,对于大批量的数据,若仅有一个线程用于加载数据,则数据加载时间占主导地位,这意味着无论我们如何加快数据处理速度,性能都会受到数据加载时间的限制。现在,设置
num_workers = 4
以及
pin_memory = True
。这样,可以使用多个进程从磁盘读取不重叠的数据,并启动生产者-消费者线程以将这些进程读取的数据从可分页的内存转移到固定的内存。
多个进程能够更快地加载数据,并且当数据处理时间足够长时,流水线数据加载几乎可以完全隐藏数据加载延迟。这是因为在处理当前批次的同时,将从磁盘读取下一个批次的数据,并将其传输到固定内存。如果处理当前批次的时间足够长,则下一个批次的数据将立即可用。这个想法需要为
num_workers
参数设置适当的值。设置此参数,以使从磁盘读取批处理数据的速度比GPU处理当前批处理的速度更快(但不能更高,因为这只会浪费多个进程使用的系统资源)。
请注意,到目前为止,我们仅解决了从磁盘加载数据以及从可分页到固定内存的数据传输问题。从固定内存到GPU的数据传输(
tensor.cuda()
)也可以使用CUDA流进行流水线处理。
现在将使用GPU网络检查数据并行处理。基本思想是,网络中的每个GPU使用模型的本地副本对一批数据进行正向和反向传播。反向传播期间计算出的梯度将发送到服务器,该服务器运行reduce归约操作以计算平均梯度。然后将平均梯度结果发送回GPU,GPU使用SGD更新模型参数。使用数据并行性和有效的网络通信软件库(例如NCCL),可以实现使训练时间几乎线性减少。
2、数据并行 DataParallel
PyTorch 中实现数据并行的操作可以通过使用
torch.nn.DataParallel
2.1 并行处理机制
DataParallel系统通过将整个小型批处理加载到主线程上,然后将子小型批处理分散到整个GPU网络中来工作。
详细流程:
forward:
是将输入一个 batch 的数据均分成多份,分别送到对应的 GPU 进行计算。与 Module 相关的所有数据也都会以浅复制的方式复制多份。每个 GPU 在单独的线程上将针对各自的输入数据独立并行地进行 forward 计算。
backward:
在主GPU上收集网络输出,并通过将网络输出与批次中每个元素的真实数据标签进行比较来计算损失函数值。接下来,损失值分散给各个GPU,每个GPU进行反向传播以计算梯度。最后,在主GPU上归约梯度、进行梯度下降,并更新主GPU上的模型参数。由于模型参数仅在主GPU上更新,而其他从属GPU此时并不是同步更新的,所以需要将更新后的模型参数复制到剩余的从属 GPU 中,以此来实现并行。
DataParallel会将定义的网络模型参数默认放在GPU 0上,所以dataparallel实质是可以看做把训练参数从GPU拷贝到其他的GPU同时训练,这样会导致内存和GPU使用率出现很严重的负载不均衡现象,即GPU 0的使用内存和使用率会大大超出其他显卡的使用内存,因为在这里GPU0作为master来进行梯度的汇总和模型的更新,再将计算任务下发给其他GPU,所以他的内存和使用率会比其他的高。
具体流程见下图:
官方多GPU下的forward和backward:
跟上述流程图稍微不一样,一个loss和Grad,
上图清晰的表达了 torch.nn.DataParallel 的计算过程。
将 inputs 从主 GPU 分发到所有 GPU 上
将 model 从主 GPU 分发到所有 GPU 上
每个 GPU 分别独立进行前向传播,得到 outputs
将每个 GPU 的 outputs 发回主 GPU
在主 GPU 上,通过 loss function 计算出 loss,对 loss function 求导,求出损失梯度
计算得到 |
| Markdown | [](https://www.csdn.net/)
- [博客](https://blog.csdn.net/)
- [下载](https://download.csdn.net/)
- [社区](https://devpress.csdn.net/)
- [![]()GitCode](https://link.csdn.net/?target=https%3A%2F%2Fgitcode.com%3Futm_source%3Dcsdn_toolbar)
- [![]()GPU算力 ![]()](https://ai.csdn.net/)
- [更多]()
[会议](https://www.bagevent.com/event/9117243 "会议") [学习](https://edu.csdn.net/?utm_source=zhuzhantoolbar "高质量课程·大会云会员") [![]()InsCode](https://inscode.net/?utm_source=csdn_blog_top_bar "InsCode")
搜索
AI 搜索
[登录]()
登录后您可以:
- 复制代码和一键运行
- 与博主大V深度互动
- 解锁海量精选资源
- 获取前沿技术资讯
[立即登录]()
[新客开通会员 立减60](https://mall.csdn.net/vip?utm_source=dl_hover)
[会员·新人礼包 ![]()](https://mall.csdn.net/vip?utm_source=260309_vip_toolbarhyzx_hy)
[消息](https://i.csdn.net/#/msg/index)
[创作中心](https://mp.csdn.net/ "创作中心")
[创作](https://mp.csdn.net/edit)
[](https://mp.csdn.net/edit)  
# Pytorch 分布式训练(DP/DDP)
原创 [](https://mall.csdn.net/vip) 已于 2023-01-14 15:04:29 修改 · 3\.8w 阅读
·   130
· [  550]()
文章标签:
[\#pytorch](https://so.csdn.net/so/search/s.do?q=pytorch&t=all&o=vip&s=&l=&f=&viparticle=&from_tracking_code=tag_word&from_code=app_blog_art) [\#分布式](https://so.csdn.net/so/search/s.do?q=%E5%88%86%E5%B8%83%E5%BC%8F&t=all&o=vip&s=&l=&f=&viparticle=&from_tracking_code=tag_word&from_code=app_blog_art) [\#深度学习](https://so.csdn.net/so/search/s.do?q=%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0&t=all&o=vip&s=&l=&f=&viparticle=&from_tracking_code=tag_word&from_code=app_blog_art)
于 2021-12-23 14:35:50 首次发布
本文详细介绍PyTorch中DataParallel和DistributedDataParallel的使用方法,包括模型并行、数据并行的概念,多卡训练的实现细节,分布式训练的流程,以及模型评估和保存的相关技巧。
参考(需要看):
0、[实操教程 \| GPU多卡并行训练总结(以pytorch为例)](https://mp.weixin.qq.com/s/IdVe9gy8xRyhuWCyanidmw "实操教程 | GPU多卡并行训练总结(以pytorch为例)")
1、[PyTorch 源码解读之 DP & DDP:模型并行和分布式训练解析 - 知乎](https://zhuanlan.zhihu.com/p/343951042?utm_medium=social&utm_oi=643096634247090176 "PyTorch 源码解读之 DP & DDP:模型并行和分布式训练解析 - 知乎")
2、[pytorch中分布式训练DP、DDP原理 - 知乎](https://zhuanlan.zhihu.com/p/572454730 "pytorch中分布式训练DP、DDP原理 - 知乎")
3、[pytorch中多卡训练\_ytusdc的博客-CSDN博客\_pytorch多卡训练](https://blog.csdn.net/ytusdc/article/details/119890946 "pytorch中多卡训练_ytusdc的博客-CSDN博客_pytorch多卡训练")
4、github代码机械:<https://github.com/ytusdc/pytorch-distributed>
5、[PyTorch 分布式数据并行入门\_w3cschool](https://www.w3cschool.cn/pytorch/pytorch-hv9o3bsy.html "PyTorch 分布式数据并行入门_w3cschool")
6、[Pytorch一机多卡分布式并行训练及混合精度训练\_David's Tweet-CSDN博客\_pytorch混合精度训练](https://blog.csdn.net/qq_23981335/article/details/118678541 "Pytorch一机多卡分布式并行训练及混合精度训练_David's Tweet-CSDN博客_pytorch混合精度训练")
7、[深度学习分布式训练实战(一)\_小肥柴不是小废柴的博客-CSDN博客\_分布式深度学习](https://blog.csdn.net/xs11222211/article/details/82931120#commentBox "深度学习分布式训练实战(一)_小肥柴不是小废柴的博客-CSDN博客_分布式深度学习")
8、[如何理解深度学习分布式训练中的large batch size与learning rate的关系?-51CTO.COM](https://www.51cto.com/article/555389.html "如何理解深度学习分布式训练中的large batch size与learning rate的关系?-51CTO.COM")
9、[Broadcast,Scatter,Gather,Reduce,All-reduce分别是什么?\_aiwanghuan5017的博客-CSDN博客](https://blog.csdn.net/aiwanghuan5017/article/details/102147821 "Broadcast,Scatter,Gather,Reduce,All-reduce分别是什么?_aiwanghuan5017的博客-CSDN博客")
10、[Ring AllReduce简介 - 墨天轮](https://www.modb.pro/db/434006 "Ring AllReduce简介 - 墨天轮")
11、[PyTorch分布式官方文档](https://pytorch.org/docs/stable/distributed.html "PyTorch分布式官方文档")
12、[官方文档写PyTorch分布式程序](https://pytorch.org/tutorials/intermediate/dist_tuto.html "官方文档写PyTorch分布式程序")
## 1、分布式训练:模型并行和数据并行
分布式训练根据并行策略的不同,可以分为模型并行和数据并行。
- 模型并行
模型并行主要应用于模型相比显存来说更大,一块 GPU 无法加载的场景,通过把模型切割为几个部分,分别加载到不同的 GPU 上,来进行训练
- 数据并行
这个是日常会应用的比较多的情况。即每个 GPU 复制一份模型,将一批样本分为多份分发到各个GPU模型并行计算。因为求导以及加和都是线性的,数据并行在数学上也有效。采用数据并行相当于加大了batch\_size,得到更准确的梯度或者加速训练。
模型并行不是这里的讨论重点
常用的 API 有两个:
- torch.nn.DataParallel(**DP**)
- torch.nn.DistributedDataParallel(**DDP**)
DP 相比 DDP 使用起来更友好(代码少),但是 DDP 支持多机多卡,训练速度更快,而且负载相对要均衡一些。所以优先选用 DDP 吧。
### 1\.1、数据并行
数据并行的操作要求我们将数据划分成多份,然后发送给多个 GPU 进行并行的计算。
注意:多卡训练要考虑通信开销的,是个trade off的过程,不见得四块卡一定比两块卡快多少,可能是训练到四块卡的时候通信开销已经占了大头
下面是一个简单的示例。要实现数据并行,第一个方法是采用 `nn.parallel` 中的几个函数,分别实现的功能如下所示:
- 复制(Replicate):将模型拷贝到多个 GPU 上;
- 分发(Scatter):将输入数据根据其第一个维度(通常就是 batch 大小)划分多份,并传送到多个 GPU 上;
- 收集(Gather):从多个 GPU 上传送回来的数据,再次连接回一起;
- 并行的应用(parallel\_apply):将第三步得到的分布式的输入数据应用到第一步中拷贝的多个模型上。
实现代码如下
```
# Replicate module to devices in device_ids replicas = nn.parallel.replicate(module, device_ids) # Distribute input to devices in device_ids inputs = nn.parallel.scatter(input, device_ids) # Apply the models to corresponding inputs outputs = nn.parallel.parallel_apply(replicas, inputs) # Gather result from all devices to output_device result = nn.parallel.gather(outputs, output_device)AI写代码 python
```
PyTorch也提供了简单的函数 **torch.nn.DataParallel(module, device\_ids=None, output\_device=None, dim=0)**,只用几行代码可实现简单高效的并行GPU计算。通过device\_ids参数可以指定在哪些GPU上进行优化,output\_device指定输出到哪个GPU上
```
new_net= nn.DataParallel(net, device_ids=[0, 1]) output= new_net(input)AI写代码 python
```
### 1\.2、并行数据加载
流行的深度学习框架(例如Pytorch和Tensorflow)为分布式培训提供内置支持。从广义上讲,从磁盘读取输入数据开始,加载数据涉及四个步骤:
1. 将数据从磁盘加载到主机
2. 将数据从可分页内存传输到主机上的固定内存。请参阅[此](https://www.telesens.co/2019/02/16/efficient-data-transfer-from-paged-memory-to-gpu-using-multi-threading/ "此")有关分页和固定的内存更多信息。
3. 将数据从固定内存传输到GPU
4. 在GPU上向前和向后传递
`PyTorch `中的 `Dataloader `提供使用多个进程(通过将 `num_workers`\> 0 设置)从磁盘加载数据以及将多页数据从可分页内存到固定内存的能力(通过设置 `pin_memory = True`)。
一般的,对于大批量的数据,若仅有一个线程用于加载数据,则数据加载时间占主导地位,这意味着无论我们如何加快数据处理速度,性能都会受到数据加载时间的限制。现在,设置`num_workers = 4 `以及 `pin_memory = True`。这样,可以使用多个进程从磁盘读取不重叠的数据,并启动生产者-消费者线程以将这些进程读取的数据从可分页的内存转移到固定的内存。

多个进程能够更快地加载数据,并且当数据处理时间足够长时,流水线数据加载几乎可以完全隐藏数据加载延迟。这是因为在处理当前批次的同时,将从磁盘读取下一个批次的数据,并将其传输到固定内存。如果处理当前批次的时间足够长,则下一个批次的数据将立即可用。这个想法需要为num\_workers 参数设置适当的值。设置此参数,以使从磁盘读取批处理数据的速度比GPU处理当前批处理的速度更快(但不能更高,因为这只会浪费多个进程使用的系统资源)。
请注意,到目前为止,我们仅解决了从磁盘加载数据以及从可分页到固定内存的数据传输问题。从固定内存到GPU的数据传输(`tensor.cuda()`)也可以使用CUDA流进行流水线处理。
现在将使用GPU网络检查数据并行处理。基本思想是,网络中的每个GPU使用模型的本地副本对一批数据进行正向和反向传播。反向传播期间计算出的梯度将发送到服务器,该服务器运行reduce归约操作以计算平均梯度。然后将平均梯度结果发送回GPU,GPU使用SGD更新模型参数。使用数据并行性和有效的网络通信软件库(例如NCCL),可以实现使训练时间几乎线性减少。
## 2、数据并行 DataParallel
PyTorch 中实现数据并行的操作可以通过使用 `torch.nn.DataParallel`
### `2.1 并行处理机制`
DataParallel系统通过将整个小型批处理加载到主线程上,然后将子小型批处理分散到整个GPU网络中来工作。
**详细流程:**
**forward:**是将输入一个 batch 的数据均分成多份,分别送到对应的 GPU 进行计算。与 Module 相关的所有数据也都会以浅复制的方式复制多份。每个 GPU 在单独的线程上将针对各自的输入数据独立并行地进行 forward 计算。
**backward:**在主GPU上收集网络输出,并通过将网络输出与批次中每个元素的真实数据标签进行比较来计算损失函数值。接下来,损失值分散给各个GPU,每个GPU进行反向传播以计算梯度。最后,在主GPU上归约梯度、进行梯度下降,并更新主GPU上的模型参数。由于模型参数仅在主GPU上更新,而其他从属GPU此时并不是同步更新的,所以需要将更新后的模型参数复制到剩余的从属 GPU 中,以此来实现并行。
DataParallel会将定义的网络模型参数默认放在GPU 0上,所以dataparallel实质是可以看做把训练参数从GPU拷贝到其他的GPU同时训练,这样会导致内存和GPU使用率出现很严重的负载不均衡现象,即GPU 0的使用内存和使用率会大大超出其他显卡的使用内存,因为在这里GPU0作为master来进行梯度的汇总和模型的更新,再将计算任务下发给其他GPU,所以他的内存和使用率会比其他的高。
具体流程见下图:

**官方多GPU下的forward和backward:**
**跟上述流程图稍微不一样,一个loss和Grad,**

上图清晰的表达了 torch.nn.DataParallel 的计算过程。
- 将 inputs 从主 GPU 分发到所有 GPU 上
- 将 model 从主 GPU 分发到所有 GPU 上
- 每个 GPU 分别独立进行前向传播,得到 outputs
- 将每个 GPU 的 outputs 发回主 GPU
- 在主 GPU 上,通过 loss function 计算出 loss,对 loss function 求导,求出损失梯度
- 计算得到
[ 最低0.47元/天 解锁文章 ]()

确定要放弃本次机会?
福利倒计时
*:* *:*
 立减 ¥
普通VIP年卡可用
[立即使用](https://mall.csdn.net/vip)
[ ytusdc](https://blog.csdn.net/ytusdc)
[关注]() [关注]()
- [   130]()
点赞
- [ ]()
踩
- [   550]()
收藏
觉得还不错? 一键收藏 
- [ 13](https://blog.csdn.net/ytusdc/article/details/122091284#commentBox)
评论
- [ 分享]()
[复制链接]()
[分享到 QQ]()
[分享到新浪微博]()
扫一扫
- []()
[ 举报]()
[ 举报]()
[专栏目录]()
[*PyTorch* *分布式**训练* *(**DP*/*DDP*/torchrun/多机多卡*)* <笔记总结>](https://xylu926.blog.csdn.net/article/details/125529645)
[科研学习笔记!](https://blog.csdn.net/xiangyong58)
06-29  4103
[*PyTorch* *分布式**训练*问题总结: *(**DP*/*DDP*/torchrun/多机多卡*)*](https://xylu926.blog.csdn.net/article/details/125529645)
[\[AI算法\]\[*Pytorch*\]:*分布式**训练*](https://blog.csdn.net/qq_41897558/article/details/120948436)
[Bin\_Dut的博客](https://blog.csdn.net/qq_41897558)
10-25  1715
[1\. 数据并行*训练* *PyTorch* 为数据并行*训练*提供了多种选项。对于从简单到复杂,从原型到量产逐渐增长的应用,共同的发展轨迹是: 使用单机*训练*,如果数据和模型可以放在一个 GPU 中,并且*训练*速度不是问题。 使用单机多 GPU DataParallel,如果服务器上有多个 GPU,并且您希望以最少的代码更改来加速*训练*。 使用单机多 GPU DistributedDataParallel,如果您想进一步加快*训练*速度并愿意编写更多代码来设置它。 如果应用程序需要跨机器边界扩展,请使用多机Distribute](https://blog.csdn.net/qq_41897558/article/details/120948436)
13 条评论 您还未登录,请先 登录 后发表或查看评论
[*Pytorch**分布式**训练**(**DDP**)*\_*pytorch* *ddp*](https://blog.csdn.net/iiisChuan/article/details/147223140)
3-9
[1、模型并行方式:如果模型特别大,GPU显存不够,无法将一个显存放在GPU上,需要把网络的不同模块放在不同GPU上,这样可以*训练*比较大的网络。 2、数据并行方式:将整个模型放在一块GPU里,再复制到每一块GPU上,同时进行正向传播和反向误差传播。相当于加大了batch\_size。 *Pytorch*中使用*DDP* *DDP*的官方最佳实践是,每一张卡](https://blog.csdn.net/iiisChuan/article/details/147223140)
[*pytorch* *分布式**训练*\_*pytorch**分布式**训练*](https://blog.csdn.net/m0_45447650/article/details/135215200)
2-25
[ImageNet training in *PyTorch*:比较完整的使用实例,但是仅有代码,缺少详细说明;*(*apex也提供了一个类似的*训练*用例Mixed Precision ImageNet Training in *PyTorch**)* *(*advanced*)* *PyTorch* 1.0 Distributed Trainer with Amazon AWS:如何在亚马逊云上进行*分布式**训练*,但是估计很多人用不到。 这篇教程将通过一个MNISI例子讲述如何...](https://blog.csdn.net/m0_45447650/article/details/135215200)
[*Pytorch* DistributedDataParallel 多卡*训练*](https://blog.csdn.net/a40850273/article/details/111829836)
[健康工作每一天](https://blog.csdn.net/a40850273)
12-28  1万+
[*pytorch* 多卡GPU*训练* 基础知识 常用方法 torch.cuda.is\_available*(**)*:判断 GPU 是否可用 torch.cuda.device\_count*(**)*:计算当前可见可用的 GPU 数 torch.cuda.get\_device\_name*(**)*:获取 GPU 型号,如Tesla K80 torch.cuda.manual\_seed*(**)*:为当前 GPU 设置随机种子 torch.cuda.manual\_seed\_all*(**)*:为所有可见可用 GPU 设置随机种子 tor.](https://blog.csdn.net/a40850273/article/details/111829836)
[图解*分布式**训练*(二)—— nn.DataParallel 篇:*PyTorch* 单机多卡*训练*核心解析 最新发布](https://blog.csdn.net/ppbk_/article/details/156716694)
[ppbk\_的博客](https://blog.csdn.net/ppbk_)
01-26  669
[是 *PyTorch* 内置的单机多卡数据并行工具将完整模型拷贝到每一块参与*训练*的 GPU;将一个批次(batch)的数据均匀拆分到多个 GPU;每个 GPU 独立完成前向(FWD)和反向(BWD)计算,得到各自的梯度;汇总所有 GPU 的梯度到主 GPU,更新模型参数;将更新后的参数广播到所有 GPU,保证参数同步。使用简单:仅需一行代码即可实现多卡并行;易于理解:数据并行逻辑直观,无需复杂的*分布式*配置;单机适配好:完美支持单机多卡场景,无需额外依赖。](https://blog.csdn.net/ppbk_/article/details/156716694)
[*pytorch* Distribute*分布式**训练*\_from torch.multiprocessing impor...](https://blog.csdn.net/TH_NUM/article/details/84314833)
2-13
[本文介绍了一个使用*PyTorch*实现的*分布式**深度学习*系统,包括数据生成、模型*训练*和参数同步的过程。系统采用两个进程,分别负责生成数据和运行RNN模型,通过*PyTorch*的DistributedDataParallel进行*分布式**训练*。 *PyTorch* 2.5一键部署 *PyTorch* 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算...](https://blog.csdn.net/TH_NUM/article/details/84314833)
[*PyTorch*实战*(*26*)*——*PyTorch**分布式**训练*\_*pytorch* 实战](https://blog.csdn.net/lovemy134611/article/details/150612800)
2-26
[*PyTorch*实战*(*26*)*——*PyTorch**分布式**训练* 0. 前言 1. 使用 *PyTorch* 进行*分布式**训练* 1.1 以常规方式*训练*模型 1.2 *分布式**训练*模型 2. GPU *分布式**训练* 小结 系列链接 0. 前言 在将预*训练*的机器学习模型投入生产环境之前,模型*训练*是不可或缺的关键环节。随着*深度学习*的发展,大模型往往具有数百万乃至数十亿参数。使用反向...](https://blog.csdn.net/lovemy134611/article/details/150612800)
[*分布式**训练* — 理论基础](https://blog.csdn.net/love1005lin/article/details/116309147)
[love1005lin的博客](https://blog.csdn.net/love1005lin)
05-01  2531
[起初为调用大规模的模型*训练*,单卡GPU是不够使用的,需要借用服务器的多GPU使用。就会涉及到单机多卡,多机多卡的使用。在这里记录一下使用的方式和踩过的一些坑。文中若有不足,请多多指正。 由于*分布式*的内容较多,笔者准备分几篇来讲一次下*深度学习*的*分布式**训练*,*深度学习*的框架使用的是*Pytorch*框架。 ----1.*分布式**训练*的理论基础 ----2.单机多卡的使用 ----3.多机多卡的使用 *分布式**训练*的需求和重要性不需要多说,最近新提出的预*训练*模型,普通的16G的显存已经不足以支撑*深度学习*模型*训练*的要求了,这时候](https://blog.csdn.net/love1005lin/article/details/116309147)
[*pytorch**分布式*系列3——*分布式**训练*时,torch.utils.data.distributed.DistributedSampler做了什么?](https://blog.csdn.net/searobbers_duck/article/details/115299691)
[searobbers\_duck的博客](https://blog.csdn.net/searobbers_duck)
03-29  1万+
[*分布式**训练*时,torch.utils.data.distributed.DistributedSampler做了什么? 试验用到的code import os import sys import torch import torch.nn as nn import torch.distributed as dist import torchvision from torch.utils.data import Dataset, DataLoader import numpy as np class](https://blog.csdn.net/searobbers_duck/article/details/115299691)
[*PyTorch* *分布式**训练*底层原理与 *DDP* 实战指南\_*pytorch* *ddp*](https://blog.csdn.net/deephub/article/details/155076809)
2-19
[*分布式*数据并行 *(**DDP**)* 工作流 *PyTorch* 的 DistributedDataParallel 运行项目并下载源码 1 *(**DDP**)* 是实现数据并行的核心模块,基于 c10d 运行项目并下载源码 1 的ProcessGroup进行通信,每个进程*(*Process*)*通常控制一个 GPU 并持有一个模型副本。 *DDP* 的标准执行流程如下: ...](https://blog.csdn.net/deephub/article/details/155076809)
[「新生手册」:*PyTorch**分布式**训练*](https://devpress.csdn.net/v1/article/detail/115451450)
[zandaoguang的博客](https://blog.csdn.net/zandaoguang)
04-05  1058
[点击上方“视学算法”,选择加"星标"或“置顶”重磅干货,第一时间送达作者丨花花@知乎(已授权)来源丨https://zhuanlan.zhihu.com/p/3604055...](https://devpress.csdn.net/v1/article/detail/115451450)
[*PyTorch**分布式**训练* 热门推荐](https://blog.csdn.net/u010557442/article/details/79431520)
[苦逼Sure的水逼生涯](https://blog.csdn.net/u010557442)
03-03  3万+
[概览 *PyTorch* 是一个 Python 优先的*深度学习*框架,能够在强大的 GPU 加速基础上实现张量和动态神经网络。*PyTorch*的一大优势就是它的动态图计算特性。 License :MIT License 官网:http://*pytorch*.org/ GitHub:https://github.com/*pytorch*/*pytorch* *Pytorch* 是从Facebook孵化出来的,...](https://blog.csdn.net/u010557442/article/details/79431520)
[*PyTorch**分布式**训练*深度指南](https://blog.csdn.net/zzywxc787/article/details/149838121)
[zzywxc787的博客](https://blog.csdn.net/zzywxc787)
08-01  913
[《*PyTorch**分布式**训练*深度指南》摘要:本文系统介绍*PyTorch**分布式**训练*技术体系,涵盖数据并行*(**DDP**)*、模型并行*(*包括Tensor和Pipeline并行*)*等核心策略,详细解析混合精度*训练**(*AMP*)*、梯度聚合优化等关键实现。通过ResNet-152实战案例展示多GPU集群配置与性能调优方法,包括通信重叠、梯度分桶等优化技巧。特别探讨弹性*训练*容错机制及3D并行等前沿技术,提供从单机多卡到大规模*分布式**训练*的全套解决方案,帮助开发者实现线性加速比。](https://blog.csdn.net/zzywxc787/article/details/149838121)
[*PyTorch*数据并行(*DP*/*DDP*)浅析](https://blog.csdn.net/Miha_Singh/article/details/135399262)
[Milkha的博客](https://blog.csdn.net/Miha_Singh)
01-05  2453
[带你一键运行数据并行(*DP*/*DDP*)代码](https://blog.csdn.net/Miha_Singh/article/details/135399262)
[*pytorch* *分布式**训练*](https://devpress.csdn.net/v1/article/detail/135215200)
[Billie使劲学的博客](https://blog.csdn.net/m0_45447650)
12-26  4099
[神经网络*训练*加速的最简单方法是使用GPU,对弈神经网络中常规操作(矩阵乘法和加法)GPU运算速度要倍超于CPU。随着模型或数据集越来越大,一个GPU很快就会变得不足。例如,BERT和GPT-2等大型语言模型是在数百个GPU上*训练*的。对于多GPU*训练*,需要一种在不同GPU之间对模型和数据进行切分和调度的方法。*PyTorch*是非常流行的*深度学习*框架,它在主流框架中对于灵活性和易用性的平衡最好。和。DataParallel更易于使用(只需简单包装单GPU模型)。](https://devpress.csdn.net/v1/article/detail/135215200)
[11、*PyTorch* *分布式**训练*](https://devpress.csdn.net/v1/article/detail/129494981)
[Man](https://blog.csdn.net/mzpmzk)
03-13  1764
[*分布式*数据并行*(*distributed data parallel*)*,是通过多进程实现的。](https://devpress.csdn.net/v1/article/detail/129494981)
[*分布式**训练*:(*Pytorch*)](https://devpress.csdn.net/v1/article/detail/142305727)
[qq\_55794606的博客](https://blog.csdn.net/qq_55794606)
09-16  2487
[数据加载:使用多个进程来并行加载和预处理数据,通过流水线处理减少数据加载的延迟。数据传输:利用 CUDA 流优化从固定内存到 GPU 的数据传输。数据并行性:使用数据并行和 NCCL 等通信库实现高效的梯度同步和模型参数更新,优化*训练*过程。这种方法结合了数据加载、数据传输和数据并行处理的优化,能够显著提升*深度学习*模型的*训练*效率和速度。dataset,num\_workers=4, \# 使用 4 个子进程加载数据pin\_memory=True \# 将数据转移到固定内存\# 模型*训练*代码\# ...](https://devpress.csdn.net/v1/article/detail/142305727)
[*pytorch*中的*分布式**训练*](https://devpress.csdn.net/v1/article/detail/125822812)
[Blankit1的博客](https://blog.csdn.net/Blankit1)
07-16  4394
[*pytorch**分布式**训练*](https://devpress.csdn.net/v1/article/detail/125822812)
[*Pytorch**分布式**训练*](https://blog.csdn.net/weixin_33722405/article/details/92950126)
[weixin\_33722405的博客](https://blog.csdn.net/weixin_33722405)
05-21  331
[https://www.jianshu.com/p/c614a205f33f 转载于:https://www.cnblogs.com/leebxo/p/10900547.html](https://blog.csdn.net/weixin_33722405/article/details/92950126)
[*Pytorch* *分布式**训练**DDP**(*torch.distributed*)*详解-原理-代码](https://blog.csdn.net/weixin_42503655/article/details/135537053)
[weixin\_42503655的博客](https://blog.csdn.net/weixin_42503655)
01-12  1万+
[*Pytorch* *分布式**训练*\-原理-代码](https://blog.csdn.net/weixin_42503655/article/details/135537053)
[*Pytorch* *分布式**训练* *(**DP*, *DDP**)*](https://blog.csdn.net/weixin_42437114/article/details/127590671)
[连理o的博客](https://blog.csdn.net/weixin_42437114)
10-30  1万+
[*pytorch*: *DP* and *DDP*](https://blog.csdn.net/weixin_42437114/article/details/127590671)
[“最全“*PyTorch**分布式**训练*教程来了!](https://devpress.csdn.net/v1/article/detail/109206804)
[刘钊的博客](https://blog.csdn.net/qq_39131062)
10-21  5466
[前言 本文对使用*pytorch*进行*分布式**训练*(单机多卡)的过程进行了详细的介绍,附加实际代码,希望可以给正在看的你提供帮助。本文分三个部分展开,分别是: 先验知识 使用过程框架 代码解析 若想学习*分布式*的部署,看完本文就足够了,但为了读者能了解更多细节,我在第一部分的每个模块都加了对应的官方文档的链接。 同时,我正在进行*PyTorch*官方文档的翻译工作,除了对其进行便于理解的翻译,还添加了我的解释。项目地址:https://github.com/liuzhaoo/*Pytorch*\-API-and-Tuto](https://devpress.csdn.net/v1/article/detail/109206804)
[*pytorch**分布式**训练*](https://devpress.csdn.net/v1/article/detail/125129604)
[xx\_xjm的博客](https://blog.csdn.net/xx_xjm)
06-05  7166
[*分布式**训练*](https://devpress.csdn.net/v1/article/detail/125129604)
[昇腾平台*PyTorch**分布式**训练*详解与*DDP*优化实践](https://wenku.csdn.net/doc/7j33j3ay81)
[本文围绕“昇腾*分布式**训练*”这一主题,深入剖析了从单机单卡到单机多卡的演进路径,并重点对比分析了*PyTorch*框架下的两种主流*分布式**训练*模式:Data Parallel(*DP*)与Distributed Data Parallel(*DDP*),同时结合华为...](https://wenku.csdn.net/doc/7j33j3ay81)
- [关于我们](https://www.csdn.net/company/index.html#about)
- [招贤纳士](https://www.csdn.net/company/index.html#recruit)
- [商务合作](https://fsc-p05.txscrm.com/T8PN8SFII7W)
- [寻求报道](https://marketing.csdn.net/questions/Q2202181748074189855)
-  400-660-0108
-  [kefu@csdn.net](mailto:webmaster@csdn.net)
-  [在线客服](https://csdn.s2.udesk.cn/im_client/?web_plugin_id=29181)
- 工作时间 8:30-22:00
- [公安备案号11010502030143](http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010502030143)
- [京ICP备19004658号](http://beian.miit.gov.cn/publish/query/indexFirst.action)
- [京网文〔2020〕1039-165号](https://csdnimg.cn/release/live_fe/culture_license.png)
- [经营性网站备案信息](https://csdnimg.cn/cdn/content-toolbar/csdn-ICP.png)
- [北京互联网违法和不良信息举报中心](http://www.bjjubao.org/)
- [家长监护](https://download.csdn.net/tutelage/home)
- [网络110报警服务](https://cyberpolice.mps.gov.cn/)
- [中国互联网举报中心](http://www.12377.cn/)
- [Chrome商店下载](https://chrome.google.com/webstore/detail/csdn%E5%BC%80%E5%8F%91%E8%80%85%E5%8A%A9%E6%89%8B/kfkdboecolemdjodhmhmcibjocfopejo?hl=zh-CN)
- [账号管理规范](https://blog.csdn.net/blogdevteam/article/details/126135357)
- [版权与免责声明](https://www.csdn.net/company/index.html#statement)
- [版权申诉](https://blog.csdn.net/blogdevteam/article/details/90369522)
- [出版物许可证](https://img-home.csdnimg.cn/images/20250103023206.png)
- [营业执照](https://img-home.csdnimg.cn/images/20250103023201.png)
- ©1999-2026北京创新乐知网络技术有限公司
[](https://blog.csdn.net/ytusdc)
[ytusdc](https://blog.csdn.net/ytusdc "ytusdc")
博客等级 
码龄16年
[216 原创](https://blog.csdn.net/ytusdc)
2738
点赞
1万+
收藏
648
粉丝
[关注]()
[私信](https://im.csdn.net/chat/ytusdc)
[](https://ai.csdn.net/workbench/wallet?utm_source=xtai_slb_bloglb)
### 热门文章
- [归一化 (Normalization)、标准化 (Standardization)和中心/零均值化 (Zero-centered)  186322](https://blog.csdn.net/ytusdc/article/details/128504272)
- [神经网络调参:loss 问题汇总(震荡/剧烈抖动,loss不收敛/不下降)  180264](https://blog.csdn.net/ytusdc/article/details/107738749)
- [Ubuntu20.04安装Nvidia显卡驱动教程  86174](https://blog.csdn.net/ytusdc/article/details/132403852)
- [网课自动暂停解决方法、挂课后台播放方法、解决继续教育自动暂停  81696](https://blog.csdn.net/ytusdc/article/details/133015019)
- [Conda命令 + 安装tensorflow  81244](https://blog.csdn.net/ytusdc/article/details/99699228)
### 分类专栏
- [ Docker](https://blog.csdn.net/ytusdc/category_12687381.html)
5篇
- [ Obsidian笔记软件](https://blog.csdn.net/ytusdc/category_12646341.html)
1篇
- [ C++—Face](https://blog.csdn.net/ytusdc/category_8765530.html)
14篇
- [ AI之路 - Face](https://blog.csdn.net/ytusdc/category_8571720.html)
71篇
- [ Ubuntu系统相关和命令](https://blog.csdn.net/ytusdc/category_7160642.html)
26篇
- [ 深度学习环境配置](https://blog.csdn.net/ytusdc/category_7170743.html)
30篇
- [ Deep Learning](https://blog.csdn.net/ytusdc/category_7192672.html)
33篇
- [ 机器学习算法](https://blog.csdn.net/ytusdc/category_7231615.html)
12篇
- [ Python](https://blog.csdn.net/ytusdc/category_7276713.html)
5篇
- [ C/C++/Java 调试](https://blog.csdn.net/ytusdc/category_7179046.html)
21篇
- [ 数学之美](https://blog.csdn.net/ytusdc/category_7185977.html)
2篇
- [ SVN配置](https://blog.csdn.net/ytusdc/category_7218527.html)
2篇
- [ CSDN技巧](https://blog.csdn.net/ytusdc/category_7178560.html)
1篇
- [ 机器视觉](https://blog.csdn.net/ytusdc/category_7300470.html)
13篇
- [ 目标检测](https://blog.csdn.net/ytusdc/category_7336308.html)
18篇
- [ 人工智能数据集](https://blog.csdn.net/ytusdc/category_7361174.html)
2篇
- [ CNN架构](https://blog.csdn.net/ytusdc/category_7372507.html)
1篇
- [ tensorflow](https://blog.csdn.net/ytusdc/category_7651925.html)
3篇
[展开全部 ]() [收起 ]()
上一篇:
[为什么在进行softmax之前需要对attention进行scaled(为什么除以 d\_k的平方根)](https://blog.csdn.net/ytusdc/article/details/121622205)
下一篇:
[pytorch GPU和CPU模型相互加载](https://blog.csdn.net/ytusdc/article/details/122137188)
### 最新文章
- [网盘拉新现在还能做吗? 起底网络拉新全流程](https://blog.csdn.net/ytusdc/article/details/154127043)
- [FreeFileSync的使用教程](https://blog.csdn.net/ytusdc/article/details/151399485)
- [Ubuntu22.04系统安装,Nvidia显卡驱动安装问题](https://blog.csdn.net/ytusdc/article/details/149746405)
[2025年3篇](https://blog.csdn.net/ytusdc?type=blog&year=2025&month=10)
[2024年31篇](https://blog.csdn.net/ytusdc?type=blog&year=2024&month=11)
[2023年24篇](https://blog.csdn.net/ytusdc?type=blog&year=2023&month=12)
[2022年24篇](https://blog.csdn.net/ytusdc?type=blog&year=2022&month=12)
[2021年17篇](https://blog.csdn.net/ytusdc?type=blog&year=2021&month=12)
[2020年23篇](https://blog.csdn.net/ytusdc?type=blog&year=2020&month=10)
[2019年52篇](https://blog.csdn.net/ytusdc?type=blog&year=2019&month=11)
[2018年45篇](https://blog.csdn.net/ytusdc?type=blog&year=2018&month=12)
[2017年69篇](https://blog.csdn.net/ytusdc?type=blog&year=2017&month=12)
### 目录
1. [1、分布式训练:模型并行和数据并行](https://blog.csdn.net/ytusdc/article/details/122091284#t0)
2. 1. [1\.1、数据并行](https://blog.csdn.net/ytusdc/article/details/122091284#t1)
2. [1\.2、并行数据加载](https://blog.csdn.net/ytusdc/article/details/122091284#t2)
3. [2、数据并行 DataParallel](https://blog.csdn.net/ytusdc/article/details/122091284#t3)
4. 1. [2\.1 并行处理机制](https://blog.csdn.net/ytusdc/article/details/122091284#t4)
展开全部 
收起 
### 目录
1. [1、分布式训练:模型并行和数据并行](https://blog.csdn.net/ytusdc/article/details/122091284#t0)
2. 1. [1\.1、数据并行](https://blog.csdn.net/ytusdc/article/details/122091284#t1)
2. [1\.2、并行数据加载](https://blog.csdn.net/ytusdc/article/details/122091284#t2)
3. [2、数据并行 DataParallel](https://blog.csdn.net/ytusdc/article/details/122091284#t3)
4. 1. [2\.1 并行处理机制](https://blog.csdn.net/ytusdc/article/details/122091284#t4)
展开全部 
收起 
上一篇:
[为什么在进行softmax之前需要对attention进行scaled(为什么除以 d\_k的平方根)](https://blog.csdn.net/ytusdc/article/details/121622205)
下一篇:
[pytorch GPU和CPU模型相互加载](https://blog.csdn.net/ytusdc/article/details/122137188)
### 分类专栏
- [ Docker](https://blog.csdn.net/ytusdc/category_12687381.html)
5篇
- [ Obsidian笔记软件](https://blog.csdn.net/ytusdc/category_12646341.html)
1篇
- [ C++—Face](https://blog.csdn.net/ytusdc/category_8765530.html)
14篇
- [ AI之路 - Face](https://blog.csdn.net/ytusdc/category_8571720.html)
71篇
- [ Ubuntu系统相关和命令](https://blog.csdn.net/ytusdc/category_7160642.html)
26篇
- [ 深度学习环境配置](https://blog.csdn.net/ytusdc/category_7170743.html)
30篇
- [ Deep Learning](https://blog.csdn.net/ytusdc/category_7192672.html)
33篇
- [ 机器学习算法](https://blog.csdn.net/ytusdc/category_7231615.html)
12篇
- [ Python](https://blog.csdn.net/ytusdc/category_7276713.html)
5篇
- [ C/C++/Java 调试](https://blog.csdn.net/ytusdc/category_7179046.html)
21篇
- [ 数学之美](https://blog.csdn.net/ytusdc/category_7185977.html)
2篇
- [ SVN配置](https://blog.csdn.net/ytusdc/category_7218527.html)
2篇
- [ CSDN技巧](https://blog.csdn.net/ytusdc/category_7178560.html)
1篇
- [ 机器视觉](https://blog.csdn.net/ytusdc/category_7300470.html)
13篇
- [ 目标检测](https://blog.csdn.net/ytusdc/category_7336308.html)
18篇
- [ 人工智能数据集](https://blog.csdn.net/ytusdc/category_7361174.html)
2篇
- [ CNN架构](https://blog.csdn.net/ytusdc/category_7372507.html)
1篇
- [ tensorflow](https://blog.csdn.net/ytusdc/category_7651925.html)
3篇
[展开全部 ]() [收起 ]()
登录后您可以享受以下权益:
- 免费复制代码
- 和博主大V互动
- 下载海量资源
- 发动态/写文章/加入社区
×
立即登录
评论 13

被折叠的 条评论 [为什么被折叠?](https://blogdev.blog.csdn.net/article/details/122245662) [到【灌水乐园】发言](https://bbs.csdn.net/forums/FreeZone)
[查看更多评论]()
添加红包
![]()
成就一亿技术人\!
领取后你会自动成为博主和红包主的粉丝 [规则](https://blogdev.blog.csdn.net/article/details/128932621)
[](https://blog.csdn.net/ytusdc/article/details/122091284)
hope\_wisdom
发出的红包
实付元
[使用余额支付]()
 点击重新获取
扫码支付
钱包余额 0

抵扣说明:
1\.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
[余额充值](https://i.csdn.net/#/wallet/balance/recharge)
![]()
确定取消
举报

选择你想要举报的内容(必选)
- 内容涉黄
- 政治相关
- 内容抄袭
- 涉嫌广告
- 内容侵权
- 侮辱谩骂
- 样式问题
- 其他
原文链接(必填)
请选择具体原因(必选)
- 包含不实信息
- 涉及个人隐私
请选择具体原因(必选)
- 侮辱谩骂
- 诽谤
请选择具体原因(必选)
- 搬家样式
- 博文样式
补充说明(选填)
取消
确定
[](https://ai.csdn.net/workbench/wallet?utm_source=xtai_slb_blogxf_ty) [ 点击体验 DeepSeekR1满血版](https://ai.csdn.net/chat?utm_source=cknow_pc_blogdetail&spm=1001.2101.3001.10583)
[ 下载APP  程序员都在用的中文IT技术交流社区 公众号  专业的中文 IT 技术社区,与千万技术人共成长 视频号  关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!]()
[ 客服]()
新手引导
[ 返回顶部]()
[]()



\-
还原
\+
1:1
还原 |
| Readable Markdown | 参考(需要看):
0、[实操教程 \| GPU多卡并行训练总结(以pytorch为例)](https://mp.weixin.qq.com/s/IdVe9gy8xRyhuWCyanidmw "实操教程 | GPU多卡并行训练总结(以pytorch为例)")
1、[PyTorch 源码解读之 DP & DDP:模型并行和分布式训练解析 - 知乎](https://zhuanlan.zhihu.com/p/343951042?utm_medium=social&utm_oi=643096634247090176 "PyTorch 源码解读之 DP & DDP:模型并行和分布式训练解析 - 知乎")
2、[pytorch中分布式训练DP、DDP原理 - 知乎](https://zhuanlan.zhihu.com/p/572454730 "pytorch中分布式训练DP、DDP原理 - 知乎")
3、[pytorch中多卡训练\_ytusdc的博客-CSDN博客\_pytorch多卡训练](https://blog.csdn.net/ytusdc/article/details/119890946 "pytorch中多卡训练_ytusdc的博客-CSDN博客_pytorch多卡训练")
4、github代码机械:<https://github.com/ytusdc/pytorch-distributed>
5、[PyTorch 分布式数据并行入门\_w3cschool](https://www.w3cschool.cn/pytorch/pytorch-hv9o3bsy.html "PyTorch 分布式数据并行入门_w3cschool")
6、[Pytorch一机多卡分布式并行训练及混合精度训练\_David's Tweet-CSDN博客\_pytorch混合精度训练](https://blog.csdn.net/qq_23981335/article/details/118678541 "Pytorch一机多卡分布式并行训练及混合精度训练_David's Tweet-CSDN博客_pytorch混合精度训练")
7、[深度学习分布式训练实战(一)\_小肥柴不是小废柴的博客-CSDN博客\_分布式深度学习](https://blog.csdn.net/xs11222211/article/details/82931120#commentBox "深度学习分布式训练实战(一)_小肥柴不是小废柴的博客-CSDN博客_分布式深度学习")
8、[如何理解深度学习分布式训练中的large batch size与learning rate的关系?-51CTO.COM](https://www.51cto.com/article/555389.html "如何理解深度学习分布式训练中的large batch size与learning rate的关系?-51CTO.COM")
9、[Broadcast,Scatter,Gather,Reduce,All-reduce分别是什么?\_aiwanghuan5017的博客-CSDN博客](https://blog.csdn.net/aiwanghuan5017/article/details/102147821 "Broadcast,Scatter,Gather,Reduce,All-reduce分别是什么?_aiwanghuan5017的博客-CSDN博客")
10、[Ring AllReduce简介 - 墨天轮](https://www.modb.pro/db/434006 "Ring AllReduce简介 - 墨天轮")
11、[PyTorch分布式官方文档](https://pytorch.org/docs/stable/distributed.html "PyTorch分布式官方文档")
12、[官方文档写PyTorch分布式程序](https://pytorch.org/tutorials/intermediate/dist_tuto.html "官方文档写PyTorch分布式程序")
## 1、分布式训练:模型并行和数据并行
分布式训练根据并行策略的不同,可以分为模型并行和数据并行。
- 模型并行
模型并行主要应用于模型相比显存来说更大,一块 GPU 无法加载的场景,通过把模型切割为几个部分,分别加载到不同的 GPU 上,来进行训练
- 数据并行
这个是日常会应用的比较多的情况。即每个 GPU 复制一份模型,将一批样本分为多份分发到各个GPU模型并行计算。因为求导以及加和都是线性的,数据并行在数学上也有效。采用数据并行相当于加大了batch\_size,得到更准确的梯度或者加速训练。
模型并行不是这里的讨论重点
常用的 API 有两个:
- torch.nn.DataParallel(**DP**)
- torch.nn.DistributedDataParallel(**DDP**)
DP 相比 DDP 使用起来更友好(代码少),但是 DDP 支持多机多卡,训练速度更快,而且负载相对要均衡一些。所以优先选用 DDP 吧。
### 1\.1、数据并行
数据并行的操作要求我们将数据划分成多份,然后发送给多个 GPU 进行并行的计算。
注意:多卡训练要考虑通信开销的,是个trade off的过程,不见得四块卡一定比两块卡快多少,可能是训练到四块卡的时候通信开销已经占了大头
下面是一个简单的示例。要实现数据并行,第一个方法是采用 `nn.parallel` 中的几个函数,分别实现的功能如下所示:
- 复制(Replicate):将模型拷贝到多个 GPU 上;
- 分发(Scatter):将输入数据根据其第一个维度(通常就是 batch 大小)划分多份,并传送到多个 GPU 上;
- 收集(Gather):从多个 GPU 上传送回来的数据,再次连接回一起;
- 并行的应用(parallel\_apply):将第三步得到的分布式的输入数据应用到第一步中拷贝的多个模型上。
实现代码如下
```
replicas = nn.parallel.replicate(module, device_ids) inputs = nn.parallel.scatter(input, device_ids) outputs = nn.parallel.parallel_apply(replicas, inputs) result = nn.parallel.gather(outputs, output_device)python
```
PyTorch也提供了简单的函数 **torch.nn.DataParallel(module, device\_ids=None, output\_device=None, dim=0)**,只用几行代码可实现简单高效的并行GPU计算。通过device\_ids参数可以指定在哪些GPU上进行优化,output\_device指定输出到哪个GPU上
```
new_net= nn.DataParallel(net, device_ids=[0, 1]) output= new_net(input)python
```
### 1\.2、并行数据加载
流行的深度学习框架(例如Pytorch和Tensorflow)为分布式培训提供内置支持。从广义上讲,从磁盘读取输入数据开始,加载数据涉及四个步骤:
1. 将数据从磁盘加载到主机
2. 将数据从可分页内存传输到主机上的固定内存。请参阅[此](https://www.telesens.co/2019/02/16/efficient-data-transfer-from-paged-memory-to-gpu-using-multi-threading/ "此")有关分页和固定的内存更多信息。
3. 将数据从固定内存传输到GPU
4. 在GPU上向前和向后传递
`PyTorch `中的 `Dataloader `提供使用多个进程(通过将 `num_workers`\> 0 设置)从磁盘加载数据以及将多页数据从可分页内存到固定内存的能力(通过设置 `pin_memory = True`)。
一般的,对于大批量的数据,若仅有一个线程用于加载数据,则数据加载时间占主导地位,这意味着无论我们如何加快数据处理速度,性能都会受到数据加载时间的限制。现在,设置`num_workers = 4 `以及 `pin_memory = True`。这样,可以使用多个进程从磁盘读取不重叠的数据,并启动生产者-消费者线程以将这些进程读取的数据从可分页的内存转移到固定的内存。

多个进程能够更快地加载数据,并且当数据处理时间足够长时,流水线数据加载几乎可以完全隐藏数据加载延迟。这是因为在处理当前批次的同时,将从磁盘读取下一个批次的数据,并将其传输到固定内存。如果处理当前批次的时间足够长,则下一个批次的数据将立即可用。这个想法需要为num\_workers 参数设置适当的值。设置此参数,以使从磁盘读取批处理数据的速度比GPU处理当前批处理的速度更快(但不能更高,因为这只会浪费多个进程使用的系统资源)。
请注意,到目前为止,我们仅解决了从磁盘加载数据以及从可分页到固定内存的数据传输问题。从固定内存到GPU的数据传输(`tensor.cuda()`)也可以使用CUDA流进行流水线处理。
现在将使用GPU网络检查数据并行处理。基本思想是,网络中的每个GPU使用模型的本地副本对一批数据进行正向和反向传播。反向传播期间计算出的梯度将发送到服务器,该服务器运行reduce归约操作以计算平均梯度。然后将平均梯度结果发送回GPU,GPU使用SGD更新模型参数。使用数据并行性和有效的网络通信软件库(例如NCCL),可以实现使训练时间几乎线性减少。
## 2、数据并行 DataParallel
PyTorch 中实现数据并行的操作可以通过使用 `torch.nn.DataParallel`
### `2.1 并行处理机制`
DataParallel系统通过将整个小型批处理加载到主线程上,然后将子小型批处理分散到整个GPU网络中来工作。
**详细流程:**
**forward:**是将输入一个 batch 的数据均分成多份,分别送到对应的 GPU 进行计算。与 Module 相关的所有数据也都会以浅复制的方式复制多份。每个 GPU 在单独的线程上将针对各自的输入数据独立并行地进行 forward 计算。
**backward:**在主GPU上收集网络输出,并通过将网络输出与批次中每个元素的真实数据标签进行比较来计算损失函数值。接下来,损失值分散给各个GPU,每个GPU进行反向传播以计算梯度。最后,在主GPU上归约梯度、进行梯度下降,并更新主GPU上的模型参数。由于模型参数仅在主GPU上更新,而其他从属GPU此时并不是同步更新的,所以需要将更新后的模型参数复制到剩余的从属 GPU 中,以此来实现并行。
DataParallel会将定义的网络模型参数默认放在GPU 0上,所以dataparallel实质是可以看做把训练参数从GPU拷贝到其他的GPU同时训练,这样会导致内存和GPU使用率出现很严重的负载不均衡现象,即GPU 0的使用内存和使用率会大大超出其他显卡的使用内存,因为在这里GPU0作为master来进行梯度的汇总和模型的更新,再将计算任务下发给其他GPU,所以他的内存和使用率会比其他的高。
具体流程见下图:

**官方多GPU下的forward和backward:**
**跟上述流程图稍微不一样,一个loss和Grad,**

上图清晰的表达了 torch.nn.DataParallel 的计算过程。
- 将 inputs 从主 GPU 分发到所有 GPU 上
- 将 model 从主 GPU 分发到所有 GPU 上
- 每个 GPU 分别独立进行前向传播,得到 outputs
- 将每个 GPU 的 outputs 发回主 GPU
- 在主 GPU 上,通过 loss function 计算出 loss,对 loss function 求导,求出损失梯度
- 计算得到 |
| Shard | 8 (laksa) |
| Root Hash | 14895566225899102208 |
| Unparsed URL | net,csdn!blog,/ytusdc/article/details/122091284 s443 |