炼丹经验贴|Deep Learning炼丹经验总结——减少对设备性能消耗的方法


减少深度学习模型训练过程对设备的损耗

      • 1、调低batchsize
      • 2、控制一个任务只加载一个dataloader
      • 3、控制数据增强策略
      • 4、控制shuffle的位置
      • 5、调整Linux分区
      • 6、控制多线程
      • 7、旧版本cudnn
      • 8、换电脑吧

【炼丹经验贴|Deep Learning炼丹经验总结——减少对设备性能消耗的方法】近期在拿paddlepaddle跑知识蒸馏,这一块遇上了很多因为硬件限制导致出问题的地方,查资料的时候发现在其他框架也有类似的问题(溢出、进程出问题等),因此在这里对目前收集到的解决方案做一下小结。
跑模型的时候很多人设备环境有限,公有GPU资源分配不上,多少求人不如求己,只能在自己电脑上部署深度学习环境,如果遇上了很多受设备限制无法跑的模型,可以参考这里对自己的代码或者环境做一下调整,或许会有帮助。
1、调低batchsize
batchsize的大小对设备的损耗是最直观的,每次计算的时候,总需要将一个batch内的数据全部投喂到模型中,让模型学习其中的特征,在这种情况下如果显卡算力有限,直接卡死了batchsize的上限。
毕竟不是谁家也有几百块显卡来跑大模型的,别人在几百块显卡上设置的batchsize,在自己的显卡上当然要对应调低一些。调低这个参数当然不是最优解,但是却是新手最需要优先考虑的方案。
2、控制一个任务只加载一个dataloader
这一块也是最近才发现的,最近经常遇上shm分区溢出,网上有人说是尽量只加载一个dataloader,一个dataloader在初始化成功的时候会默认持续占有一段存储空间,以便之后的取出数据,如果同时加载了trainloader和valloader,一些设备可能会承受不住。
这种堆砌着跑的方式,新手多少需要慎用,如果需要测试集的验证结果,建议新手先保存每一轮的权重文件,然后再设计代码单独对每轮的权重文件投喂测试集进行测试。
3、控制数据增强策略
数据增强策略现在在提升模型性能的时候很常用,但是需要注意的是数据增强的策略非常建议要慎用。比如在一些植物病虫害检测场景下,病虫害的病变部位很小,很依赖颜色来区分特征,如果使用了修改颜色的数据增强策略,或者使用了太大的随机遮挡,导致模型直接学习到错误的特征不说,还会白白浪费设备性能。
4、控制shuffle的位置
shuffle是很多框架自定义的dataloader自带的一个参数,这个参数很多人应该都知道它的必要性,如果不shuffle的话,会导致后来学习到的特征把前面的特征擦除掉。
所以,shuffle加是必须加的,但是每个dataloader在进行shuffle的时候,损耗也很大,如果设备性能有限,可以将分类任务的map文件写入到txt或者csv文件,然后写代码在文件内部对每行的内容进行shuffle,让dataloader逐行读取txt文件进行训练即可,可以让模型在训练的时候直接免去在map内部进行查找的过程。
5、调整Linux分区
shm分区溢出其实最简单的办法就是调大分区,但是如果是公有设备的话,这个分区大小动不了,所以也没辙。搞深度学习如果有自己Linux环境的话,那肯定要换自己Linux分区。
就是这一块再次叮嘱一下,搞深度学习滴,不懂Linux分区的话,不要人家说分多少就跟着分多少,有的分区经验是给新手用的,新手会跑跑命令就够了,所以一些分区设置会很小。那个分区有的分小了,shm分区出现问题是轻的,有的可能连显卡驱动都安不上。实在不会的话,使用Ubuntu一类有自带的默认分区工具,就别自定义了,目前测试发现用人家默认值都比一些人自定义的强。
6、控制多线程
还有建议说在dataloader加载数据的时候干脆不要开启多线程,是多线程导致的溢出,设置num_worker为0即可。
目前测试在paddle上确实有这个缘故,pytorch听说也有,但是paddle2.1多线程关闭反而会报错,很恶心,暂时不想调整这个bug,我在自己电脑上部署了环境。
7、旧版本cudnn
有一个帖子说是cudnn的7.6版本换7.6.5即可,这个没试过,有遇上的可以试试。
8、换电脑吧

    推荐阅读