《电子技术应用》
您所在的位置:首页 > 通信与网络 > 业界动态 > GPU高效通信算法——Ring Allreduce

GPU高效通信算法——Ring Allreduce

2019-10-12

  今天介绍一种新的GPU多卡计算的通信优化算法——Ring Allreduce

  先来讲一下常规的GPU多卡分布式计算的原理。

  第一点:我们知道GPU在矩阵并行化计算方面非常有优势,所以适合深度学习的训练。

  第二点:使用多个GPU卡训练同一个深度学习任务就是分布式计算。

  第三点:在分布式计算过程中,需要对计算任务资源进行分片,通常的方式是将完整的网络结构放到每一个GPU上,然后将训练数据进行分片分发到不同的GPU卡上。

640 (2).JPEG

  于是GPU分布式计算的具体形式就比较清晰了,以上图为例。GPU1~4卡负责网络参数的训练,每个卡上都布置了相同的深度学习网络,每个卡都分配到不同的数据的minibatch。每张卡训练结束后将网络参数同步到GPU0,也就是Reducer这张卡上,然后再求参数变换的平均下发到每张计算卡,整个流程有点像mapreduce的原理。

  这里面就涉及到了两个问题:

  问题一,每一轮的训练迭代都需要所有卡都将数据同步完做一次Reduce才算结束。如果卡数比较少的情况下,其实影响不大,但是如果并行的卡很多的时候,就涉及到计算快的卡需要去等待计算慢的卡的情况,造成计算资源的浪费。

  问题二,每次迭代所有的计算GPU卡多需要针对全部的模型参数跟Reduce卡进行通信,如果参数的数据量大的时候,那么这种通信开销也是非常庞大,而且这种开销会随着卡数的增加而线性增长。

  为了解决这样的问题,就引入了一种通信算法Ring Allreduce,通过将GPU卡的通信模式拼接成一个环形,从而减少随着卡数增加而带来的资源消耗,如下图所示:

640 (1).JPEG

  将GPU卡以环形通信之后,每张卡都有一个左手卡和右手卡,那么具体的模型参数是如何传递的呢,可以看下图:

640.JPG

  因为每张卡上面的网络结构是固定的,所以里面的参数结构相同。每次通信的过程中,只将参数send到右手边的卡,然后从左手边的卡receive数据。经过不断地迭代,就会实现整个参数的同步,也就是reduce。

  形成以下这张图的样式:

640.webp (4).jpg

  通过Ring Allreduce的方式,基本上可以实现当GPU并行卡数的增加,实现计算性能的线性增长。

640.webp (3).jpg

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。