模型训练的并行策略

起源于研究生时上分布式课程完全没搞懂,老师念课本讲闲话,压根不知道他在说啥。如今被回旋镖击中,重新整理一下训练大模型时的并行策略。
参考博文如下,以下内容对我很有启发:

https://mp.weixin.qq.com/s/_jdATeFy0h_nfDt_bIYTfQ

数据并行 Data Parallelism

理论就是在每个GPU上都放置一份完整模型,将数据进行划分,分配到不同GPU上。
比如有一张试卷,每个同学都要存放一个作业本,写自己被分配的题目(有的做选择,有的做填空),同学们都写完之后交给小组长进行批改,组长汇总了总分再告诉每个同学。

好了,再然后呢?模型训练时前向反向过程是如何进行的?梯度如何收集?数据并行有什么优缺点?

主要过程

实际上数据并行采用参数服务器这一编程框架(应该是李沐写的?没考证,有点印象)。
假设有N张卡,其中N-1张卡就作为worker,用来forward和backward,得到梯度。
剩下那块GPU就作为server,负责收集梯度,进行梯度聚合(累加),然后同步梯度给所有GPU,也就是all-reduce(把所有数据按某种规则(比如相加、求最大值)合并成一个结果,再这个合并后的结果同步给所有工人)操作。

缺点

存储开销:数据并行需要在单张卡上能存放下一个完整的模型,但随着模型越来越大,不仅单张卡根本放不下,而且不觉得所有卡都存放了相同的模型很冗余吗?

通讯开销:server要把梯度分发到所有worker手中,再指导他们根据梯度来进行模型参数更新。如果server和woker不在同一台服务器,那么带宽(传输数据的速度)就会成为瓶颈。就比如组长居然是隔壁班的,来给组员发试卷分数的时候,就很麻烦呀!所以数据并行一般适合单机多卡。

张量模型并行

把模型参数放到不同的GPU上进行独立计算,然后再做聚合。

假设模型W的维度为(h, h’),即h行h’列,我们可以对模型参数进行按行切分,也可以进行按列切分。

按行切分

假设分成N份,则每份权重的维度变成(h/N, h’)


模型训练的并行策略
https://abigail61.github.io/2025/04/07/并行策略/
作者
Yajing Luo
发布于
2025年4月7日
许可协议