3.2. 非阻塞操作与预加载 谈及pin_memory,不得不提及non_blocking=true的设置。通过这一设置,可以在不阻塞其他操作的情况下,提升数据加载的并行度。使用DataPrefetcher类,可以实现数据预取和并行处理。在初始化DataPrefetcher类时,传入了参数64,shuffle=True以及num_workers,以实现数据预取、随机打乱顺序以及并行...
DataPrefetcher的实现 下面是DataPrefetcher的简易实现: importtorchimporttimefromthreadingimportThreadclassDataPrefetcher:def__init__(self,data_loader):self.data_loader=data_loader self.stream=torch.cuda.Stream()self.prefetch_thread=Thread(target=self._get_next)self.data_iter=iter(data_loader)self.next_...
使用prefetch_generator,我们可以保证线程不会等待,每个线程都总有至少一个数据在加载。 (2)data_prefetcher 更新:经评论区提醒,有同学在用这个技术的时候遇到显存溢出的问题,见 apex issues ,大家用的时候注意一下。 使用data_prefetcher 新开 cuda stream 来拷贝 tensor 到 gpu。 使用: class DataPrefetcher(): d...
= 'meta': batch[k] = batch[k].to(device=opt.device, non_blocking=True) run_step() # ---改造后--- prefetcher = DataPrefetcher(data_loader, opt) batch = prefetcher.next() iter_id = 0 while batch is not None: iter_id += 1 if iter_id >= num_iters: break run_step() batch...
本文主要介绍第二种方法,也就是Data Prefetcher,最早见于NVIDIA APEX。 这里我把代码抠出来了,删除掉了一些不必要的注释,可以将其复用到自己的项目里来。 importtorch classdata_prefetcher(): def__init__(self, loader): self.loader =iter(loader)
一、建立data_prefetcher类 classdata_prefetcher():def__init__(self,loader):self.loader=iter(loader)self.stream=torch.cuda.Stream()self.mean=torch.tensor([0.485*255,0.456*255,0.406*255]).cuda().view(1,3,1,1)self.std=torch.tensor([0.229*255,0.224*255,0.225*255]).cuda().view(1,3,1...
DataPrefetcher对DataLoader又包了一层,需要注意pin_memory=True时non_blocking=true才才生效,next()函数直接返回data而无需等待cuda()。实验结果如下,和预期的差不多,并无明显的改善。说到cuda(),有个小细节需要注意: 代码语言:javascript 代码运行次数:0 运行代码...
内存够大的情况下,dataloader的pin_memory设为True,并用data_prefetcher技巧(方法) https://zhuanlan.zhihu.com/p/80695364 把不怎么会更改的预处理提前做好 保存到硬盘上,不要放dataloader里做,尤其对图像视频的操作 减少IO操作,服务器如果是hdd根本架不住多人对磁盘的折磨,曾经几个小伙伴把服务器弄得卡到无法lo...
iteration +=1# 训练代码data, label = prefetcher.next() 6. 其他细节 copy batch_images = batch_images.pin_memory() Batch_labels = Variable(batch_labels).cuda(non_blocking=True) PyTorch的DataLoader有一个参数pin_memory,使用固定内存,并使用non_blocking=True来并行处理数据传输。
登录后复制classDataPrefetcher():登录后复制def__init__(self, loader, opt):登录后复制self.loader = iter(loader)登录后复制self.opt = opt登录后复制self.stream = torch.cuda.Stream()登录后复制# With Amp, it isn't necessary to manually convert data to half.登录后复制# if args.fp16:登录后复...