一般来说,全连接层的前向和后向传递所需的计算量与权重的数量成正比。此外,数据并行训练中所需的带宽与可训练权重的数量成比例。因此,随着每个节点计算速度的提高,所需的网络带宽也随之增加。这篇文章主要是根据阈值进行梯度的稀疏化和量化操作,从而降低分布式训练中的通信开销。稀疏化指的是只传输那些比较重要的梯度(例如绝对值较大的梯度),而量化则是使用较少的比特来表示原始梯度,二者的差别由下图描述[1]:

本文提出的梯度压缩方法基于以下两个观点:(1)很多加速SGD的方法,包括minibatch SGD、动量法、双缓冲以及异步SGD,都可以在某种程度上视为延迟更新的变体;(2)节点上的子梯度是非常稀疏的,这就意味着只有少量的权值需要更新,换句话说,我们只需要传递那些对权值更新产生较大作用的梯度,而不再传输其余的梯度,这样就能降低带宽占用。

因为只传输那些大于某一阈值的梯度,所以我们必须记住这些梯度的索引,以在接收端对其进行重构。在实现上,我们可以使用字典存储索引和对应的梯度值。为了保证精度,我们并不直接在原始梯度上进行操作,而是操纵一个名为梯度残差的东西。在处理每个minibatch时,我们首先将上一次迭代的梯度残差与本次迭代的原始梯度相加,得到本次迭代的梯度残差。随后,对于残差向量中的每个元素,如果该元素大于正阈值,就将该元素的索引与正阈值编码进字典中,再从对应的残差元素中减去阈值;如果该元素小于负阈值,就将该元素的索引与负阈值编码进字典中,再从对应的残差元素中加上阈值。对于那些绝对值小于阈值的残差元素,我们不再传输它们。但是,随着迭代次数的增加,这些元素可能在某次迭代时就超过了阈值,从而完成一次更新。在某种程度上来说,这就是一种延迟更新策略。算法伪代码如下所示:

在实现中,我们将每个梯度(残差)元素编码为两个数字:整数元素索引和浮点梯度元素。为了进一步降低通信开销,本文使用1比特来编码梯度元素,使用31比特编码元素索引,这样就使用4个字节编码了1个整数和1个浮点数。为了保证模型精度,同样需要使用1 Bit SGD中提到的误差补偿技术。需要注意的是,本文使用的是对等结构而非参数服务器架构,而且整个训练过程中只进行梯度的传输,不进行权值的传输。为了降低GPU与OS之间的I/O瓶颈,作者还使用了CUDA中的某些字符串压缩函数。

参考资料

[1] Tang Z, Shi S, Chu X, et al. Communication-Efficient Distributed Deep Learning: A Comprehensive Survey[J]. arXiv preprint arXiv:2003.06307, 2020.

INTERSPEECH 2015 | Scalable Distributed DNN Training Using Commodity GPU Cloud Computing的更多相关文章

  1. Meet Dgraph — an open source, scalable, distributed, highly available and fast graph databas

    https://dgraph.io/ Meet Dgraph — an open source, scalable, distributed, highly available and fast gr ...

  2. Scalable, Distributed Systems Using Akka, Spring Boot, DDD, and Java--转

    原文地址:https://dzone.com/articles/scalable-distributed-systems-using-akka-spring-boot-ddd-and-java Whe ...

  3. 论文阅读笔记六十四: Architectures for deep neural network based acoustic models defined over windowed speech waveforms(INTERSPEECH 2015)

    论文原址:https://pdfs.semanticscholar.org/eeb7/c037e6685923c76cafc0a14c5e4b00bcf475.pdf 摘要 本文研究了利用深度神经网络 ...

  4. (转)分布式深度学习系统构建 简介 Distributed Deep Learning

    HOME ABOUT CONTACT SUBSCRIBE VIA RSS   DEEP LEARNING FOR ENTERPRISE Distributed Deep Learning, Part ...

  5. https ddos检测——研究现状

    from: https://jyx.jyu.fi/bitstream/handle/123456789/52275/1/URN%3ANBN%3Afi%3Ajyu-201612125051.pdf 相关 ...

  6. 77-CCI,Commodity Channel Index,商品通道指标.(2015.7.1)

    CCI,Commodity Channel Index 商品通道指标 Channel Index,商品通道指标.(2015.7.1)" title="77-CCI,Commodit ...

  7. 分布式系统(Distributed System)资料

    这个资料关于分布式系统资料,作者写的太好了.拿过来以备用 网址:https://github.com/ty4z2008/Qix/blob/master/ds.md 希望转载的朋友,你可以不用联系我.但 ...

  8. [专题论文阅读]【分布式DNN训练系统】 FireCaffe

    FireCaffe Forrest N. Iandola FireCaffe: near-linear acceleration of deep neural network training on ...

  9. Toward Scalable Systems for Big Data Analytics: A Technology Tutorial (I - III)

    ABSTRACT Recent technological advancement have led to a deluge of data from distinctive domains (e.g ...

随机推荐

  1. openGL绘图基本框架

    openGL绘图入门和导入外部文件 本文主要介绍通用绘图软件openGL的数据类型和基本的绘图框架,此外还提供了导入obj外部文件的方法,提供的代码稍作修改即可使用,希望能方便初学者快速上手. ope ...

  2. vue3代码setup中this为什么无效

    结论:setup并没有通过各种方式去绑定this 在vue2中,我们可以在optionsApi中调用this来指向当前组件的实例,但是在vue3的setup中并不能这样做,因为setup位于组件创建成 ...

  3. HashMap的实现原理(看这篇就够了)

    一线资深java工程师明确了需要精通集合容器,尤其是今天我谈到的HashMap. HashMap在Java集合的重要性不亚于Volatile在并发编程的重要性(可见性与有序性). 我会重点讲解以下9点 ...

  4. [源码分析] Facebook如何训练超大模型 --- (3)

    [源码分析] Facebook如何训练超大模型 --- (3) 目录 [源码分析] Facebook如何训练超大模型 --- (3) 0x00 摘要 0x01 ZeRO-Offload 1.1 设计原 ...

  5. selenium - 弹出框死活定位不到

    先要确定是不是alert,是才能用,不是的话肯定不能用. 有些弹出框是div层,这种跟平常定位方法一样 有些弹出框是嵌套的iframe层,这种切换iframe就可以了 有些弹出框比较坑,是嵌入的一个窗 ...

  6. springmvc请求处理过程

    springmvc请求的处理流程 1)发起some.do 2)tomcat(web.xml-----url-pattern知道*.do的请求给DispatcherServlet) 3)Dispatch ...

  7. linux设置定时任务(全面解析教程)

    目录 一:系统定时任务 二:系统定时任务配置文件(crontab) 三:增加定时任务 1.crontab -e 2.1.sh 3.2.txt 四:查看crontab定时任务 五:定时任务配置文件(ro ...

  8. javascript 判断对像是否相等

    在Javascript中相等运算包括"==","==="全等,两者不同之处,不必多数,本篇文章我们将来讲述如何判断两个对象是否相等? 你可能会认为,如果两个对象 ...

  9. Ubuntu 配置数据库开发环境(mysql oracle mssqlserver sybase)

    1.mysql sudo apt-get install libmysql++-dev //mysql连接库 2.ms sql server/sybase ./configure --prefix=/ ...

  10. Git配置用户信息和SSH免密

    一.配置用户信息 1.查看配置信息 # 查看所有配置 $ git config -l/--list # 查看系统配置 $ git config --system -l/--list # 查看用户配置 ...