我正在使用 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 存储库):