Python Bug 关于PyTorch-Dataset 内存持续增长bug

太长不看

List[Dict] 对Dict添加数据,如果数据仅仅时临时数据(希望函数结束自动释放), 不会的,会一直保存。
很简单, 但是如果隐藏在复杂的程序逻辑中,可能不是很好发现。仅以此篇警戒。

bug 重现

import os
import psutil
from torch.utils.data import Dataset, DataLoader


class DummyDataset(Dataset):
    def __init__(self) -> None:
        super().__init__()
        self.datas = []
        # 为了方便重现 - 对数据的模拟
        for i in range(1000):
            self.datas.append({"idx": i})
        self.length = len(self.datas)

    def __getitem__(self, index):
        _sample = self.datas[index]
        # 处理数据
        _sample["new"] = "new" * 100000  # bug reason
        return _sample

    def __len__(self):
        return self.length


dataset = DummyDataset()
loader = DataLoader(dataset, batch_size=64)   # noqa: E221

process = psutil.Process(os.getpid())
for i, batch in enumerate(loader):
    mm_info = process .memory_full_info()
    print(i, mm_info.uss / 1024 / 1024, "MB")

运行: 将上述内容保存到文件,如main.py, python main.py

$ python main.py
0 216.359375 MB
1 234.67578125 MB
2 252.9921875 MB
3 271.30859375 MB
4 289.62890625 MB
5 307.9453125 MB
6 326.2578125 MB
7 344.57421875 MB
8 362.88671875 MB
9 381.203125 MB
10 399.515625 MB
11 417.83984375 MB
12 436.15234375 MB
13 454.46875 MB
14 472.78125 MB
15 484.2265625 MB

可以看到程序使用的内存在持续增长。
深度学习的数据量还是很大的, 因此很快就会用完内存,报错(Killed)退出。

debug

猜想: 猜想就是有用完的内存,没有释放掉。
可以使用memory_profiler库,观察内存的变化。

在查找问题时, 还发现一些其他的内存泄漏问题, 放在这里供参考。
(本文的问题不时问题泄漏, 是Bug)

原因

__getitem__ 使用index取数据,又向数据中写入了新的数据(是临时数据),相当于间接向self.datas写入数据,__getitem__结束时,并不会释放新的临时数据,会一直保存下来,这就是内存一直增长的原因.

deepcopy 修正

知道了原因,就很好修改了. 在__getitem__中新建数据。脱离与self.datas的联系.
直接deepcopy生成新的临时数据,仅修改新的临时数据.
下面展示一些 内联代码片

from copy import deepcopy
	...
    def __getitem__(self, index):
        _sample = self.datas[index]
        ...
    # 修改为
    def __getitem__(self, index):
        _sample = self.datas[index]
        _sample = deepcopy(_sample)

修改后的结果

(pl) qzhao@cu12:~/codes/nes$ python mm.py
0 215.640625 MB
1 233.95703125 MB
2 215.76953125 MB
3 233.9609375 MB
4 215.76953125 MB
5 233.9609375 MB
6 215.7734375 MB
7 233.96484375 MB
8 215.7734375 MB
9 233.96484375 MB
10 215.78125 MB
11 233.97265625 MB
12 215.78125 MB
13 233.97265625 MB
14 215.78125 MB
15 227.10546875 MB

内存使用在跳动,不再时持续增长。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在Python中安装PyTorch的GPU版本,你需要先确保你的显卡支持CUDA。然后,你可以根据你的操作系统和Python版本,按照以下步骤进行安装: 1. 安装CUDA和CUDNN: - 访问NVIDIA官网下载并安装适合你系统的CUDA和CUDNN版本。确保选择与你的显卡和操作系统兼容的版本。 - 安装CUDA时,选择自定义安装,并配置好路径。 2. 创建一个虚拟环境(可选): - 打开终端或命令提示符窗口,并执行以下命令创建一个虚拟环境(可选): ``` python -m venv myenv ``` 3. 激活虚拟环境(可选): - 在终端或命令提示符窗口中执行以下命令激活虚拟环境(如果你使用了虚拟环境): - Windows: ``` myenv\Scripts\activate ``` - macOS/Linux: ``` source myenv/bin/activate ``` 4. 安装PyTorch GPU版本: - 打开终端或命令提示符窗口,并执行以下命令来安装PyTorch GPU版本: - 使用conda(推荐): ``` conda install pytorch torchvision torchaudio cudatoolkit=xx.x -c pytorch ``` 其中,`xx.x`是你安装的CUDA版本对应的数字,例如`10.2`。 - 使用pip: ``` pip install torch torchvision torchaudio ``` 5. 验证安装: - 打开Python交互式环境(终端或命令提示符窗口中输入`python`)并执行以下命令来验证PyTorch是否安装成功: ```python import torch print(torch.cuda.is_available()) ``` 如果输出结果为`True`,说明PyTorch的GPU版本安装成功,并且你的显卡支持CUDA。如果输出结果为`False`,则可能是因为你的显卡不支持CUDA或者安装过程中出现了问题。 请注意,安装PyTorch GPU版本可能会比普通版本复杂一些,并且需要满足一些额外的硬件和软件要求。确保你已经详细阅读了PyTorch的官方文档,并按照要求进行安装和配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值