一种基于三元组的分布式深度学习通信的梯度优化压缩方法与流程

文档序号:32450989发布日期:2022-12-07 01:49阅读:149来源:国知局
一种基于三元组的分布式深度学习通信的梯度优化压缩方法与流程

1.本发明属于allreduce通信技术领域,具体涉及一种基于三元组的分布式深度学习通信的梯度优化压缩方法。


背景技术:

2.随着深度学习在各个领域的蓬勃发展,深度学习训练的模型规模和样本规模也在不断扩大,在单gpu训练无法满足计算性能需求与模型存储需求的情况下,使用多节点多gpu进行分布式深度学习已经成为目前的研究热点。但是使用分布式方式进行深度学习势必会集成以往分布式计算的一些缺陷,并行模型理想情况下可以达到串行模型的线性加速比提升,而真实情况下,线性加速比是一个很难实现的目标,而造成加速比偏差的原因,就是在分布式计算模型中,节点间的通信会占用大量的时间开销。
3.目前,分布式深度学习的并行模式可以分为数据并行和模型并行,数据并行由于其出色的可编码性和模型融合速度已经成为大多数分布式深度学习开发者的首选模式。在使用模型并行进行的分布式深度学习时,可以根据系统的架构使用两种不同的同步方式,一种是参数服务器(parameter server)架构,另一种是allreduce架构。参数服务器一般是使用除gpu节点以外的计算节点作为汇总所有其他节点计算梯度与分发更新参数的控制服务器,是一种中心化的通信架构,而allreduce是在所有gpu计算节点之间进行数据传输,在各自计算节点上使用其他所有节点计算的梯度更新参数,是一种典型的去中心化通信架构。由于allreduce同步方式出色的性能和较为成熟的生态支持,也成为了目前的主流训练方式。
4.在使用allreduce同步模型进行数据并行的分布式深度学习时,训练较大模型会引入较大的通信数据开销,即节点的迭代间数据同步时间会占用较大的整体训练时间,造成训练效率的严重下跌。
5.现有研究针对通信数据开销造成的训练效率下跌问题,集中于使用压缩算法对节点间同步的数据进行一定程度的压缩,尽可能地减少同步时的数据量。但是现有的压缩算法研究大多基于参数服务器架构进行开发,而使用allreduce架构时,由于同步方式的不同,节点会获取上一个节点的一部分压缩后数据,与本节点相对应数据求和后进行再次压缩,造成精度的进一步损失,因此需要一种针对allreduce通信架构的减少精度损失的压缩算法。


技术实现要素:

6.本发明所要解决的技术问题是针对上述现有技术的不足,提供一种基于三元组的分布式深度学习通信的梯度优化压缩方法,使用随机化的三元组压缩,构建增量迭代的同步求和算法,配合缓存空间的扩张算法,达到压缩通信数据量的目的,在保证分布式深度学习计算节点的迭代间等待时间不超过基准线的情况下提高单位时间内传输梯度的吞吐量并减少梯度的传输延迟,可解决使用allreduce进行分布式深度学习训练时通信数据量较
大,为了allreduce压缩引入的梯度精度损失叠加的问题。
7.为实现上述技术目的,本发明采取的技术方案为:
8.一种基于三元组的分布式深度学习通信的梯度优化压缩方法,包括:
9.步骤1:获取backward与optimizer使用的参数列表,由参数获取其对应的优化梯度列表;
10.步骤2:使用随机化的三元组压缩算法对梯度进行编码,将梯度分量压缩为两位二进制数,并存储编码中每个分量所占位数,同时选取扩张值;
11.步骤3:对步骤2编码后的完整数据进行节点间的allreduce同步,传输时使用三元组的求和方法进行增量位数迭代;
12.步骤4:allreduce同步结束后,每个节点拥有所有编码后的完整数据,按照编码后的完整数据对接收方的缓冲区进行扩张;
13.步骤5:调用解压缩算法,结合步骤2的扩张值,将编码后的完整数据解码;
14.步骤6:调用allreduce的求平均方法求取解码后每个梯度的平均值;
15.步骤7:根据步骤6每个梯度的平均值,使用pytorch或tensorflow的参数优化方法计算更新参数。
16.为优化上述技术方案,采取的具体措施还包括:
17.上述的梯度采用32为浮点数表示。
18.上述的步骤2具体如下:
19.步骤2.1:所有节点将本轮迭代计算出的最大分量值广播给其余所有节点;
20.步骤2.2:每个节点获取到其他节点的最大分量值后,选取整个系统本轮迭代的最大分量值,作为扩张值存储;
21.步骤2.3:使用扩张值进行概率运算,概率运算的结果代表每个分量在本轮迭代时压缩后的值;
22.步骤2.4:使用概率运算结果和每个分量的符号函数进行乘积操作,得出压缩后的分量值;
23.步骤2.5:对步骤2.4中的压缩结果进行编码,使用uint8数据类型存储所有分量的二进制编码,合并成为uint32数据后存储于缓冲区中,同时取一个uint8格式空间存入分量编码位数。
24.上述的步骤2.1中,所有节点使用broadcast通信方法,将本轮迭代计算出的最大分量值广播给其余所有节点。
25.上述的步骤3所述allreduce同步中,每个节点既是发送方也是接收方。
26.上述的步骤3所述三元组的求和方法具体为:
27.首先进行解码:获取编码中每个分量所占位数,按照uint32格式读取缓冲区数据,使用掩码与数据块相与,获得该分量数据;
28.其次进行加和、编码:分量数据进行加和操作后再按位写入uint32格式的缓冲区中,进行编码操作;
29.最后将加和结果和掩码进行移位运算,循环进行下一个数据分量的解码、加和、编码。
30.上述的步骤4使用的缓冲区扩张方法具体为:
31.按照编码中每个分量所占位数与所有分量的个数扩充接收方的缓冲区大小,同时更新每个梯度的入口指针。
32.上述的缓冲区扩张方法构建在horovod代码中,扩张所需的所有信息被编码到具体数据的二进制数据内,最后更新梯度的入口指针保证以最大限度保证与原有系统的兼容性。
33.上述的步骤5使用的解压缩算法具体步骤如下:
34.步骤5.1:读取编码中末位存储的分量所占位数;
35.步骤5.2:根据分量所占位数构造每次移位所需的按位与操作数;
36.步骤5.3:按照分量顺序,依次进行按位与和移位操作;
37.步骤5.4:对移位后得出的分量值进行位数扩充;
38.步骤5.5:按照梯度的形状和规模,将分量值填充进相应的结果梯度内;
39.步骤5.6:将步骤5.5中得到的梯度,乘以扩张值,作为最终解码结果返回。
40.上述的解压缩算法构建在compression.py文件中,使用pytorch或tensorflow的gpu方法对梯度数组进行处理。
41.本发明具有以下有益效果:
42.本发明基于压缩通信量减少通信开销的思想,提出梯度吞吐量和传输延迟两个优化目标,在保证分布式深度学习计算节点的迭代间等待时间不超过基准线的情况下提高单位时间内传输梯度的吞吐量并减少梯度的传输延迟。为了减少通信数据量,使用梯度的随机化三元组压缩算法将32为浮点数表示的梯度分量压缩为两位二进制数,考虑allreduce同步模型引入的梯度精度损失叠加问题,采用随reduce-scatter次数递增位数的同步方法。构建相应的梯度压缩和解压缩算法,增量迭代的求和算法和接收方的缓存扩张算法。在保证分布式深度学习计算节点的迭代间等待时间不超过基准线的情况下提高单位时间内传输梯度的吞吐量并减少梯度的传输延迟。
43.1、改进了allreduce架构中压缩算法的实施方法,将三元组压缩适配到allreduce架构中,并使用增量迭代的传输方式避免多次精度损失。解决了传统压缩算法大多面向参数服务器架构开发,在参数服务器架构下,每个节点计算出的梯度经过一次压缩便可发送给参数服务器进行汇总,而allreduce架构需要节点进行多次求和后压缩操作引入了精度的叠加损失的问题。
44.2、通过增量迭代求和可以避免节点求和后压缩引入的精度损失,通过上一节点压缩后数据与本节点压缩后数据求和,并编码为扩展精度的方式,辅以发送接收方的多次编解码操作,去掉了求和后的冗余压缩操作,避免了多次精度损失。
45.3、和传统的分布式深度学习通信压缩算法区别在于:
46.(1)面向同步架构不同:传统分布式深度学习压缩算法主要考虑参数服务器架构,即中心化的同步方式,没有考虑去中心化点对点传输方式的精度损失问题。本发明使用了增量迭代的方式对精度损失进行了优化,可以达到较好的效果。
47.(2)梯度求和算法不同:传统分布式深度学习压缩算法的求和算法,面对未经压缩的32位浮点数分量采用了普通的求和方法,面对经过压缩的梯度采用解压后求和的方法。本发明使用的求和方法面对经过压缩的梯度,使用按位与和位移的方法进行简单解码后求和,求和后根据结果的取值范围进行递增的编码操作。
附图说明
48.图1为本发明方法的流程图;
49.图2为对单个节点的压缩算法伪代码;
50.图3为求和结果取值范围的编码后所占位数示意图;
51.图4为allreduce压缩后时间线示意图;
52.图5为初次压缩与求和后的取值范围示意图;
53.图6为求和后二进制编码的示意图;
54.图7为本发明方法的实施流程图。
具体实施方式
55.以下结合附图对本发明的实施例作进一步详细描述。
56.本发明提出一种基于三元组的分布式深度学习通信的梯度优化压缩方法,使用梯度的随机化三元组压缩算法将32为浮点数表示的梯度分量压缩为两位二进制数,考虑allreduce同步模型引入的梯度精度损失叠加问题,采用随reduce-scatter次数递增位数的同步方法。构建相应的梯度压缩和解压缩算法,增量迭代的求和算法和接收方的缓存扩张算法。在保证分布式深度学习计算节点的迭代间等待时间不超过基准线的情况下提高单位时间内传输梯度的吞吐量并减少梯度的传输延迟。本发明构建在horovod基础平台之上,horovod是一个面向pytorch、tensorflow、mxnet等的通信中间件,其使用高性能通信库,如mpi、gloo、nccl等进行计算节点间的allreduce梯度同步。压缩算法与解压缩算法构建于horovod代码的compression.py文件中,采用面向对象的方式,保证与原有系统的兼容性的同时,使用pytorch、tensorflow的梯度矩阵处理办法,针对gpu等高性能处理器进行优化,避免冗余的内存复制操作,使用计算节点直接进行梯度压缩。求和算法构建在高性能通信库gloo之上,针对三元组梯度形式构建新的求和函数,并编写求和函数使用的编解码算法。
57.如图1和7所示,本发明梯度优化压缩方法包括如下步骤:
58.步骤1:获取pytorch或tensorflow的backward与optimizer使用的参数列表,由参数获取其对应的优化梯度列表;
59.步骤1:获取backward与optimizer使用的参数列表,由参数获取其对应的优化梯度列表;
60.步骤2:使用随机化的三元组压缩算法对梯度进行编码,将梯度分量压缩为两位二进制数,并存储编码中每个分量所占位数,同时选取扩张值;
61.调用压缩方法与编码方法将32位浮点数存储的梯度编码为三元组形式,并将每个分量所占位数编入最终结果;
62.步骤3:对步骤2编码后的完整数据进行节点间的allreduce同步,传输时使用三元组的求和方法进行增量位数迭代;
63.步骤4:allreduce同步结束后,每个节点拥有所有编码后的完整数据,按照编码后的完整数据对接收方的缓冲区进行扩张;
64.allreduce同步结束后,每个节点拥有所有编码后的完整数据,使用缓冲区扩张方法将所有缓存区扩充为分量位数乘以分量个数;
65.步骤5:调用解压缩算法,结合步骤2的扩张值,将编码后的完整数据解码为32位浮
点数;
66.步骤6:调用allreduce的求平均方法求取每个梯度的平均值;
67.步骤7:使用pytorch或tensorflow的参数优化方法计算更新参数。
68.优选地,所述步骤2具体如下:
69.步骤2.1:所有节点使用broadcast通信方法,将本轮迭代计算出的最大分量值广播给其余所有节点;
70.步骤2.2:每个节点获取到其他节点的最大分量值后,选取整个系统本轮迭代的最大分量值,作为扩张值存储;
71.步骤2.3:使用扩张值进行概率运算,概率运算的结果代表每个分量在本轮迭代时压缩后的值为0或其他的概率;
72.步骤2.4:使用概率运算结果和每个分量的符号函数进行乘积操作,得出压缩后的分量值;
73.步骤2.5:对步骤2.4中的压缩结果进行编码,使用uint8数据类型存储所有分量的二进制编码,合并成为uint32数据后存储于缓冲区中,同时取一个uint8格式空间存入分量编码位数。
74.其中,步骤2.1中使用的broadcast方式是horovod内建的一种通信方式,在使用三元组压缩时,进行梯度压缩方法调用之前会首先进行最大分量值的提取,提取后使用broadcast进行广播,并获取其他节点广播的结果,存储本轮迭代的最大分量值。由于在梯度的allreduce同步中,每个节点既是发送方也是接收方,同时也保存了本轮迭代的最大分量值,因此在解压缩时可以直接进行使用。
75.步骤3所述三元组的求和方法具体为:
76.首先进行解码:获取编码中每个分量所占位数,按照uint32格式读取缓冲区数据,使用掩码与数据块相与,获得该分量数据;
77.其次进行加和、编码:分量数据进行加和操作后再按位写入uint32格式的缓冲区中,进行编码操作;
78.最后将加和结果和掩码进行移位运算,循环进行下一个数据分量的解码、加和、编码。
79.求和方法构建在gloo库之上,gloo是facebook公司开发的一款高性能并行运算通信库,提供mpi兼容接口,并可以提供比openmpi更好的性能表现。具体的求和方法构建在gloo库的sum操作文件中,添加面向三元组的求和方法,并编写编码(encode)和解码(decode)函数。
80.所述步骤4使用的缓冲区扩张方法具体为:
81.按照编码中每个分量所占位数与所有分量的个数扩充接收方的缓冲区大小,同时更新每个梯度的入口指针。
82.缓冲区扩张方法同样构建在horovod代码中,缓冲区扩张是为了保证每轮allreduce方法结束后,结果拥有足够的存储空间存储全部完整数据,由于增量迭代的方法,最终结果会比发送方第一次压缩发送数据后占用的地址空间扩大几倍,因此需要扩张缓冲区以确保数据不会丢失,扩张所需的所有信息会被编码到具体数据的二进制数据内,最后更新梯度的入口指针保证以最大限度保证与原有系统的兼容性。
83.所述步骤5使用的解压缩算法是步骤2中压缩算法的逆操作,其具体步骤如下:
84.步骤5.1:读取三元组编码中末位存储的分量所占位数;
85.步骤5.2:根据分量所占位数构造每次移位所需的按位与操作数;
86.步骤5.3:按照分量顺序,依次进行按位与和移位操作;
87.步骤5.4:对移位后得出的分量值进行位数扩充,转换为32位浮点数;
88.步骤5.5:按照梯度的形状和规模,将上述分量值填充进相应的结果梯度内;
89.步骤5.6:将步骤5.5中得到的梯度,乘以步骤2.2中存储的扩张值,作为最终解码结果返回。
90.解压缩算法构建在compression.py文件中,使用pytorch或tensorflow的gpu方法对梯度数组进行处理。
91.如图2所示为三元组压缩算法的伪代码表现形式,具体步骤上面有所讲述。
92.如图3所示为每次增量迭代后,不同分量求和结果取值范围所占的二进制位数,在每个分量所占位数不超过8位的情况下,最多支持127个节点进行allreduce操作。
93.如图4所示为进行三元组压缩后迭代间,即节点的反向传播完成后,与前向传播开始之前的等待过程时间线。
94.如图5所示为压缩与求和结果示意图,上半侧表示每个32位浮点数分量将会在首次压缩时压缩为2位二进制数,取值范围从-1到1,下半侧表示求和后的取值范围,第一次求和后取值范围是-2到2,第二次求和的操作数取值范围不同,需要根据分量所占位数标注进行分别解码,求和后的取值范围从-3到3。
95.如图6所示为求和后的uint32编码形式,后8位灰色表示每个分量所占位数的标注,前24位为具体的分量数据,根据迭代次数的增加,每个分量所占位数逐渐增加。
96.本发明研究的是allreduce架构下,使用三元组压缩方法和增量迭代方法减小分布式深度学习训练通信数据量并减少精度损失的方法。在实际的分布式深度学习训练中,使用的软件生态多种多样,本发明基于horovod架构构建的压缩算法继承了horovod平台对pytorch和tensorflow的api支持,因此具有较好的兼容性和可迁移性。
97.本发明使用了一种随机化的三元组梯度压缩方法,将梯度中的每个分量由原来的32为浮点数压缩为二进制数。此外本发明考虑了allreduce同步架构带来的精度损失叠加问题,提出了一种增量迭代的传输方法。最后本发明基于horovod系统集成上述算法实现了对通信梯度吞吐量和传输延迟的优化。
98.以上仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,应视为本发明的保护范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1