点击上方“Python面试白”,选择“星标”公众号
重磅干货,第一时间送达
写:
imagenametotal_.append(os.path.join('images', imagenametotal).encode())
with h5py.File(outfile) as f:
f.create_dataset('imagename', data=imagenametotal_)
f['part'] = parts_
f['S'] = Ss_
f['image'] = cvimgs
读:
with h5py.File(outfile) as f:
imagename = [x.decode() for x in f['imagename']]
kp2ds = np.array(f['part'])
kp3ds = np.array(f['S'])
cvimgs = np.array(f['image'])2. gpu imbalance,这里感谢一下张航学长 @张航老生常谈的问题,第一个GPU显存占用多一点。 张航学长Hang Zhang (张航)提了一个开源的gpu balance的工具--PyTorch-Encoding。 使用方法还是比较便捷的,如下所示:from balanced_parallel import DataParallelModel, DataParallelCriterionmodel = DataParallelModel(model, device_ids=gpus).cuda()criterion = loss_fn().cuda()这里其实有2个注意点,第一,测试的时候需要手动将gpu合并,代码如下:from torch.nn.parallel.scatter_gather import gatherpreds = gather(preds, 0)第二,当loss函数有多个组成的时候,比如 loss = loss1 + loss2 + loss3 那么需要把这三个loss写到一个class中,然后再forward里面将其加起来。 其次,我们还可以用另外一个函数distributedDataParallel来解决gpu imbalance的问题. 使用方法如下:(注:此方法好像无法和h5数据同时使用)from torch.utils.data.distributed import DistributedSamplerfrom torch.nn.parallel import DistributedDataParalleltorch.distributed.init_process_group(backend="nccl")# 配置每个进程的gpulocal_rank = torch.distributed.get_rank()torch.cuda.set_device(local_rank)device = torch.device("cuda", local_rank)#封装之前要把模型移到对应的gpumodel.to(device)model = torch.nn.parallel.DistributedDataParallel(model,device_ids=[local_rank], output_device=local_rank)#原有的dataloader上面加一个数据sampletrain_loader = torch.utils.data.DataLoader( train_dataset, sampler=DistributedSampler(train_dataset) )3.gpu利用率不高+gpu现存占用浪费 常用配置: 1主函数前面加:(这个会牺牲一点点现存提高模型精度)cudnn.benchmark = Truetorch.backends.cudnn.deterministic = Falsetorch.backends.cudnn.enabled = True2训练时,epoch前面加:(定期清空模型,效果感觉不明显)torch.cuda.empty_cache()3无用变量前面加:(同上,效果某些操作上还挺明显的)del xxx(变量名)4dataloader的长度_len_设置:(dataloader会间歇式出现卡顿,设置成这样会避免不少)def __len__(self): return self.images.shape[0]5dataloader的预加载设置:(会在模型训练的时候加载数据,提高一点点gpu利用率)train_loader = torch.utils.data.DataLoader( train_dataset, pin_memory=True, )6网络设计很重要,外加不要初始化任何用不到的变量,因为pyroch的初始化和forward是分开的,他不会因为你不去使用,而不去初始化。 7最后放一张目前依旧困扰我的图片:
在深度学习中喂饱gpu
https://zhuanlan.zhihu.com/p/77633542
但是我看了下代码,可能需要重构dataloader,看了评论好像还有问题,有点懒,目前 还没有踩坑, 准备后面有时间踩一下。 暂且更新到这里,后续遇到什么坑陆续补充,也欢迎大家给我补充,pytorch初学者小白一枚。 更个新;顺便吐槽一下上面的dali,局限性很大,比较trick的数据预处理很难搞定。 8 apex混合单精度模型 事实证明,apex并没有官网说的那么玄乎,只能减低显存,并不能提速(12G显存大概可以降低到8G左右,效果还挺明显的,但是,速度降低了大概1/3,好像有点得不偿失)。 编译之后提速也很有限,再此留个坑,有小伙伴能解决的可以私信我哈,如果可以解决我会仔细罗列一遍。。来自 | 知乎
作者 | 郁振波
地址 | https://zhuanlan.zhihu.com/p/7792356
本文仅作学术分享,如有侵权,请联系删除