首页 > 其他分享 >大规模分布式训练并行模式

大规模分布式训练并行模式

时间:2023-09-10 14:55:36浏览次数:38  
标签:mathbb 训练 并行 XA 矩阵 times 拆分 乘法 分布式

大规模分布式训练并行模式

数据并行 Data Parallelism

  模型在不同GPU上具有完全一致的副本,包括模型参数、模型梯度、模型优化器状态,这些都是完全相同的。唯一不同的是不同GPU上处理的数据是不同的,在每次梯度更新时,对所有数据产生梯度之和求平均,然后更新。

管道并行 Pipeline Parallelism

  当模型参数量较大时,单张卡无法存放模型参数,一种方式就是将模型各个层分拆到N张GPU卡上,这样就解决了模型过大,单张GPU卡无法存放模型所有参数的问题了。
  当采用管道并行时,最原始的使用方式,如Fig.1上半部分所示,保持原始的batch_size,会导致GPU大量空闲,每个时刻仅有单张GPU卡在工作,而其余的都处于空闲状态。一种解决办法如Fig.1下半部分所示,拆分原始的batch_size为若干份更小的micro_batchsize。之所以如此是更小的batchsize,位于计算过程前面的如device0 相对就计算更快,位于计算流程后面的如device1相对等待时间更短。

Fig. 1

张量并行 Tensor Parallelism

  Fig.2这张图很好的解释了张量并行模型。之所以可以如此,本质上是矩阵乘法定义所决定的。将矩阵乘法的两个矩阵A和B中一个或两个拆分成子矩阵,分块计算最后在合并,并不改变最终结果。

  • 拆分方式一

   设\(X \in \mathbb{R}^{n\times d}, A \in \mathbb{R}^{d \times m}, m=r+s\),这样就可以对矩阵\(A\)按列拆分为两部分,前r列\(A_1 \in \mathbb{R}^{d \times r}\),后s列\(A_2 \in \mathbb{R}^{d \times s}\), \(A = (A_1, A_2)\),于是

\[XA = X(A_1, A_2) = (XA_1, XA_2), \\ XA_1 \in \mathbb{R}^{n \times r}, XA_2 \in \mathbb{R}^{d \times s}\]

至此可以看出,数学上保证了矩阵乘法,将第二个乘法项按列拆分两个子矩阵,分别计算与子矩阵的乘法,与未拆分矩阵的乘法是等效的。

  • 拆分方式二

  设\(X \in \mathbb{R}^{n\times d}, A \in \mathbb{R}^{d \times m}, d=d_1+d_2\),也可以对矩阵按行拆分为两部分,前\(d_1\)行\(A_1 \in \mathbb{R}^{d_1 \times m}\),后\(d_2\)行\(A_2 \in \mathbb{R}^{d_2 \times m}\),\(A = \begin{pmatrix} A_1 \\ A_2 \end{pmatrix}\)。为了矩阵乘法进行,必须将\(X\)按照\(d=d_1+d_2\)按列方式进行拆分,即\(X = (X_1, X_2), X_1 \in \mathbb{R}^{n \times d_1}, X_2 \in \mathbb{R}^{n \times d_2}\)。于是

\[XA = (X_1, X_2) \begin{pmatrix} A_1 \\ A_2 \end{pmatrix} = X_1A_1 + X_2A_2 \\ X_1A_1 \in \mathbb{R}^{n \times m}\\ X_2A_2 \in \mathbb{R}^{n \times m}\]

至此可以看出,数学上保证了矩阵乘法,将第二个乘法项按行拆分两个子矩阵,将第一个乘法项按列拆分为两个子矩阵,分别计算对于子矩阵的乘法,与未拆分矩阵的乘法是等效的。

Fig. 2

  应用上面的分块矩阵操作,就可以对MLP操作进行改写。如下图所示,先按照拆分方式一对矩阵A进行按列拆分,得到对应结果后\((GeLU(XA_1), GeLU(XA_2))\),然后按照拆分方式二对矩阵B按行拆分,可以得到最终的\(Z\)

Fig. 3

ZeRO

ZeRO 是Zero Redundancy Optimizer的简称。训练模型显存被下面的数据所占用

  • 模型参数 \(weight\)
  • 模型梯度 \(gradient\)
  • 优化器状态量 \(optimizer \ states\)
  • 输入的中间特征 \(hidden \ states\)

如下图所示

Fig. 4

参考

https://huggingface.co/docs/transformers/v4.18.0/en/parallelism

标签:mathbb,训练,并行,XA,矩阵,times,拆分,乘法,分布式
From: https://www.cnblogs.com/wolfling/p/17678128.html

相关文章

  • 分布式缓存与本地缓存的优缺点
    本地缓存:1.访问速度快,但是无法进行大数据存储2.集群数据更新问题3.数据随应用的重启而丢失分布式缓存:1.支持大数据量存储,不受应用进程影响2.数据集中存储,保证数据的一致性3.数据读写分离,高性能,高可用4.数据跨网络传输,性能低于本地缓存......
  • 代码随想录算法训练营-回溯算法|491.递增子序列
    491. 递增子序列 不对原数组进行排序,利用set对同层的子集进行去重。1classSolution:2deffindSubsequences(self,nums):3result=[]4path=[]5self.backtracking(nums,0,path,result)6returnresult78......
  • 代码随想录算法训练营第四天| 24. 两两交换链表中的节点, 19.删除链表的倒数第N个结点
    24.两两交换链表中的节点mydemo(超时)/***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListNode(intx):val(x),next(nullptr){}*ListNode(intx,Lis......
  • 1-centOS7搭建伪分布式Hadoop
    前言:虚拟机快照的使用VMwareWorkstation软件可以用快照进行迅速的虚拟机状态的切换※.类似于虚拟机备份,可以使用备份进行快速恢复。比如没安装jdk之前拍摄快照来备份※.若jdk没安装好或者jdk环境变量配置的有问题,可以用安装之前的快照快速恢复虚拟机1.拍摄快照:2.恢复......
  • 2023-09-05 图论专项训练(五)
    我TM但凡有点水平也不至于一点水平没有吧。——每日感想T1距离/P4162[SCOI2009]最长距离这道题本质上是一道十分弱智的搜索题,无论是开DFS还是开BFS还是开BDFS都能做。本人在这里不建议使用使用deque进行BFS,理由是运行速度比较慢,稍有不慎就见祖宗了。我在这里使用DFS,但是纯......
  • 代码随想录算法训练营第三天| 203.移除链表元素 707.设计链表 206.反转链表
    203.移除链表元素链表定义structListNode{intval;ListNode*next;ListNode():val(0),next(NULL){};ListNode(intx):val(x),next(NULL){};ListNode(intx,ListNode*next):val(x),next(next){};}1.在原链表上移除链表元素classSolut......
  • tensorflow选择cpu/gpu训练
    http://www.taodudu.cc/news/show-3980798.html?action=onClick通过环境变量控制屏蔽GPUexportCUDA_VISIBLE_DEVICES=""通过训练代码控制https://blog.csdn.net/dream_to_dream/article/details/122249872选择CPU:importosos.environ["CUDA_DEVICE_ORDER"]="......
  • 分布式下AP与CP的区别
    在分布式中有一种理论叫CAP理论,C表示数据一致性,A表示系统可用性,P表示分区容错性,提出这个理论的人也指出了CAP这三者间只能有两个同时成立。先来解释一下P分区容错性,在分布式的情况下,应用都会搭一个集群,比如用户在使用一个服务的时候可能会有多个用户服务端,当一个用户在一个服务......
  • 深度学习模型训练中,输入数据维度和标签数据维度调整方法
    forinputs,labelsintrain_loader:#使用numpy的transpose函数调整维度顺序inputs=np.transpose(inputs,(0,3,1,2))#将原输入数据最后一个维度换到第二个维度inputs=inputs.to(device)print(inputs.shape)#调试代码用......
  • 并行编程(二)Julia中的顺序和异步编程
    概述这节课的主要目标是开始使用Julia编程,实现并行算法,本次课程中,特别关注语言的部分(函数式和异步编程)。 学习目标运行Julia代码安装Julia软件包编写连续的Julia代码使用Julia的函数式编程功能使用Julia的异步编程功能 WhyJulia?与高性能计算相关的课程通常使用C、C......