Navigation

    Gpushare.com

    • Register
    • Login
    • Search
    • Popular
    • Categories
    • Recent
    • Tags

    如何加速pytorch训练?GPU利用率过低?

    机器学习
    4
    8
    1062
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • 189****7698
      189****7698 last edited by

      感谢恒源云热心可爱的琳琳酱诚邀(被迫营业😳 ),分享一篇我最近在知乎上写的一篇关于如何加速pytorch训练的文章。

      想必有时候大家在用云服务器炼丹的时候会遇到GPU利用率忽高忽低,一会0%一会100%。这其实就是对GPU资源的浪费,因为GPU在浪费很多时间在等CPU和内存加载数据进来。最主要是云服务器每时每刻都在烧money,难免不心疼。描述效果如下图:

      66ce2efa-8612-458c-8e02-3543feb79783-image.png

      那么如何解决???

      我分享一下我个人在平时用的比较多的方法:

      代码层面
      其实这个没有哪个方法最好,哪个方法最有效,都是要根据自己的硬件配置和实际程序运行情况制定最佳方案,比如说像上图这种情况,大概率就是数据预处理加载时间太长,CPU处理的速度没有跟上GPU,导致资源浪费。我认为以下几个方法可以起到一定加速的作用:

      一、DataLoader改进

      Dataloader参数设置

      091159d4-6213-41e7-9e73-ecc20fa47680-image.png

      根据自己的硬件情况,可以将num_workers调成2,4,8,16,并不是越大越快,我一般调成16。这个代码的意思是用多少个子进程加载数据;

      pin_memory=True,锁页内存,内存够用一定要加上。科普一下:主机中的内存,有两种存在方式,一是锁页,二是不锁页,锁页内存存放的内容在任何情况下都不会与主机的虚拟内存进行交换(注:虚拟内存就是硬盘),而不锁页内存在主机内存不足时,数据会存放在虚拟内存中。而显卡中的显存全部是锁页内存,设置为True时可以加快内存和显卡之前的数据交换;

      prefetch_factor=任意数字,默认=2。代表的含义是每个 worker 提前加载 的 sample 数量,可以适当调大,具体改调到多大合适还没做过实验,我觉得根据batch size=prefetch_factor*num_workers比较合理?;

      persistent_workers=True,看官方文档的意思就是默认Flase相当于所有数据都训练完这一轮之后(跑完一次epoch)worker会自动关闭,下个epoch需要重新打开并初始化worker,这会浪费一点时间。该参数可以控制每个epoch的第一个iteration(第一批batch)是否重新初始化worker,所以可以通过设置=True去除每个epoch第一个iteration多消耗的一点时间;

      注:prefetch_factor和persistent_workers这两个参数是pytorch1.7之后才有的,以前的版本没有,使用时需要注意。

      二、设置torch.backends.cudnn.benchmark = True
      设置torch.backends.cudnn.benchmark = True将会让程序在开始时花费一点额外时间,为整个网络的每个卷积层搜索最适合它的卷积实现算法,进而实现网络的加速。

      适用场景:网络结构固定(不是动态变化的),网络的输入形状(包括 batch size,图片大小,输入的通道)固定。反之,如果卷积层的设置一直变化,将会导致程序不停地做优化,反而会耗费更多的时间。

      三、使用梯度裁剪
      loss.backward()
      torch.nn.utils.clip_grad_norm_(model.parameters(), 20) # 在代码中加入这行实现梯度裁剪
      optimizer.step()

      四、在验证期间关闭梯度计算
      在验证期间关闭梯度计算,设置:torch.no_grad() 。

      五、改进torchvision默认的图片加载方式

      9feccd18-8b69-4d21-b64b-b4f1c44dc578-image.png

      可以发现默认的pillow是最慢的,建议使用pillow-simd加速或者turbojpeg(这个好像只能加速ubuntu系统)。因为我用的服务器是centos系统,我用pillow-simd替换原来的pillow,发现速度是提升了不少。

      $ pip uninstall pillow
      $ CC=“cc -mavx2” pip install -U --force-reinstall pillow-simd

      等待替换完成即可,源代码无须改动就可以直接运行。

      六、最强大的Nvidia加速技术DaLi
      以前都是cpu处理加载图片,这个技术就是把这个步骤放在gpu上进行,想想就知道速度有多快了。缺点是有点占显存。

      不过比较麻烦的是,DaLi只能进行一些较简单的crop,resize之类的操作,像RandAugment 或CTAugment这些比较复杂的图像增强则需要自行修改源代码实现。

      具体可看下这个项目GitHub - tanglang96/DataLoaders_DALI: PyTorch DataLoaders implemented with DALI for accelerating image preprocessing

      等下次实现了这个再发一篇demo分享给大家!!!
      附上我知乎的链接:pytorch如何加速

      183****8515 1 Reply Last reply Reply Quote 11
      • 189****7698
        189****7698 @Alice_恒源云 last edited by

        @alice_恒源云 谢谢客服小姐姐~

        1 Reply Last reply Reply Quote 0
        • 189****7698
          189****7698 @156****9186 last edited by

          @156-9186 后续可以关注哦

          1 Reply Last reply Reply Quote 0
          • 189****7698
            189****7698 @156****9186 last edited by

            This post is deleted!
            1 Reply Last reply Reply Quote 0
            • 156****9186
              156****9186 last edited by

              优秀👍
              期待更多优质分享

              189****7698 2 Replies Last reply Reply Quote 0
              • Alice_恒源云
                Alice_恒源云 last edited by

                发帖奖励100元已到账,请查收哦~

                3月社区发帖活动请戳:社区开春福利

                189****7698 1 Reply Last reply Reply Quote 1
                • 189****7698
                  189****7698 @183****8515 last edited by

                  @183-8515 哈哈哈,谢谢😊

                  1 Reply Last reply Reply Quote 0
                  • 183****8515
                    183****8515 @189****7698 last edited by

                    @189-7698 阅读量超100啦~恭喜恭喜🎉

                    189****7698 1 Reply Last reply Reply Quote 0
                    • First post
                      Last post