两次深度debug经历,希望大家不要踩坑

小詹学Python

共 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的过程中,往往能学到很多之前不熟悉的知识!

E N D


各位伙伴们好,詹帅本帅假期搭建了一个个人博客和小程序,汇集各种干货和资源,也方便大家阅读,感兴趣的小伙伴请移步小程序体验一下哦!(欢迎提建议)

推荐阅读


牛逼!Python常用数据类型的基本操作(长文系列第①篇)

牛逼!Python的判断、循环和各种表达式(长文系列第②篇)

牛逼!Python函数和文件操作(长文系列第③篇)

牛逼!Python错误、异常和模块(长文系列第④篇)


浏览 7
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报