1、以广泛使用的模式total_loss += loss.data[0]为例。Python0.4.0之前,loss是一个封装了(1,)张量的Variable,但Python0.4.0的loss现在是一个零维的标量。对标量进行索引是没有意义的(似乎会报 invalid index to scalar variable 的错误)。使用loss.item()可以从标量中获取Python数字。所以改为:
total_loss += loss.item()
如果在累加损失时未将其转换为Python数字,则可能出现程序内存使用量增加的情况。这是因为上面表达式的右侧原本是一个Python浮点数,而它现在是一个零维张量。因此,总损失累加了张量和它们的梯度历史,这可能会产生很大的autograd 图,耗费内存和计算资源。
2、model.load_state_dict()函数把模型重新load到gpu里面,所以显存慢慢增大(也是我出现这个现象的的原因),因此load state dict要在单纯inference的时候,只load一次就行,或者每次load完就del一下
3、torch.cuda.empty_cache()进行清空缓存。(非常有必要,如果实在判断不出来哪儿的变量没有del掉)