最近已有不少大厂停止秋招宣讲,准备计划准备春招吧。
节前,我们邀请了一些互联网大厂朋友、今年参加社招和校招面试的同学。
针对新手如何入门算法岗、该如何准备面试攻略、面试常考点、大模型技术趋势、算法项目落地经验分享等热门话题进行了深入的讨论。
总结链接如下:
《大模型面试宝典》(2024版) 发布!
喜欢本文记得收藏、关注、点赞。
流水线并行,是在大模型出来之后才逐渐火起来的。在此之前,大家可能听到数据并行和模型并行比较多。
原因有两个,之前模型小,单卡能放下;参数量大,但模型不深,所以模型分片也能做。流水线并行是由模型并行发展而来的。
那今天我们就白话来讲一下,什么是流水线并行?它到底解决了什么问题?
首先看下面这张图,完整的一个批次的学习包括三个阶段:
前向计算(F 表示)
后向计算(B 表示)
参数更新
现在模型大了,面临的困境时什么呢?
一张卡放不下,所以把模型切分成了 4 份(一般是均匀切分),放在了 4 个计算设备上,这里的计算设备可以是 CPU,也可以是 GPU, TPU 或者 NPU。
现在例如模型有 4 层,那每一个设备就放 1 层,例如 GPU1 放第 1 层,GPU2 放第 2 层,GPU1 放第 3 层,GPU4 放第 4 层。
我们想一下,这种方式有个潜在的问题,就是只有算完第一层的结果,才能计算第二层,以此类推,如下图所示。
所以 GPU1 在算第一层的时候,GPU2,3,4 都处于空闲状态。在反向的时候,刚好反过来,先计算第 4 层梯度,此时 GPU1,2,3 处于空闲状态。等到最后一个 B1 完成,所有参数再一起更新。
那我们算一下,整个过程,GPU 的空闲率是多少呢?
见上面那个图,可以很容易算出来:矩形框里面空白部分面积除以矩阵的面积:空闲部分面积/矩形面积=24/32 = 75%,也就是浪费了 75% 的算力。
这个空白部分,也叫“并行气泡”,目的就是优化气泡数,让它越少越好,理想情况就是实际计算填满整个矩阵。
其实很容易总结一下,这种最朴素的模型并行方式,空闲率=(K-1)/ K,K 是 GPU 的数量。
当 K 越大,即 GPU 的数量越多时,空置的比例基本接近 1,即 GPU 的资源大部分都被浪费掉了。
好,明白了这个,我们再来看看流水线并行是怎么做的?
我们来看下面这张图,总结一句话,就是把每次计算的批量大小再切小。
比如 batchsize=40,那就 batchsize 再切分成 4 份,每个 mini batch size 是 10,每次算完一个 mini batch 就马上传给下一个设备,计算下一层。这样交替着进行,直观上是不是 GPU 等待就少了很多?
我们算一下下面这个图的 GPU 空闲率:
空闲部分面积/矩形面积=(6*4)/56 =42.8%。
利用率提升了 30%+!如果把 mini batch 切得更小,利用率还可以进一步提升,实际上,此时的空闲率等于:(K-1)/(K+M-1),K 还是 GPU 数量,M 是 batch 切分的份数。
这种方法也叫 GPipe,最先由 Google 提出,原论文:GPipe: Efficient Training of Giant Neural Networks using Pipeline Parallelism,大家感兴趣可以去看看,后续有时间,我也会在我的【论文共读群】做详细解读。
那后来在此基础上呢,顺着这个思路,流水线并行还有很多优化的工作,如 1F1B 交错式调度/非交错式调度,DAPPLE,Chimera,TeraPipe,关于这些优化,大家如果有兴趣,我们后面继续探讨,欢迎大家持续关注。
好了,以上就是大模型中的流水线并行,你学会了吗?