AI 技术讲座精选:ChainerMN 分布式深度学习的性能

2017深度学习峰会于今年1月在旧金山落下帷幕。会上,PFN 发布了其在多节点环境下使用 Chainer 的分布式深度学习所取得的进展。在今天的这篇文章中,我会对 PFN 发布的这份报告作出详细的解释。

尽管 GPU 的性能正在不断提升,为了实现更高精度而使用更大的训练数据集,导致神经网络模型的参数和训练模型的计算成本也在不断的上升。在单 GPU上,若是使用包含 Chainer 的框架来训练模型,可能会花费一周多的时间。为了处理大型训练数据集,也为了提高迭代试错的效率,将多个 GPU 整合到一起来加速训练过程尤为重要。鉴于此,PFN 开发了一个名为 ChainerMN(Chainer Multi-Node)的程序包,在 Chainer 中增加了分布式训练的功能。

ChainerMN 的实现本质

现行的分布式训练的实现方式借助的是数据并行计算的方法,特别是模型同步更新。在这种方法中,每个工作单元都含有现行的模型,所有工作单元共同作用于某个小型数据集,将其分解为一个个更小的子集,随着每次的迭代过程而进行梯度计算。

ChainerMN 运用 MPI 进行节点间的通信,网路基础架构(如 Infiniband 等)的速度越快,对其越有利。而 GPU 之间的结点内通信运用的则是 Nvidia 的 NCCL。

性能评估结果

我们在 ImageNet 分类数据集上对 ChinerMN 的性能进行了评估,选用的是 CNN 模型(ResNet-50)。所有实验的运行环境,均由 Sakura 网络提供。更多细节请参考文章底部附件所示的试验设定。

请注意:在下文的评估中,我们会努力做到公平比较,如有偏颇,敬请谅解。首先,ChainerMN 对于实验环境已经做出了高度的优化,因为 ChainerMN 就是基于环境而开发的。其次,在后面的对比中,针对于其他架构的调试工作可能会不足,但我们已经尽力了。我们仔细地阅读了官方的文档和教程,甚至也包括 Github 上出现的问题。为了鼓励更多的人参与我们的实验,我们计划公开此次实验的代码以及其他相关框架的代码。

ChainerMN 的性能

下图表示的是,GPU 个数的增加量与训练时间缩短量之间的关系。当达到相同的点的时候,训练结束。当 GPU 的数量为4个时,只需要使用一个节点;而当其数量变为8个或者更多时,则需要多个节点。当设定使用128个 GPU 且对训练过程加速100倍时,训练的结果非常接近理想加速曲线。

AI 技术讲座精选:ChainerMN 分布式深度学习的性能

下图展示的是学习曲线,横轴和纵轴分别代表计算时间和确认准确率。曲线中不是很平滑的部分是学习率乘以0.1的结果(每30个点之后),是 ImageNet 任务在初始阶段的常见现象。

AI 技术讲座精选:ChainerMN 分布式深度学习的性能

对比其他框架

下图展现的是不同的框架结构使用128个 GPU 时的计算时间。让我们感到惊奇的是(PFN 开发团队同样感到惊奇),ChainerMN 是同类产品中计算速度最快的!接下来,我们会通过其他实验研究该结果出现的原因。

AI 技术讲座精选:ChainerMN 分布式深度学习的性能

接下来的这张图片展示的是,当改变 GPU 的数量时,不同框架的生产能力的变化。由于迭代次数比较少,测试得到的框架的生产力看起来有些不稳定,但其变化趋势是非常明显的。当 GPU 的数量为1时,MXNet 和 CNTK 的速度比 ChainerMN 要快,主要原因是前两个框架是用 C++ 实现的,而 Chainer 是用 Python 实现的。当 GPU 的数量为4时,只有 MXNet 的速度稍有下降。这是因为,CNTK 和 ChainerMN 在不同 GPU 之间通过 Nvida 的 NCCL 而收集信息。另一方面,在多节点设置中,MXNet 和 ChainerMN 展现出了比 CNTK 更好的可扩展性。在节点间和节点内通信的速度性能的比拼结果中,当 GPU 的数量为128时,ChainerMN 的生产能力最好,速度最快。

AI 技术讲座精选:ChainerMN 分布式深度学习的性能

请注意:在分析 TensorFlow 结果的时候,我们必须非常小心,因为 TensorFlow 在单机模式下已经足够快了。当 GPU 的数量为1时,TensorFlow 的性能表现的不是很好,这是因为它和其他的框架一样用的是分布式。由于使用 gRPC 框架在工作处理器和独立参数服务器间进行通讯,很可能带来了巨大的损耗。即便是在使用1个 GPU 的情况下,分布式 TensorFlow 的性能与其独立模式下的性能也是不一样的。这个结果与先前某些第三方针对分布式与多 GPU TensorFlow 性能测试的报告不谋而合,参见:

  • [1] “BenchmarkingState-of-the-Art Deep Learning Software Tools”(https://arxiv.org/abs/1608.07249v6), Shaohuai Shi etal., arXiv 2017.

  • [2] “Deep Learning Performance with P100 GPUs”(http://en.community.dell.com/techcenter/high-performance-computing/b/general_hpc/archive/2016/11/11/deep-learning-performance-with-p100-gpus), Rengan Xu and Nishanth Dandapanthu. Dell EMC HPC Innovation Lab.October 2016.

分布式深度学习所遇到的困难和挑战

分布式深度学习其中一个主要困难就是,较高的生产能力并不意味着更好的学习效率。例如,在数据并行方法中,如果增加 GPU 的数量,相应微型数据集的大小也会增加。然而,当微型数据集的大小超过某个特定的阈值时,就会严重影响到模型的升级,同时也会降低确认准确率。这是因为,训练的点数虽然相同,但迭代的次数却会依次减少,模型的成熟度难以达到。另外,随着梯度偏差变得越来越小,众所周知,模型很容易陷入局部最小值(极小值),使得最终模型的泛化能力不强。

不考虑环境而只考虑生产力的基准测试结果是没有意义的。如果仅仅通过相对大型的数据集活着降低了的模型同步频率,来猜测模型拥有很高的生产能力,毫无意义。因此,尽管 GPU 有足够的存储能力,我们仍会选取相对小的数据集来获得相对可靠的准确性。

未来

从二月开始,通过在 Preferred Networks 进行的内部测试,根据测试反馈回来的结果,我们对 ChainerMN 进行了完善,计划在未来几个月内发布这款开源的软件——ChainerMN。

附件:性能评估的部分细节

实验环境:

  • 32nodes,128 GPUs in total

  • 节点

1) GPU:4*GeForce GTX TITIAN X(Maxwell)

2) CPU:2*Intel(R) Xeon(R) CPU E5-2623 v3 @3.00GHz

3) Network: InfiniBand FDR 4X

实验设定:

  • Dataset: ImageNet-1k (1,281,158 images,already resized to 256x256 pixels before training)

  • Model: ResNet-50 (input image size: 224x224)

  • Training

1) Batch size: 32 per GPU (32 x #GPU is thetotal batch size)

2) Learning rate: multipy 0.1 after every 30epochs

3) Optimizer: Mometum SGD (momentum=0.9)

4) Weight decay: 0.0001

5) Training epoch: 100

请注意:以上设定根据的是原始文档 ResNet Paper[3]。然而,在训练的过程中我们既没有用到颜色扩充,也没有用到范围扩充,在确认的时候我们也没有用到 10-crop 预测和全卷积预测。即便是在这样的情况下,ChainerMN 的准确率依然达到了71%-72%,居于首位。该结果看起来非常合乎情理,也是已知的当下的最好结果。

  • [3] “Deep Residual Learning for ImageRecognition”(https://arxiv.org/abs/1512.03385),Kaiming He et al., CVPR 2016.

本文由 AI100 编译,转载需得到本公众号同意。


编译:AI100

原文链接:http://chainer.org/general/2017/02/08/Performance-of-Distributed-Deep-Learning-Using-ChainerMN.html


相关推荐