pytorch如何将训练提速?


向AI转型的程序员都关注了这个号????????????

机器学习AI算法工程   公众号:datayx

入门pytorch似乎不慢,写好dataloader和model就可以跑起来了,然而把模型搭好用起来时,却往往发觉自己的程序运行效率并不高,GPU使用率宛如舞动的妖精...忽高忽低,影响模型迭代不说,占着显存还浪费人家的计算资源hh 我最近就是遇到这个困难,花了一些精力给模型提速,这里总结一下(有些描述可能并不准确,但至少这些point可以借鉴hh,不妥之处恳请大家指正/补充啦)

dataloader方面:

  1. DataLoader的参数中,

    1. num_workers与batch_size调到合适值,并非越大越快(注意后者也影响模型性能)

    2. eval/test时shuffle=False

    3. 内存够大的情况下,dataloader的pin_memory设为True,并用data_prefetcher技巧(方法)

  2. https://zhuanlan.zhihu.com/p/80695364

  3. 把不怎么会更改的预处理提前做好 保存到硬盘上,不要放dataloader里做,尤其对图像视频的操作

  4. 减少IO操作,服务器如果是hdd根本架不住多人对磁盘的折磨,曾经几个小伙伴把服务器弄得卡到无法login...可先多线程把数据放到内存,不太会的话可以先用个dataloader专门把数据先读到list中(即内存),然后把这个list作为每次取数据的池。还可以用tmpfs把内存当硬盘,不过需要权限

  5. prefetch_generator(方法)让读数据的worker能在运算时预读数据,而默认是数据清空时才读

model方面:

  1. float16代替默认的float32运算(方法参考,搜索"fp16"可以看到需要修改之处,包括model、optimizer、backward、learning rate)

  2. 优化器以及对应参数的选择,如learning rate,不过它对性能的影响似乎更重要【占坑】

  3. 少用循环,多用向量化操作

  4. 经典操作尽量用别人优化好的,别自己写(想自己实现锻炼能力除外)

  5. 数据很多时少用append,虽然使用很方便,不过它每次都会重新分配空间?所以数据很大的话,光一次append就要几秒(测过),可以先分配好整个容器大小,每次用索引去修改内容,这样一步只要0.0x秒

  6. 固定对模型影响不大的部分参数,还能节约显存,可以用detach()切断反向传播,注意若仅仅给变量设置required_grad=False 还是会计算梯度的

  7. eval/test的时候,加上model.eval()和torch.no_grad(),前者固定batch-normalization和dropout 但是会影响性能,后者关闭autograd

  8. 提高程序并行度,例如 我想train时对每个epoch都能test一下以追踪模型性能变化,但是test时间成本太高要一个小时,所以写了个socket,设一个127.0.0.1的端口,每次train完一个epoch就发个UDP过去,那个进程就可以自己test,同时原进程可以继续train下一个epoch(对 这是自己想的诡异方法hhh)

Using CUDA in correct way:

  • 设置torch.backends.cudnn.benchmark = True

使用benchmark以启动CUDNN_FIND自动寻找最快的操作,当计算图不会改变的时候(每次输入形状相同,模型不改变)的情况下可以提高性能,反之则降低性能

  • 另外,还可以采用确定性卷积:(相当于把所有操作的seed=0,以便重现,会变慢)

torch.backends.cudnn.deterministic

添加torch.cuda.get_device_name和torch.cuda.get_device_capability实现如下功能。例:

pytorch如何将训练提速?_第1张图片

如果设置torch.backends.cudnn.deterministic = True,则CuDNN卷积使用确定性算法

torch.cuda_get_rng_state_all并torch.cuda_set_rng_state_all引入,让您一次保存/加载随机数生成器的状态在所有GPU上

torch.cuda.emptyCache()释放PyTorch的缓存分配器中的缓存内存块。当与其他进程共享GPU时特别有用。

训练模型个人的基本要求是deterministic/reproducible,或者说是可重复性。也就是说在随机种子固定的情况下,每次训练出来的模型要一样。之前遇到了两次不可重复的情况。第一次是训练CNN的时候,发现每次跑出来小数点后几位会有不一样。epoch越多,误差就越多,虽然结果大致上一样,但是强迫症真的不能忍。后来发现在0.3.0的时候已经修复了这个问题,可以用torch.backends.cudnn.deterministic = True
这样调用的CuDNN的卷积操作就是每次一样的了。

预先分配内存空间:pin_memory + non_blocking async GPU training

为了防止多GPU同时读取内存导致blocking,non_blocking需要对train data设置,否则,0.4.0版本中的DataParallel会自动尝试用async GPU training。

用比Adam更快的优化器

  • SGD with Momentum :该优化器在多项式时间内的收敛性已经明确被证明,更不用说所有的参数都已经像您的老朋友一样熟悉了

  • 【暂时不可用】使用AdamW or Adam with correct weight decay:

因为Adam在优化过程中有一个L2正则化参数,但在当前版本的Pytorch中,L2正则化没有根据学习率进行归一化,AdamW论文中提出的Adam修改方案解决了这一问题并证明收敛更快,而且适用于cosine学习率衰减等。

其他:

  1. torch.backends.cudnn.benchmark设为True,可以让cudnn根据当前训练各项config寻找优化算法,但这本身需要时间,所以input size在训练时会频繁变化的话,建议设为False

  • 使用pytorch时,训练集数据太多达到上千万张,Dataloader加载很慢怎么办?

https://www.zhihu.com/question/356829360

  • MrTian:给训练踩踩油门 —— Pytorch 加速数据读取

https://zhuanlan.zhihu.com/p/80695364


阅读过本文的人还看了以下文章:

【全套视频课】最全的目标检测算法系列讲解,通俗易懂!

《美团机器学习实践》_美团算法团队.pdf

《深度学习入门:基于Python的理论与实现》高清中文PDF+源码

特征提取与图像处理(第二版).pdf

python就业班学习视频,从入门到实战项目

2019最新《PyTorch自然语言处理》英、中文版PDF+源码

《21个项目玩转深度学习:基于TensorFlow的实践详解》完整版PDF+附书代码

《深度学习之pytorch》pdf+附书源码

PyTorch深度学习快速实战入门《pytorch-handbook》

【下载】豆瓣评分8.1,《机器学习实战:基于Scikit-Learn和TensorFlow》

《Python数据分析与挖掘实战》PDF+完整源码

汽车行业完整知识图谱项目实战视频(全23课)

李沐大神开源《动手学深度学习》,加州伯克利深度学习(2019春)教材

笔记、代码清晰易懂!李航《统计学习方法》最新资源全套!

《神经网络与深度学习》最新2018版中英PDF+源码

将机器学习模型部署为REST API

FashionAI服装属性标签图像识别Top1-5方案分享

重要开源!CNN-RNN-CTC 实现手写汉字识别

yolo3 检测出图像中的不规则汉字

同样是机器学习算法工程师,你的面试为什么过不了?

前海征信大数据算法:风险概率预测

【Keras】完整实现‘交通标志’分类、‘票据’分类两个项目,让你掌握深度学习图像分类

VGG16迁移学习,实现医学图像识别分类工程项目

特征工程(一)

特征工程(二) :文本数据的展开、过滤和分块

特征工程(三):特征缩放,从词袋到 TF-IDF

特征工程(四): 类别特征

特征工程(五): PCA 降维

特征工程(六): 非线性特征提取和模型堆叠

特征工程(七):图像特征提取和深度学习

如何利用全新的决策树集成级联结构gcForest做特征工程并打分?

Machine Learning Yearning 中文翻译稿

蚂蚁金服2018秋招-算法工程师(共四面)通过

全球AI挑战-场景分类的比赛源码(多模型融合)

斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)

python+flask搭建CNN在线识别手写中文网站

中科院Kaggle全球文本匹配竞赛华人第1名团队-深度学习与特征工程

不断更新资源

深度学习、机器学习、数据分析、python

 搜索公众号添加: datayx  


机器学习算法资源社群

不断上传电子版PDF资料

技术问题求解

 QQ群号: 333972581  

长按图片,识别二维码

你可能感兴趣的:(pytorch如何将训练提速?)