关于深度学习降低显存消耗的方法有很多,网上一直有一种方法在流传(甚至在知乎看到一个问题下面有几个人鼓吹这个方法),就是
用del删掉掉不用的tensor,再马上执行torch.cuda.empty_cache(),
需要注意:多次del则多次执行torch.cuda.empty_cache(),不能只放在最后执行一次
一直听说上述方法能够解决显存不足不能训练的问题,今天实测了一下
先说实验结论:
中间状态显存是会下降,但是峰值显存差别不大,所以不能训练的基本还是不能训练!
如上图,通过手动输入nvidia-smi命令监测gpu显存消耗,在前后差别为1秒的时间内(05:57:46~05:57:47),显存占用确实有大幅下降,多执行几次发现有好几种显存占用大小的状态,所以确认显存占用在某些时候是下降了。
但是,但是,峰值显存占用(最大的显存占用)仍然不怎么变,也就意味着如果原本会显存溢出导致不能训练的,你加上这个大概率依旧不能训练,因为显存下降并不是保持常态化,而只是在某些时间下降,该CUDA out of memory的还是依旧。
甚至多次执行del和torch.cuda.empty_cache()还会增加计算开销,导致每个step的训练时间增加。
测试环境:使用的深度学习框架为pytorch-lightning,显卡为两张Titan V
以上是本人的实验结果,读者如若感兴趣也可以自己实验试试。如若大佬发现我的实验有错或者哪里出了问题,也可以评论回复纠正我,万分感激!