问题与解决
开始训练之后内存就开始一直涨,server上60g都不够用肯定是代码的问题了
后来查看进程被kill的原因是OOM(Out of Memory)
- loss.item()
这个问题基本上大家都说过了,但是我 T_T 一开始只在training中使用了running_loss += loss.item()
,忘了在validation部分加 .item()导致内存一直涨,后来检查的时候才发现
- 自己增加的metric(比如我 写
denorm_MAPE
函数算MAPE)也要记得加.detach()
或者with torch.no_grad():
- 官方教程这个照着写没毛病https://pytorch.org/tutorials/beginner/basics/optimization_tutorial.html#full-implementation
- 原理看官方文档
torch.tensor
的创建会有个requires_grad=False
https://pytorch.org/docs/stable/tensors.html#initializing-and-basic-operations
- 数据转换(list转
torch.tensor
)
上面的问题解决了之后不会爆内存了,但是还是会缓慢增长
虽然想着有增有减是正常的,还是检查了一下dataloading的有没有问题
在__getitem__
类中我把list转成torch.tensor
。我没有手动设置dtype,默认的转换会把float类型的list转成FloatTensor
(float32),把int类型的list转成LongTensor
(int64),但我只需要int32就够了
参考这篇 https://zhuanlan.zhihu.com/p/86286137
关于如何追内存
https://blog.csdn.net/rocking_struggling/article/details/108963606
我用了 import psutil
包for CPU.
GPU 用 import pynvml
- memory_profiler据说也很好用但是我还没试