问题描述:
使用apex对模型使用混合精度加速(O1),在几乎不损失精度情况下,大大减少模型训练时间。但是当我使用optuna(或者Ray Tune)这些自动寻找超参工具时,随着循环次数增加,显存占用一直在增加,跑了几个超参之后就报OOM的错误了,随着循环次数增加,显存占用一直在增加。在超参训练结束后加入torch.cuda.empty_cache(),仍然出现以上的问题。
原因分析:
开始我认为,是我使用optuna的方式有问题,导致在跑每个超参时发生内存泄露,于是我把代码结构修改了,然并没有什么用。在github上apex搜索memory leak,发现还有很多人有着同样的问题。nvidia的工程师在github上给出的解释,在使用amp.initialize,opt_level选择半精度或者混合精度之后,optimizers中的参数再训练结束后不会被正确释放,造成了内存泄露。然而一年半过去了还是这个毛病…
https://github.com/NVIDIA/apex/issues/439#issuecomment-522360104
I believe the increase in memory might not be related to amp, but is probably caused by storing the internal parameters of the optimizersIf you leave the default settings as use_amp = False, clean_opt = False, you will see a constant memory usage during