python - Pytorch 模型训练 CPU 内存泄漏问题

标签 python memory-leaks pytorch backpropagation memory-profiling

当我在 上训练我的 pytorch 模型时GPU 设备,我的 python 脚本突然被杀死了。潜入操作系统日志文件,我发现脚本被 OOM 杀手杀死,因为我的 CPU 内存不足。很奇怪我在上训练我的模型GPU 设备,但我用完了 CPU 内存。
Snapshot of OOM killer log file
enter image description here
为了调试这个问题,我安装了python memory profiler。从内存分析器查看日志文件,我发现当列明智 -= 操作发生后,我的 CPU 内存逐渐增加,直到 OOM 杀手杀死了我
程序。
Snapshot of Python memory profiler
enter image description here
很奇怪,我尝试了很多方法来解决这个问题。最后,我发现在赋值操作之前,我先分离Tensor。令人惊讶的是,它解决了这个问题。但我不明白它为什么起作用。这是我的原始函数代码.

def GeneralizedNabla(self, image):
        pad_size = 2
        affinity = torch.zeros(image.shape[0], self.window_size**2, self.h, self.w).to(self.device)
        h = self.h+pad_size
        w = self.w+pad_size
        #pad = nn.ZeroPad2d(pad_size)
        image_pad = self.pad(image)
        for i in range(0, self.window_size**2):
            affinity[:, i, :, :] = image[:, :, :].detach()  # initialization
            dy = int(i/5)-2
            dx = int(i % 5)-2
            h_start = pad_size+dy
            h_end = h+dy  # if 0 <= dy else h+dy
            w_start = pad_size+dx
            w_end = w+dx  # if 0 <= dx else w+dx
            affinity[:, i, :, :] -= image_pad[:, h_start:h_end, w_start:w_end].detach()
        self.Nabla=affinity
        return
如果大家有什么想法,我将不胜感激,谢谢。

最佳答案

以前当您没有使用 .detach()在你的张量上,你也在积累计算图,随着你继续,你不断积累越来越多,直到你最终耗尽你的内存到它崩溃的地步。
当你做 detach() ,您可以有效地获取数据,而无需计算梯度所需的先前纠缠的历史。

关于python - Pytorch 模型训练 CPU 内存泄漏问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65107933/

相关文章:

pytorch - 从检查点加载模型不起作用

python - 使用 boto3 在两个 AWS S3 存储桶之间移动文件

debugging - 追踪单点触控程序泄漏的技巧/技巧?

python - Pytorch XOR 实现舍入问题?

iphone - xCode5 中新的 Core Foundation 泄漏

java - 为什么 GC 不收集我的对象?

python - Pytorch 不通过迭代张量构造进行反向传播

python - 如何从python中的线程池中获取结果?

python - 将风向字典映射到新列

Python 抽象基类 : Why doesn't abc prevent instantiation?