0

我正在使用 PyTorch 训练模型。要加载数据,我正在使用torch.utils.data.DataLoader. 数据加载器正在使用我实现的自定义数据库。出现了一个奇怪的问题,每次for执行下面代码中的第二个,线程/进程的数量都会增加,并且分配了大量的内存

    for epoch in range(start_epoch, opt.niter + opt.niter_decay + 1):
        epoch_start_time = time.time()
        if epoch != start_epoch:
            epoch_iter = epoch_iter % dataset_size
        for i, item in tqdm(enumerate(dataset, start=epoch_iter)):

我怀疑之前的迭代器的线程和内存在每次__iter__()调用数据加载器后都没有释放。分配的内存接近创建线程时主线程/进程分配的内存量。也就是说,在初始时期,主线程使用 2GB 内存,因此创建了 2 个大小为 2GB 的线程。在接下来的 epochs 中,主线程分配了 5GB 内存,并构造了两个 5GB 线程(num_workers为 2)。我怀疑该fork()函数将大部分上下文复制到新线程。

以下是显示python创建的进程的活动监视器,ZMQbg/1是与python相关的进程。 在此处输入图像描述

数据加载器使用的我的数据集有 100 个子数据集,__getitem__调用随机选择一个(忽略index)。(子数据集AlignedDataset来自 pix2pixHD GitHub 存储库):

4

1 回答 1

0

torch.utils.data.DataLoader 预取 2*num_workers,以便您始终准备好将数据发送到 GPU/CPU,这可能是您看到内存增加的原因

https://pytorch.org/docs/stable/_modules/torch/utils/data/dataloader.html

于 2019-07-29T22:49:14.353 回答