本文主要研究HPC上进行数据并行训练的可行性。作者首先在HPC上实现了两种通信量化算法(1 Bit SGD以及阈值量化),然后提出了自适应量化算法以解决它们的缺点。此外,发挥出量化算法的性能,作者还自己实现了一个Allreduce算法。

1 Bit SGD可以实现良好的重构和较低的误差,但与阈值量化相比,它的计算开销更大,并且压缩率不能达到32倍以上。阈值量化速度很快,但是不同的模型需要设置不同的阈值,而且选择好的阈值也很困难,并且使用阈值\(\tau\)作为重建值是次优的。如果阈值设置的比较小,那么由于误差补偿的存在,可能会导致传输大量的数据。

自适应量化使用固定比例\(\pi\)来表示每次迭代时要发送的梯度更新比例。第一步,自适应量化要确定满足当前迭代所需比例的正阈值\(\tau^+\)和负阈值\(\tau^-\)。假设梯度向量中有\(k\)个非负值,我们只需要发送其中最大的\(\frac{k}{\pi}\)个值,因此,正阈值\(\tau^+\)就是梯度向量中第\(\frac{k}{\pi}\)个值。一般而言,我们可以通过快速选择等高效算法,在\(O(N)\)时间内找到第\(\frac{k}{\pi}\)个元素。负阈值的确定与正阈值类似,只不过是选择梯度向量中最小的\(\frac{k}{\pi}\)个值。注意,正阈值和负阈值都由同一个比例\(\pi\)确定的。同样,自适应量化需要使用误差补偿技术来防止模型不收敛。在接收端的重建阶段,自适应量化分别对大于正阈值\(\tau^+\)和小于负阈值\(\tau^-\)的元素求一个平均值,用这两个均值分别作为重建向量中的元素。

作者发现原始的MPI_Allreduce接口在传输压缩数据时表现不好,而且使用用户自定义操作时MPI_Allreduce会退化成recursive-doubling实现,因此他使用原始的MPI_SendMPI_Recv方法实现了一个类似于Ring Allreduce的聚合通信算法。

下面是本文的一些实验结果。第一幅图展示了模型中第三个全连接层每次迭代时所发送的数据量。无量化和1 Bit量化的结果符合预期:要么发送完整的梯度矩阵,要么将数据量减少约32倍。自适应量化在\(\pi = 64\)的情况下,我们期望得到与1 Bit量化相似的数据压缩比。但是由于它使用采样来近似阈值以排除更新,因此它不能完全实现32倍的压缩比。但是,只要采样是一个足够好的近似值,那么数据量就不会过多或过少。阈值量化即使在\(\tau = 0.001\)的情况下也发送很少的数据,并且发送的数量非常不稳定。这就导致其测试精度明显低于其他方法,因为每个模型基本上仅从其本地的数据中进行学习。

下面这幅图展示了不同梯度量化方法的通信时间(同样是模型中第三个全连接层)。可以看到,阈值量化的通信时间是最短的,因为它只需要传输很少的数据。第二快的是传统的MPI_Allreduce,这是因为量化引入了额外的计算开销,当某一层本身的计算量较少时,这种额外的计算开销就会被放大。自适应量化紧随其后,而且相对于传统的MPI_Allreduce更加平稳。最慢的是1 Bit量化,因为它有一个额外的AdaGrad操作。

MLHPC 2016 | Communication Quantization for Data-parallel Training of Deep Neural Networks的更多相关文章

  1. MLHPC 2018 | Aluminum: An Asynchronous, GPU-Aware Communication Library Optimized for Large-Scale Training of Deep Neural Networks on HPC Systems

    这篇文章主要介绍了一个名为Aluminum通信库,在这个库中主要针对Allreduce做了一些关于计算通信重叠以及针对延迟的优化,以加速分布式深度学习训练过程. 分布式训练的通信需求 通信何时发生 一 ...

  2. Aluminum: An Asynchronous, GPU-Aware Communication Library Optimized for Large-Scale Training of Deep Neural Networks on HPC Systems

    本文发表在MLHPC 2018上,主要介绍了一个名为Aluminum通信库,这个库针对Allreduce做了一些关于计算通信重叠以及针对延迟的优化,以加速分布式深度学习训练过程. 分布式训练的通信需求 ...

  3. Training Deep Neural Networks

    http://handong1587.github.io/deep_learning/2015/10/09/training-dnn.html  //转载于 Training Deep Neural ...

  4. Training (deep) Neural Networks Part: 1

    Training (deep) Neural Networks Part: 1 Nowadays training deep learning models have become extremely ...

  5. [Box] Robust Training and Initialization of Deep Neural Networks: An Adaptive Basis Viewpoint

    目录 概 主要内容 LSGD Box 初始化 Box for Resnet 代码 Cyr E C, Gulian M, Patel R G, et al. Robust Training and In ...

  6. 深度学习(六十九)darknet 实现实验 Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffma

    本文主要实验文献文献<Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization ...

  7. 用matlab训练数字分类的深度神经网络Training a Deep Neural Network for Digit Classification

    This example shows how to use Neural Network Toolbox™ to train a deep neural network to classify ima ...

  8. 论文翻译:BinaryNet: Training Deep Neural Networks with Weights and Activations Constrained to +1 or −1

    目录 摘要 引言 1.BinaryNet 符号函数 梯度计算和累积 通过离散化传播梯度 一些有用的成分 算法1 使用BinaryNet训练DNN 算法2 批量标准化转换(Ioffe和Szegedy,2 ...

  9. 论文翻译:BinaryConnect: Training Deep Neural Networks with binary weights during propagations

    目录 摘要 1.引言 2.BinaryConnect 2.1 +1 or -1 2.2确定性与随机性二值化 2.3 Propagations vs updates 2.4 Clipping 2.5 A ...

随机推荐

  1. 【PTA】5-2 下列程序读入时间数值,将其加1秒后输出,时间格式为:hh: mm: ss,即“小时:分钟:秒”,当小时等于24小时,置为0。

    5-2 下列程序读入时间数值,将其加1秒后输出,时间格式为:hh: mm: ss,即"小时:分钟:秒",当小时等于24小时,置为0. #include <stdio.h> ...

  2. Python与Javascript相互调用超详细讲解(2022年1月最新)(一)基本原理 Part 1 - 通过子进程和进程间通信(IPC)

    TL; DR 适用于: python和javascript的runtime(基本特指cpython[不是cython!]和Node.js)都装好了 副语言用了一些复杂的包(例如python用了nump ...

  3. leetcode 509. 斐波那契数

    问题描述 斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0,   F(1) = 1 F(N) ...

  4. 【reverse】逆向6 JCC

    [reverse]逆向6 JCC 前言 我们之前学习的时候讲了,eip寄存器存储的是当前(即将执行的语句的) 指向地址 而我们之前提到的下断点(F2),就和我们编程中的下断点一样,执行到某句汇编指令然 ...

  5. Java集合-ArrayList源码分析

    目录 1.结构特性 2.构造函数 3.成员变量 4.常用的成员方法 5.底层数组扩容原理 6.序列化原理 7.集合元素排序 8.迭代器的实现 9.总结 1.结构特性 Java ArrayList类使用 ...

  6. Solon Web 开发,七、视图模板与Mvc注解

    Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...

  7. golang中的标准库context

    在 Go http包的Server中,每一个请求在都有一个对应的 goroutine 去处理.请求处理函数通常会启动额外的 goroutine 用来访问后端服务,比如数据库和RPC服务.用来处理一个请 ...

  8. golang中通过bufio和os包读取终端中输入的一行带空格的数据

    1. 如果读取不带空格的数据可以使用fmt.Scan或fmt.Scanln读取一个或多个值,但是不能读取带空格的数据,可以使用bufio和os两个包结合 package main import ( & ...

  9. 计算机/linux启动过程

    开机过程指的是从打开计算机电源直到LINUX显示用户登录画面的全过程. 分析LINUX开机过程也是深入了解LINUX核心工作原理的一个很好的途径. 计算机开机过程是一个非常复杂的过程,想真正理解透彻并 ...

  10. maven常用打包命令

    常用maven命令 执行与构建过程(编译,测试,打包)相关的命令必须进入pom.xml所在位置执行 mvn clean:清理(打包好的程序放在生成的名为target的文件中,清理即删除文件中打包好的程 ...