本文主要研究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. STM32新建模板之寄存器

    创建寄存器的项目模板相对比较简单,这里是基于库文件的模板进行更改的,有不明白的小伙伴可以浏览STM32新建模板之库文件. 一.项目文件 拷贝库文件的工程模板重命名为"stm32f10x_re ...

  2. 个人作业2-Java代码实现数据检索并实现可视化

    1.bean实体层 package bean; public class Bean { private String title; private String Abstract; private S ...

  3. 【记录一个问题】go.mod中使用replace后,编译出现神奇的错误:

    biz\child.go:5:2: imported and not used: "xxx.com/start/common/src/polaris" as biz biz\chi ...

  4. vscode控制台中文乱码

    原因 vscode中文控制台乱码原因是调用的cmd的显示. 所以问题实际上是cmd的显示中文乱码问题.当然还有其他方法仅仅修改vscode的显示,这里不在说明. cmd中国版本windows默认是93 ...

  5. gin中的query和postform用法

    package main import ( "github.com/gin-gonic/gin" ) func main() { r := gin.Default() // Que ...

  6. Docker 与 K8S学习笔记(二十)—— 使用Downward API向容器注入Pod信息

    Kubernetes在创建Pod时,会为Pod和容器设置一些额外的信息,比如Pod名称.Pod IP.Node IP.Label.Annotation.资源限制等,我们经常会在应用程序中使用到这些数据 ...

  7. log4j学习记录以及相关配置(精简版)

    使用log4j时关键配置 log4j的maven依赖 <dependency> <groupId>log4j</groupId> <artifactId> ...

  8. MySQL 5.7.19 简易安装、卸载教程

    前言:传统的 exe 文件安装的MySQL,安装后特别难卸载,而且一旦处理不好,就容易出错,想再安装别的版本也不容易.因为这种方式的安装,虽然是不断的下一步,但是卸载的时候需要处理很多,在本文最后,有 ...

  9. Lesson8——Pandas reindex重置索引

    pandas目录 1 简介 重置索引(reindex)可以更改原 DataFrame 的行标签或列标签,并使更改后的行.列标签与 DataFrame 中的数据逐一匹配.通过重置索引操作,您可以完成对现 ...

  10. 尚硅谷全套课件整理:Java、前端、大数据、安卓、面试题

    目录 Java 尚硅谷 IT 精英计划 JavaSE 内部学习笔记.pdf 尚硅谷 Java 基础实战之银行项目.pdf 尚硅谷 Java 技术之 JDBC.pdf 尚硅谷 Java 技术之 Java ...