内存泄漏的常见原因
1.内存泄漏有可能是我们创建一个全局的list,每次iter都会往其中添加Tensor,会导致内存泄漏;
2.如果我们某个Tensor在计算图中的前向计算,但是没有参与反向更新参数,可能会导致内存泄漏,因为pytorch的内存管理机制是反向传播后释放计算图中的Tensor;此时可以使用detach将该Tensor从计算图中剥离出来;with torch.no_grad()应该也可以达到同样的结果;
3.以下是一个高赞的帖子排除内存泄漏的方法;
就是从训练起始的地方打印torch.cuda.memory_allocated()/torch.cuda.max_memory_allocated()的比值,
前者代表正在使用的内存,后者代表使用的内存峰值,如果两个iter之间的比值是个固定值,代表该句以上没有内存泄漏,如果不稳定,则代表有内存泄漏;因为有内存泄漏的话,torch.cuda.max_memory_allocated()会一直增加;
the most useful way I found to debug is to use torch.cuda.memory_allocated() and torch.cuda.max_memory_allocated() to print a percent of used memory at the top of the training loop. Then look at your training loop, add a continue statement right below the first line and run the training loop. If your memory usage holds steady, move the continue to the next line and so on until you find the leak.