知行编程网知行编程网  2022-06-07 13:00 知行编程网 隐藏边栏 |   抢沙发  48 
文章评分 0 次,平均分 0.0

Pytorch常见的坑汇总

来自 | 知乎

作者 | 郁振波

地址 | https://zhuanlan.zhihu.com/p/7792356

本文仅作学术分享,如有侵权,请联系删除

最近刚开始用pytorch不久,陆陆续续踩了不少坑,记录一下,个人感觉应该都是一些很容易遇到的一些坑,也在此比较感谢帮我排坑的小伙伴,持续更新,也祝愿自己遇到的坑越来越少。

首先作为tensorflow的骨灰级玩家+轻微强迫症患者,一路打怪升级,从0.6版本用到1.2,再用到1.10,经历了tensorfow数个版本更迭,这里不得不说一下tf.data.dataset+tfrecord使用起来效率远比dataloader高的多。
tensorflow有一个比较好用的队列机制,tf.inputproducer + tfrecord, 但是inputproducer有一个bug,就是无法对每个epoch单独shuffle,它只能整体shuffle,也就意味着我们无法进行正常的训练流程(train几个epoch,在validation上测一个epoch,最终选一个validation上的最好的结果,进行test)。后来我当时给官方提了一个issue,官方当时的回答是,这个bug目前无法解决,但是他们在即将到来的tf1.2版本中, 推出的新型数据处理API tf.contrib.data.dataset(tf1.3版本将其合并到了tf.data.dataset)可以完美解决这个bug,并且将于tf2.0摒弃tf.input_producer。然后tf1.2版本刚出来以后,我就立马升级并且开始tf.data.dataset踩坑,踩了大概2周多的坑,(这个新版的API其实功能并不是非常强大,有不少局限性,在此就不展开)。

——————————————————————————
好像扯远了,回归pytorch,首先让我比较尴尬的是pytorch并没有一套属于自己的数据结构以及数据读取算法,dataloader个人感觉其实就是类似于tf中的feed,并没有任何速度以及性能上的提升。
先总结一下遇到的坑:

1. 没有比较高效的数据存储,tensorflow有tfrecord, caffe有lmdb,cv.imread在网络训练过程中实属浪费时间。这里感谢一下小智大神 @智天成 。

解决方案:
当时看到了一个还不错的github链接,

https://github.com/Lyken17/Efficient-PyTorch

主要是讲如何使用lmdb,h5py,pth,lmdb,n5等数据存储方式皆可以。
个人的感受是,h5在数据调用上比较快,但是如果要使用多线程读写,就尽量不要使用h5,因为h5的多线程读写好像比较麻烦。

http://docs.h5py.org/en/stable/mpi.html

这里贴一下h5数据的读写代码(主要需要注意的是字符串的读写需要encode,decode,最好用create_dataset,直接写的话读的时候会报错):

])

2. gpu imbalance,这里感谢一下张航学长 @张航老生常谈的问题,第一个GPU显存占用多一点。

张航学长Hang Zhang (张航)提了一个开源的gpu balance的工具--PyTorch-Encoding。

使用方法还是比较便捷的,如下所示:
这里其实有2个注意点,第一,测试的时候需要手动将gpu合并,代码如下:

第二,当loss函数有多个组成的时候,比如 loss = loss1 + loss2 + loss3
那么需要把这三个loss写到一个class中,然后再forward里面将其加起来。

其次,我们还可以用另外一个函数distributedDataParallel来解决gpu imbalance的问题.

使用方法如下:(注:此方法好像无法和h5数据同时使用)


3.gpu利用率不高+gpu现存占用浪费

常用配置:
1主函数前面加:(这个会牺牲一点点现存提高模型精度)


2训练时,epoch前面加:(定期清空模型,效果感觉不明显)


3无用变量前面加:(同上,效果某些操作上还挺明显的)


4dataloader的长度_len_设置:(dataloader会间歇式出现卡顿,设置成这样会避免不少)


5dataloader的预加载设置:(会在模型训练的时候加载数据,提高一点点gpu利用率)


6网络设计很重要,外加不要初始化任何用不到的变量,因为pyroch的初始化和forward是分开的,他不会因为你不去使用,而不去初始化。

7最后放一张目前依旧困扰我的图片:
Pytorch常见的坑汇总
可以看到,每个epoch刚开始训练数据的时候,第一个iteration时间会占用的非常多,pytorch这里就做的很糟糕,并不是一个动态分配的过程,我也看到了一个看上去比较靠谱的解决方案,解决方案如下 @风车车:

在深度学习中喂饱gpu


https://zhuanlan.zhihu.com/p/77633542


但是我看了下代码,可能需要重构dataloader,看了评论好像还有问题,有点懒,目前还没有踩坑,准备后面有时间踩一下。
暂且更新到这里,后续遇到什么坑陆续补充,也欢迎大家给我补充,pytorch初学者小白一枚。

更个新;顺便吐槽一下上面的dali,局限性很大,比较trick的数据预处理很难搞定。

8 apex混合单精度模型

事实证明,apex并没有官网说的那么玄乎,只能减低显存,并不能提速(12G显存大概可以降低到8G左右,效果还挺明显的,但是,速度降低了大概1/3,好像有点得不偿失)。
编译之后提速也很有限,再此留个坑,有小伙伴能解决的可以私信我哈,如果可以解决我会仔细罗列一遍。。


<pre><p><br  /></p><pre data-darkmode-color="rgb(168, 168, 168)" data-style="padding-right: 0.5em; padding-left: 0.5em; max-width: 100%; background-color: rgb(255, 255, 255); color: rgb(62, 62, 62); letter-spacing: 0.544px; font-size: 15px; text-align: start; word-spacing: 2px; box-sizing: border-box !important; overflow-wrap: break-word !important;" class="js_darkmode__40" data-darkmode-bgcolor="rgb(36, 36, 36)" style="font-size: 16px;color: rgb(0, 0, 0);font-weight: 700;letter-spacing: 0.544px;text-align: left;word-spacing: 1px;background-color: rgb(255, 255, 255);"><pre data-darkmode-color="rgb(168, 168, 168)" data-style="padding-right: 0.5em; padding-left: 0.5em; max-width: 100%; background-color: rgb(255, 255, 255); color: rgb(62, 62, 62); letter-spacing: 0.544px; font-size: 15px; text-align: start; word-spacing: 2px; box-sizing: border-box !important; overflow-wrap: break-word !important;" class="js_darkmode__40" data-darkmode-bgcolor="rgb(36, 36, 36)"><pre style="letter-spacing: 0.544px;font-size: 16px;text-align: center;background-color: rgb(255, 255, 255);"><pre><p style="letter-spacing: 0.544px;white-space: normal;color: rgb(0, 0, 0);font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;widows: 1;line-height: 1.75em;"><strong><span style="letter-spacing: 0.5px;font-size: 14px;"><strong style="font-size: 16px;letter-spacing: 0.544px;"><span style="letter-spacing: 0.5px;">—</span></strong>完<strong style="font-size: 16px;letter-spacing: 0.544px;"><span style="letter-spacing: 0.5px;font-size: 14px;"><strong style="font-size: 16px;letter-spacing: 0.544px;"><span style="letter-spacing: 0.5px;">—</span></strong></span></strong></span></strong></p><section style="letter-spacing: 0.544px;white-space: normal;font-family: -apple-system-font, system-ui, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;widows: 1;"><section powered-by="xiumi.us"><section style="margin-top: 15px;margin-bottom: 25px;opacity: 0.8;"><section><section style="letter-spacing: 0.544px;"><section powered-by="xiumi.us"><section style="margin-top: 15px;margin-bottom: 25px;opacity: 0.8;"><section><p style="margin-bottom: 15px;padding-right: 0em;padding-left: 0em;color: rgb(127, 127, 127);font-size: 12px;font-family: sans-serif;line-height: 25.5938px;letter-spacing: 3px;"><span style="color: rgb(0, 0, 0);"><strong><span style="font-size: 16px;font-family: 微软雅黑;caret-color: red;">为您推荐</span></strong></span></p><p style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;">MIT校长评中美科技竞赛:胜利不是期盼对手的失利</p><p style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;"><span style="font-size: 14px;">GitHub重大更新:在线开发上线,是时候卸载IDE了</span></p><p style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;"><span style="font-size: 14px;">美国官宣117000名 IT 人失业,真是史无前例!</span><br  /></p><p style="margin-top: 5px;margin-bottom: 5px;padding-right: 0em;padding-left: 0em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;">数据分析入门常用的23个牛逼Pandas代码</p><section style="margin: 5px 8px;padding-right: 0em;padding-left: 0em;min-height: 1em;font-family: sans-serif;letter-spacing: 0px;opacity: 0.8;line-height: normal;">特朗普转推呼吁制裁微软,因微软、IBM、亚马逊先后停止向警方出售面部识别技术<br  /></section></section></section></section></section></section></section></section></section>
Pytorch常见的坑汇总

本篇文章来源于: 深度学习这件小事

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享