pytorch训练过程中服务器内存逐渐增加至process killed
背景说明
之前写过一篇帖子是显存占用逐渐增加到爆,同样的代码,最近又出现一个问题:服务器的RAM在训练过程中,mem used这一项逐渐增加,直到进程被killed。原因还是代码中有一个memory bank,需要把深度模型提取到的特征全部保存下来,进一步分析处理。
解决过程
分析
看帖子其他人讲到使用memory_profiler来分析每行代码的内存使用情况。这个工具很好用,可以统计每行代码执行后使用内存增加/减少数目,帮助锁定内存泄漏位置。发现就是生成了高维tensor但是计算完没有释放掉内存,del、gc.collect这些一通操作还是不行
尝试方案1
搜索关键词:内存泄漏
首先怀疑是有两个dataloader的问题,看别人讲两个datasets长度不一样的,因为每次训练要源域取一个batch数据,目标域取一个batch数据,叭叭叭,就造成内存泄漏,改代码的方案为知乎看到的一个帖子,里面银色的太阳的回复。很不幸没解决。
尝试方案2
看到CSDN上一个帖子讲,实在没有办法的话,把tensor转化为ndarray,在numpy库上计算,但是我现在找不到这个帖子了(抱歉)。然后就试了一下,把torch.mul改成np.dot等等类似操作改一通,MEM used不涨了,每个进程的%MEM也不涨了,我以为问题已经解决了,还挺高效的。后来又发现:训练速度慢了3、4倍,从原来的2h到8h,简直接受不了,因为numpy实在cpu上运算?没有cuda加速,还得改
最终方案
在特征存入memory bank前加一个features.detach()操作,断了计算图,运算完内存就释放掉了