现象
在使用过程中我经常会发现一个现象就是,我的程序会卡住,如果观察显卡的显存,你会发现显存占用了,但是功耗下去了,程序是没有在运行的入下图所示
nvidia-smi指令显示的如下
然后发现程序一直卡在这里,一点反应都没有,我是比较懵逼的
之前在PaddleOCR GitHub给的例程中,我尝试跑ICDAR2015,一开始出现过这个现象,我就尝试将batch_size调小了,你会发现确实有效果的,我的1200次也跑完了,但是我更换到ICDAR2019-LSVT之后发现,就非常容易崩,我心态也崩了,我甚至将batch_size调到了2,但是他在比较长的一段时间之后发现还是崩了。
我意识到可能这是一个比较严重的问题,就在issues上面找答案,最终参考#218,发现和内存是有关系和问题的。
通过指令
gonome-system-monitor
可以看到如下界面
我的内存占用是21g,如果正常情况你会发现内存会慢慢增长然后到一个溢出的状态,然后内存会被释放,程序就一下不动了,这个应该就是内存溢出了吧,我也是第一次见到这种现象。
原因
参考#112和#218我得到的结果是,由于多线程的原因
如图这个函数的queue_size参数默认值是1000,也就是队列最多有1000数据,但是由于我们的GPU算力跟不上,旧的得不到释放,新的又往队列里面加,所以在累计之后会发现内存溢出。
解决办法
我个人的解决办法是有如下几点:
1.降低batch_size,在降低batch_size之后会十分有效地发现能暂时缓解这个问题
文件是在./configs/det/内(因为我在做检测),看你调用的是什么配置文件就是什么。
2.如上图FAQ所示修改那个函数的参数值(个人感觉那个FAQ已经删了,因为没找到),这个函数的路径在
./ppocr/data/reader_main.py内,第70行,需要修改queue_size参数,默认1000,我大概修改到150发现内存能稳定在22g左右
3.需要修改num_workers参数,在github上看到有老哥说,将这个参数改到1就不会出问题,但是训练速度会变慢,就个人而言,我发现是,修改这个参数无明显现象,有待考证。该参数路径为
./configs/det/的reader函数,也就是你的配置文件yml所指向的reader_yml(上图中有)
目前我的数据集为ICDAR2019-LVST,我大概划分了1/8为测试集来使用,在RTX2060上暂时稳定工作