本文主要研究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. CodeForces 519B A and B and Compilation Errors (超水题)

    这道题是超级水的,在博客上看有的人把这道题写的很麻烦. 用 Python 的话是超级的好写,这里就奉上 C/C++ 的AC. 代码如下: #include <cstdio> #includ ...

  2. 1010day-人口普查系统

    1.xiugai.java package com.edu.ia; import java.io.IOException;import java.sql.SQLException; import ja ...

  3. vscode配置Microsoft C++注意事项

    vscode配置c++插件教程链接如下: https://code.visualstudio.com/docs/cpp/config-msvc#_check-your-microsoft-visual ...

  4. CesiumJS下载量超过1百万次

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ CesiumJS的下载总量已经超过100万.这一里程碑对我们(C ...

  5. 「Python实用秘技04」为pdf文件批量添加文字水印

    本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第4期 ...

  6. 根据SVG Arc求出其开始角、摆动角和椭圆圆心

    SVG Arc 目前Svg的Arc的参数字符串如下: a rx ry x-axis-rotation large-arc-flag sweep-flag x y 除了a表示标识为Arc之外,其余参数说 ...

  7. gin框架中的渲染

    各种数据格式的响应 json.结构体.XML.YAML类似于java的properties.ProtoBuf 点击查看代码 // json响应 func someJson(context *gin.C ...

  8. mac下复制文件路径

    快捷键: option+command+C

  9. memcached 小记

    Memcached是一个自由开源的,高性能,分布式内存对象缓存系统. Memcached是一种基于内存的key-value存储,用来存储小块的任意数据(字符串.对象).这些数据可以是数据库调用.API ...

  10. JavaScript基本数据类型和引用数据类型详解

    数据类型小知识 JavaScript主要数据类型共有7种,有string.number.boolean.undefined.null.symbol.object.其余7种可以笼统的分为两大类:基本数据 ...