深度学习如何均衡精度、内存、计算和通信开销?

文 | 立交桥跳水冠军@知乎
本文已获作者授权,禁止二次转载

鱼与熊掌不可兼得,深度学习领域中的几个指标也相同。

主要的指标有如下四个:

(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一直没有定论,有兴趣的同学可以看一下我之前写的另一篇文章了解这个专题:

立交桥跳水冠军:DNN显存优化的终点?Checkmate论文总结:

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

(2)通信换内存

随着BERT,GPT的发展,研究员发现一件更尴尬的事情:内存不够了,但这次不仅仅是装不下activation,甚至光是参数(parame)和参数对应的optimizer都装不下了。那之前说的checkpoint就不管用了(人家只负责省activation)。

这时候有些读者会有想法:那如果我一张卡装不下,就两张卡来呗。恭喜你!你的想法和世界上最顶尖的程序员一样!这种做法可以被称为Model Parallel,即每个分布式节点存储不同的参数,feed一样的数据。目前Model Parallel有两种,粗略来说可以分成intra-layer拆分和inter-layer拆分:

▲intra-layer拆分,多见于NLP模型
▲inter-layer拆分,多见于CV模型

上面的例子可能比较抽象,我们来结合下面的两个具体工作说一下这两种model-parallel:

首先是intra-layer的拆分:

我们知道神经网络是一层一层的,每层可能是一个卷积,一个Pool,或者BN什么的。如果我们对一层进行了拆分,那么就是intra-layer的。下面这张图摘自英伟达的Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism(https://arxiv.org/abs/1909.08053),描述了如何把两个很大的矩阵乘法拆开到两个节点上来算

本来矩阵乘法是  (忽略激活层什么的)。我们知道矩阵乘法有很好的性质:我们可以把矩阵乘法变成分块矩阵乘法。因此我们可以把上面的矩阵乘法变成

因此如果我们让第一个节点计算,第二个节点计算 ,最后再累加两个人的结果,不就好了?这样的好处就是第一个节点只需要存储A1和B1,第二个只需要A2和B2,相当于节省了一半的空间(和一个节点存储A和B相比)

inter-layer拆分:和intra-layer不同,我们只做网络层之间的切分。这种切分方式更符合直觉。上面的例子来自PipeDream(https://arxiv.org/abs/1806.03377、PipeDream: Fast and Efficient Pipeline Parallel DNN Training)。假设我们有5层的神经网络,有四个节点可以用,那我们可以让第一个节点算第一层,第二个节点算第二层,第三个节点算第三层,第四个节点算最后两层。这样我们很直接的就把网络拆开了,不管第1-5层的具体操作是卷积,BN还是什么,都可以这么搞。

但这么拆有一个问题,就是每台机器之间都存在数据依赖:当你发现第1,2,3节点在悠闲地打王者,第四节点在苦逼的干活,你就上去质问他们你们为啥在划水?他们表示很无辜:我在等第四节点把结果算完,然后把梯度传给我啊。

把每个节点工作的时间系统的记录下来,发现所有时刻都只有一个人在干活

很自然的想法就是,如果每个人都处理不同的batch不就好了?但这样做可能会引发精度的问题。有兴趣的读者可以去看PipeDream的论文。

(3)计算换通信

虽然刚才介绍了模型并行,但目前主流的还是数据并行,即每张卡分到同样的parameter,每次接收不同的input,算完之后每个人把自己的local gradient做一次同步,得到global gradient来更新本地的参数(如下图所示)

在这种情况下,我们的通信只发生在gradient allReduce的时刻(即图中最下面灰色的框)。虽然它只是训练过程的一部分,但因为随着分布式系统的增大,通信速度和计算、访存时间相比会越来越慢,因此这个allReduce操作逐渐成为了性能瓶颈。

为了打破这个瓶颈,有些研究员尝试压缩梯度:每次我们并不通信梯度本身,而是先把梯度做一个压缩,让他们的size变小,然后把压缩后的数据做一次传输,最后在本地解压缩这些数据,从而完成一次梯度的allReduce。其中做的比较好的就是TernGrad(TernGrad: Ternary Gradients to Reduce Communication in Distributed Deep Learning(https://arxiv.org/abs/1705.07878))。这个算法将原来一个N*float32这么大的梯度tensor压缩成了N*3这么大的tensor,再加一些可以忽略不计的meta-data。即用(-1,0,1)来表示原本float32的数值。

(4)显存换计算

这方面的例子我没想到太多,就想到诸如用3个3*3的卷积代替一个7*7的卷积:感受野不变,计算量减少,但是原本一个activation变成了三个,显存变大了。

(5)精度换计算/内存/通信

这种方法很“流氓”:深度学习模型最重要的就是精度,如果为了计算、内存和通信放弃了精度就很没道理。

不过得益于神经网络的超强鲁棒性,很多看似大胆的做法可以在显著降低计算,内存或通信的情况下只掉一点点精度。

这里简单介绍几种常见的做法:

  • 量化/用低精度计算:显而易见,如果你用Float16代替Float32,那么运行速度,需要的内存,需要的带宽基本上都可以直接砍一半

  • 稀疏通信:精度换通信的一种做法:我们每次对梯度做all reduce的时候并不需要传所有梯度,只需要选择一部分(比如数值比较大)的梯度传输就好了

  • 神经网络的各种剪枝:比如把很小的weight直接删掉,毕竟对最终结果没啥影响

后台回复关键词【入群

加入卖萌屋NLP/IR/Rec与求职讨论群

后台回复关键词【顶会

获取ACL、CIKM等各大顶会论文集!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/478826.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习在美团搜索广告排序的应用实践

一、前言 在计算广告场景中,需要平衡和优化三个参与方——用户、广告主、平台的关键指标,而预估点击率CTR(Click-through Rate)和转化率CVR(Conversion Rate)是其中非常重要的一环,准确地预估CT…

论文浅尝 - ICML2020 | 拆解元学习:理解 Few-Shots 任务中的特征表示

论文笔记整理:申时荣,东南大学博士生。来源:ICML2020链接:http://arxiv.org/abs/2002.06753元学习算法会生成特征提取器,这些特征提取器在进行few-shot分类时就可以达到最新的性能。尽管文献中有大量的元学习方法&…

Android官方开发文档Training系列课程中文版:电池续航时间优化之检查、检测网络连接状态

原文地址:http://android.xsoftlab.net/training/monitoring-device-state/connectivity-monitoring.html 通常会有一些后台服务需要连接到网络来更新数据。但是如果没有连接到互联网,或者由于网络太慢而不能完成更新,那么为什么不在连接到网…

LeetCode 304. 二维区域和检索 - 矩阵不可变(DP)

1. 题目 2. 解题 类似题目:LeetCode 308. 二维区域和检索 - 可变(前缀和) dp[i][j]数组表示 从左上角到i,j位置的所有和 sum[i1][j1]sum[i1][j]sum[i][j1]matrix[i][j]−sum[i][j]sum[i1][j1] sum[i1][j]sum[i][j1]matrix[i][j]-sum[i][j]…

一键离线下载python安装包:

Python 第三方库 批量下载安装包,离线批量安装Python第三方库:https://www.cnblogs.com/qiuyubai/p/14084501.html 核心代码: 一键生成安装包的索引文件requirements.txt pip freeze >requirements.txt pip download -d ./ -r requirements.txt全部…

论文浅尝 - ICML2020 | 对比图神经网络解释器

论文笔记整理:方尹,浙江大学在读博士,研究方向:图表示学习。Contrastive Graph Neural Network Explanation动机与贡献本文主要关注图神经网络的解释性问题,这样的解释有助于提升GNN的可信度,能够更好的理解…

这可能是最简单又有效的自监督学习方法了

文 | 王珣知乎本文已获作者授权,禁止二次转载从Kaiming的MoCo和Hinton组Chen Ting的SimCLR开始,自监督学习(SSL)成了计算机视觉的热潮显学。凡是大佬大组(Kaiming, VGG,MMLAB等),近两…

大众点评账号业务高可用进阶之路

引言 在任何一家互联网公司,不管其主营业务是什么,都会有一套自己的账号体系。账号既是公司所有业务发展留下的最宝贵资产,它可以用来衡量业务指标,例如日活、月活、留存等,同时也给不同业务线提供了大量潜在用户&…

Android官方开发文档Training系列课程中文版:电池续航时间优化之按需开启广播接收器

原文地址:http://android.xsoftlab.net/training/monitoring-device-state/manifest-receivers.html 监测设备状态变化最简单的实现方式就是为每种状态都创建一个广播接收器,然后只需在相应的广播接收器内依据当前的设备状态重新执行各自的任务即可。 …

LeetCode 493. 翻转对(归并排序)

1. 题目 给定一个数组 nums &#xff0c;如果 i < j 且 nums[i] > 2*nums[j] 我们就将 (i, j) 称作一个重要翻转对。 你需要返回给定数组中的重要翻转对的数量。 输入: [1,3,2,3,1] 输出: 2输入: [2,4,3,5,1] 输出: 3来源&#xff1a;力扣&#xff08;LeetCode&#x…

执行Dockerfile构建基础镜像,建立python工作环境

Docker Dockerfile&#xff1a;https://www.runoob.com/docker/docker-dockerfile.html 核心内容&#xff1a; 指令详解 COPY 复制指令&#xff0c;从上下文目录中复制文件或者目录到容器里指定路径。 格式&#xff1a; COPY [--chown<user>:<group>] <源路径…

论文浅尝 - ICML2020 | 通过关系图上的贝叶斯元学习进行少样本关系提取

论文笔记整理&#xff1a;申时荣&#xff0c;东南大学博士生。来源&#xff1a;ICML 2020链接&#xff1a;http://arxiv.org/abs/2007.02387一、介绍本文研究了少样本关系提取&#xff0c;旨在通过训练每个关系少量带有标记示例的句子来预测句子中一对实体的关系。为了更有效地…

美团外卖客户端高可用建设体系

背景 美团外卖从2013年11月开始起步&#xff0c;经过数年的高速发展&#xff0c;一直在不断地刷新着记录。2018年5月19日&#xff0c;日订单量峰值突破2000万单&#xff0c;已经成为全球规模最大的外卖平台。业务的快速发展对系统稳定性提出了更高的要求&#xff0c;如何为线上…

Android官方开发文档Training系列课程中文版:线程执行操作之定义线程执行代码

原文地址&#xff1a;http://android.xsoftlab.net/training/multiple-threads/index.html 引言 大量的数据处理往往需要花费很长的时间&#xff0c;但如果将这些工作切分并行处理&#xff0c;那么它的速度与效率就会提升很多。在拥有多线程处理器的设备中&#xff0c;系统可…

我哭了,工业界AI项目落地有多难?

文 | 皮特潘源 | CVer人工智能是近几年最火热的技术名词&#xff0c;如果不谈人工智能相当于落伍&#xff0c;但当真正进入人工智能领域时才发现&#xff0c;一开始以为“拦路虎”是算法&#xff0c;后面发现落地是一个巨大的难题。本文从作者的经历和经验教训展开&#xff0c;…

LeetCode 646. 最长数对链(区间 贪心)

1. 题目 给出 n 个数对。 在每一个数对中&#xff0c;第一个数字总是比第二个数字小。 现在&#xff0c;我们定义一种跟随关系&#xff0c;当且仅当 b < c 时&#xff0c;数对(c, d) 才可以跟在 (a, b) 后面。我们用这种形式来构造一个数对链。 给定一个对数集合&#xf…

以太网和路由设置,内网和外网同时上

第一步&#xff0c;查看自己内网的地址&#xff0c;网络与internet设置&#xff0c;更改适配器选项&#xff0c;出现下面的页面 点击内网&#xff0c;右击WLan&#xff0c;点击状态 点击详细信息&#xff1a; 记录网关信息&#xff1a; 第二步&#xff1a;查找路由器设置 …

论文浅尝 - AAAI2020 | 通过知识库问答改善知识感知对话生成

论文笔记整理&#xff1a;胡楠&#xff0c;东南大学博士。来源&#xff1a;AAAI 2020动机现在的将外部知识整合到对话系统中的研究仍然存在一定缺陷。首先&#xff0c;先前的方法难以处理某些语句的主语和关系&#xff0c;比如当语句中的相关实体彼此相距较远时。其次&#xff…

互联网企业数据安全体系建设

一、背景 Facebook数据泄露事件一度成为互联网行业的焦点&#xff0c;几百亿美元市值瞬间蒸发&#xff0c;这个代价足以在地球上养活一支绝对庞大的安全团队&#xff0c;甚至可以直接收购几家规模比较大的安全公司了。 虽然媒体上发表了很多谴责的言论&#xff0c;但实事求是地…

Android官方开发文档Training系列课程中文版:线程执行操作之创建多线程管理器

原文地址&#xff1a;http://android.xsoftlab.net/training/multiple-threads/create-threadpool.html 上节课我们学习了如何定义一个任务。如果只是执行单次任务&#xff0c;那么刚刚所学的已经基本满足要求了。如果需要针对不同的数据执行同种任务&#xff0c;并且需要同一…