两次深度debug经历,希望大家不要踩坑
共 1407字,需浏览 3分钟
·
2021-10-25 17:38
深度学习模型debug目前来看,还是一个难点问题。pytorch能够有这样的发展势头,容易debug应该是一个突出优点。本篇文章记录一下笔者使用tensorflow时两次debug的经历,希望能给大家带来一点启发。
预测为Nan
训练好的一个文本分类模型,本地测试一切正常,部署到tfserving后,预测一直为Nan。
这个模型是另一个小伙伴训练的,我负责工程部署。当时疫情,大家都窝在家里。
当时我的第一反应是,是不是tfserving有问题?可是查看log,打印出来的值也都正常,就是最后返回的时候没有log,传到后端那里就是Nan了。笔者当时刚接触tfserving,从log查找问题这条重要的线索就中断了。
没办法,面向搜索引擎debug吧,查了一圈,也没发现任何有效的信息。
这下真有点狗咬刺猬不知道从哪下嘴了。
没办法,使出最笨的debug办法,我从输出开始,逆序依次将每层输出作为模型输出,在tfserving上部署,查看是否为Nan,这项工作就比较耗时,我让小伙伴在家里,修改一次模型,就训练两个step,保存的checkpoint发给我,我部署在tfserving上,我就要看看,到底是哪一层造成的Nan。
经过一个下午的修改、训练、部署、测试,终于终于发现了问题的原因所在:
模型中使用了dynamic_rnn,tfserving并不支持这个算子!
坑爹啊!
loss为Nan
复现某个语义相似度论文。非常奇怪,有时loss会变成Nan,有时又没问题,可以成功复现论文的结果。
于是,先开始在网上查了一堆loss为Nan的资料,softmax时发生了除0,或者计算loss时数据溢出,这时比较常见的,我在这两个地方也做了加固,确保不会除0,当时也把代码走读了一遍,感觉到可能除0的地方,都加了episilon,事实证明,我还是有点大意了,暂且按下不表。
然后就是网上说的各种各样的解决方案,试,一个又一个的试,试到海枯石烂!
结果就是,木有用!
这时候,时间已经过去2天。我强迫自己冷静下来,想到了自己debug以来总结的最厉害的一条经验:
看似最诡异的bug,很可能来自最naive的错误!
那么,总结我查到的所有资料,除0是最常见的操作,那么,会不会某个地方还是可能会除0,只是我没发现?
于是,我又一行一行代码查看,突然,发现有个地方很诡异:两个矩阵相除,element_wise的矩阵相除,也就是说,只要底下矩阵中任意一个元素为0,就会发生除0错误!
我迅速在这个地方做了加固,代码终于可以顺畅正常的运行了!
总结
遇到困难的bug,一定不要放弃,在解决bug的过程中,往往能学到很多之前不熟悉的知识!
![](https://filescdn.proginn.com/26cde24ecdd4a31085d0eb7d145c8cd7/236e49dcad14a64d35018b8024b64f48.webp)
E N D
![](https://filescdn.proginn.com/126e69bca9e1445bd84f9809a6bf260b/217b5c7da8dd482275e3fa5fd79f3ea3.webp)
各位伙伴们好,詹帅本帅假期搭建了一个个人博客和小程序,汇集各种干货和资源,也方便大家阅读,感兴趣的小伙伴请移步小程序体验一下哦!(欢迎提建议)
推荐阅读
推荐阅读