PyTorch 深度学习实战
方远
LINE China 数据科学家
10381 人已学习
新⼈⾸单¥59
登录后,你可以任选3讲全文学习
课程目录
已完结/共 32 讲
开篇词 (1讲)
PyTorch 深度学习实战
15
15
1.0x
00:00/00:00
登录|注册

16|分布式训练:如何加速你的模型训练?

你好,我是方远。
在之前的课程里,我们一起学习了深度学习必备的内容,包括构建网络、损失函数、优化方法等,这些环节掌握好了,我们就可以训练很多场景下的模型了。
但是有的时候,我们的模型比较大,或者训练数据比较多,训练起来就会比较慢,该怎么办呢?这时候牛气闪闪的分布式训练登场了,有了它,我们就可以极大地加速我们的训练过程。
这节课我就带你入门分布式训练,让你吃透分布式训练的工作原理,最后我还会结合一个实战项目,带你小试牛刀,让你在动手过程中加深对这部分内容的理解。

分布式训练原理

在具体介绍分布式训练之前,我们需要先简要了解一下为什么深度学习要使用 GPU。
在我们平时使用计算机的时候,程序都是将进程或者线程的数据资源放在内存中,然后在 CPU 进行计算。通常的程序中涉及到了大量的 if else 等分支逻辑操作,这也是 CPU 所擅长的计算方式。
而在深度学习中,模型的训练与计算过程则没有太多的分支,基本上都是矩阵或者向量的计算,而这种暴力又单纯的计算形式非常适合用 GPU 处理,GPU 的整个处理过程就是一个流式处理的过程。
但是再好的车子,一个缸的发动机也肯定比不过 12 个缸的,同理单单靠一个 GPU,速度肯定还是不够快,于是就有了多个 GPU 协同工作的办法,即分布式训练。分布式训练,顾名思义就是训练的过程是分布式的,重点就在于后面这两个问题:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了分布式训练在加速深度学习模型训练中的重要性,重点讨论了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-17
    14
  • 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-17
    8
  • 小门神
    老师,您好,请问利用pytorch对模型进行分布式训练后,在对模型进行推理时的处理和单机单卡有区别吗

    作者回复: 你好,感谢你的留言。没有区别^^

    2021-11-18
    5
  • 马克图布
    问题: 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-17
    1
  • 完美坚持
    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.html
    2022-08-08归属地:广东
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部