16|分布式训练:如何加速你的模型训练?
分布式训练原理
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了分布式训练在加速深度学习模型训练中的重要性,重点讨论了PyTorch中的DataParallel和DistributedDataParallel函数。文章首先解释了深度学习使用GPU的必要性以及单机单卡训练过程,接着详细介绍了单机多卡训练的方法,着重介绍了PyTorch中的DataParallel函数。随后简要讨论了多机多卡训练的基本原理和方法。文章还对DataParallel(DP)和DistributedDataParallel(DDP)进行了比较,指出DDP在多机多卡训练中的优势。在介绍DDP训练的具体流程时,文章提到了初始化进程组、模型并行化和创建分布式数据采样器等步骤。通过本文的阅读,读者可以了解到分布式训练的工作原理,以及在PyTorch中如何实现单机多卡训练和多机多卡训练。文章还提供了一个示例项目,展示了如何使用DDP进行分布式训练,并包含了如何在使用DDP时保存模型。文章内容丰富,适合需要加速模型训练的深度学习从业者阅读。
《PyTorch 深度学习实战》,新⼈⾸单¥59
全部留言(11)
- 最新
- 精选
- 马克图布问:在 `torch.distributed.init_process_group(backend=“nccl”)` 函数中,backend 参数可选哪些后端,它们分别有什么区别? 答:根据文档,可选后端有 `gloo`, `nccl` 和 `mpi`。区别如下。 1. GLOO 支持绝大部分 CPU 上对于 tensor 的 communication function,但在 GPU 上只支持 broadcast 以及 all_reduced 函数; 2. NCCL 支持大部分 GPU上对于 tensor 的 communication function,但不支持 CPU; 3. PyTorch 自带 NCCL 和 GLOO,但要使用 MPI 后端则需要在安装了 MPI 的 host 上从源码构建 PyTorch; 3. MPI 支持绝大部分 CPU 和 GPU 上的函数,但对于 CUDA 的支持必须是这个 host 上构建的 PyTorch 支持 CUDA 才可以。 关于使用哪个后端的经验法则: - 使用 NCCL 进行分布式GPU训练 - 使用 GLOO 进行分布式CPU训练 参考自 PyTorch 文档:https://pytorch.org/docs/stable/distributed.html
作者回复: ^^,一万个赞,厉害。
2021-11-1714 - hsiang271828你好,我看到官方的 ImageNet 的示例中299行有如下代码: # compute gradient and do SGD step optimizer.zero_grad() loss.backward() optimizer.step() 此处使用的是optimizer.zero_grad(),跟之前课程中使用的model.zero_grad()有些许不同。请问这里应该使用哪个
作者回复: 你好,hsiang271828,感谢你的留言。 如果1个优化器对应1个模型的时候(1个优化器可以对应多个模型)。optimizer.zero_grad()与model.zero_grad()是相同的。 如果是多个模型的时候,就要具体情况具体分析了。如果直接optimizer.zero_grad()的话,就会把所有模型的梯度清零。
2021-11-178 - 小门神老师,您好,请问利用pytorch对模型进行分布式训练后,在对模型进行推理时的处理和单机单卡有区别吗
作者回复: 你好,感谢你的留言。没有区别^^
2021-11-185 - 马克图布问题: train_sampler = torch.utils.data.distributed.DistributedSampler(train_dataset) data_loader = DataLoader(dataset, batch_size=batch_size, sampler=train_sampler) 在使用 DistributedSampler 时,DataLoader 中的 dataset 参数是否应该与 DistributedSampler 的 `train_dataset` 一致呀?
编辑回复: 已修改,刷新可见。
2021-11-171 - 完美坚持args 是一个模块吗?加载不了,我用的是python3 加载就说是 NameError: name 'basestring' is not defined
作者回复: 是argparse模块
2023-02-01归属地:山西 - Zeurd老师,使用gup的时候会报错,Expected all tensors to be on the same device, but found at least two devices, cpu and cuda:0! (when checking argument for argument mat1 in method wrapper_addmm)为什么会同时推到cup和gup呢,我输入的就是to(device)啊
作者回复: Zeurd,你好,这个错误是由于参与运算的两个或多个变量,有的在CPU上,有的在GPU上。 我们在模型训练时,模型、数据和loss必须都放到同一种设备上。 你提到说,都是使用的"to(device)",可以看下下面的代码: device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') mage = image.to(device) 是不是device的赋值有所不同呢? 可以参考下面的步骤来debug你的代码: 首先找到报错的行,看看计算时都用到哪些变量或者数据,然后使用.is_cuda这个属性去查看到底哪些是在GPU上,哪些是在CPU上,然后把它们统一都放在CUP,或者统一放在GPU上。
2022-07-25归属地:北京 - 方华Elton讨论:DP部分ASimpleNet定义: 源代码: class ASimpleNet(nn.Module): def __init__(self, layers=3): super(ASimpleNet, self).__init__() self.linears = nn.ModuleList([nn.Linear(3, 3, bias=False) for i in range(layers)]) def forward(self, x): print("forward batchsize is: {}".format(x.size()[0])) x = self.linears(x) x = torch.relu(x) return x 提示修改后: class ASimpleNet(nn.Module): def __init__(self, layers=3): super(ASimpleNet, self).__init__() self.linears = nn.ModuleList([nn.Linear(3, 3, bias=False) for i in range(layers)]) def forward(self, x): print("forward batchsize is : {}".format(x.size()[0])) for linear in self.linears: x = linear(x) x = torch.relu(x) return x 修改原因: 这个 NotImplementedError 的报错指出了问题所在:在 forward 方法中,尝试使用 self.linears(x) 对一个 ModuleList 直接进行调用。这是不被支持的,因为 ModuleList 不能像单个模块那样直接应用于输入数据。你需要遍历 ModuleList 中的每个模块,并逐个对输入数据 x 应用这些模块。 修正这一点的方法是在 forward 方法中遍历 self.linears 中的每个线性层(nn.Linear),并逐个应用它们。2023-12-20归属地:辽宁
- ifelse学习打卡2023-12-05归属地:浙江
- 完美坚持小试牛刀那一节看不懂2023-02-01归属地:山西
- John(易筋)过去,我们经常被问到:“我应该使用哪个后端?”。 # 1. 经验法则 * 使用 NCCL 后端进行分布式 GPU 训练 * 使用 Gloo 后端进行分布式 CPU 训练。 # 2. 具有 InfiniBand 互连的 GPU 主机 * 使用 NCCL,因为它是当前唯一支持 InfiniBand 和 GPUDirect 的后端。 # 3. 具有以太网互连的 GPU 主机 * 使用 NCCL,因为它目前提供了最好的分布式 GPU 训练性能,特别是对于多进程单节点或多节点分布式训练。 如果您在使用 NCCL 时遇到任何问题,请使用 Gloo 作为备用选项。 (请注意,对于 GPU,Gloo 目前的运行速度比 NCCL 慢。) # 4. 具有 InfiniBand 互连的 CPU 主机 * 如果您的 InfiniBand 启用了 IP over IB,请使用 Gloo,否则,请改用 MPI。 我们计划在即将发布的版本中添加对 Gloo 的 InfiniBand 支持。 # 5. 具有以太网互连的 CPU 主机 * 使用 Gloo,除非您有特定的理由使用 MPI。 官网: https://pytorch.org/docs/stable/distributed.html2022-08-08归属地:广东