【他山之石】深度学习中的那些Trade-off
“他山之石,可以攻玉”,站在巨人的肩膀才能看得更高,走得更远。在科研的道路上,更需借助东风才能更快前行。为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟“他山之石”专栏,助你乘风破浪,一路奋勇向前,敬请关注。
地址:https://www.zhihu.com/people/li-jiao-qiao-tiao-shui-guan-jun
鱼与熊掌不可兼得,深度学习领域中的几个指标也相同。
主要的指标有如下四个
(1)精度:自然精度是一个模型最根本的衡量指标,如果一个模型精度不高,再快,再绿色环保也无济于事。基本上所有刷榜的工作都是用其他所有指标换精度:比如用更深的网络就是用memory和computation换精度。然而到了实际应用中,尤其是部署侧,工程师越来越多的用一些方法适当的减少精度从而换取更小的内存占用或者运算时间
(2)内存:Out Of Memory Error恐怕是炼丹师最常见的情况了。内存(或者说可以高效访问的存储空间)的尺寸是有限的,如果网络训练需要的内存太大了,可能程序直接就报错了,即使不报错,也需要把内存中的数据做个取舍,一部分存到相对较慢的存储介质中(比如host memory)
(3) 通信:随着网络规模越来越大,分布式训练已经是state-of-the-art的网络模型必不可少的部分(你见过谁用单卡在ImageNet训练ResNet50?),在大规模分布式系统,通信带宽比较低,相比于computation或者memory load/sotre,network communication会慢很多,如果可以降低通信量,那么整个网络的训练时间就会有大幅减少:这样研究员就不会借口调参,实际上把模型往服务器上一扔自己就跑出去浪了。(资本家狂喜)
(4)计算:虽然我们用的是计算机,但实际上恐怕只有很少的时间用于计算(computation)了,因为大多数时间都在等待数据的读取或者网络通信,不过即便如此,对于一些计算密集型的神经网络结构(比如BERT,几乎都是矩阵乘法),制约我们的往往是设备的计算能力(FLOPS),即每秒钟可以处理多少浮点计算。
无疑同时将以上四点做好是我们追求的,但现实往往很残酷,需要我们做很多取舍。今天就在这儿介绍一些业内常见的trade-off
(1)计算换内存
很多时候内存是最重要的:计算慢了我们多等一等就行了,内存爆了就彻底训练不了了。在神经网络训练中,内存的占用大头往往是activation,即神经网络每层的输出。我们在训练的时候需要把这些输出(activation)记录下来,因为我们反向传播的时候需要用这些activation计算梯度。
一个很直观的想法就是:我们干脆把一堆activation扔掉,到时候需要他们的时候再算一遍。这就是checkpoint机制的想法。虽然这个想法很简单,但是对于一个特定的神经网络,究竟扔掉/保留哪些activation一直没有定论,有兴趣的同学可以看一下我之前写的另一篇文章了解这个专题:https://zhuanlan.zhihu.com/p/299861314
(2)通信换内存
(3)计算换通信
(4)显存换计算
(5)精度换计算/内存/通信
量化/用低精度计算:显而易见,如果你用Float16代替Float32,那么运行速度,需要的内存,需要的带宽基本上都可以直接砍一半 稀疏通信:精度换通信的一种做法:我们每次对梯度做all reduce的时候并不需要传所有梯度,只需要选择一部分(比如数值比较大)的梯度传输就好了 神经网络的各种剪枝:比如把很小的weight直接删掉,毕竟对最终结果没啥影响
本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。
“他山之石”历史文章
PyTorch 手把手搭建神经网络 (MNIST)
autograd源码剖析
怎样才能让你的模型更加高效运行?
来自日本程序员的纯C++深度学习库tiny-dnn
MMTracking: OpenMMLab 一体化视频目标感知平台
深度学习和机器视觉top组都在研究什么
pytorch常见的坑汇总
pytorch 中张量基本操作
pytorch计算模型FLOPs和Params
保姆级教程:个人深度学习工作站配置指南
整理 Deep Learning 调参 tricks
Tensorflow模型保存方式大汇总
利用Tensorflow构建CNN图像多分类模型及图像参数、数据维度变化情况实例分析
pytorch中optimizer对loss的影响
更多他山之石专栏文章,
请点击文章底部“阅读原文”查看
分享、点赞、在看,给个三连击呗!