大模型(LLMs)分布式训练面试指南
来源:AiGC面试宝典 作者:宁静致远 日期:2023年09月29日
1. 理论篇
1.1 训练大语言模型存在什么问题?
- 显存效率:模型参数量太大,显存不够用
即使目前显存最大的GPU也放不下这些大模型的模型参数。例如:175B参数量的GPT-3模型参数需要占用700GB($175B \times 4bytes$)的显存。参数梯度是700GB,Adam优化器状态需要1400GB,共计需要2.8TB的显存。
📝通俗解释:就像一本超大号的百科全书,一张桌子根本放不下。175B参数量的模型就像1750亿个字的书,需要的内存相当于2800GB的硬盘,而最好的显卡只有80GB内存,根本装不下。
- 计算效率:训练数据量多,模型参数量大,计算量大,单机训练时间久
即使我们能将大模型放在一张GPU上,训练大模型需要的海量计算操作也需要耗费很长时间。例如:用英伟达A100显卡训练175B参数量的GPT-3模型大约需要288年。
📝通俗解释:这就像用一台普通计算器计算全世界所有人的名字,工作量太大,时间太长,等模型训练完,太阳系都可能毁灭了。
1.2 什么是点对点通信?
[图表描述:图中展示了四个节点Rank 0、Rank 1、Rank 2、Rank 3。Rank 0发送数据给Rank 3,Rank 1发送数据给Rank 3。]
- 点对点通信思路:一个进程发送数据,一个进程接收数据
- 优点:速度快,成本低
📝通俗解释:就像两个人打电话,一个人说,另一个人听,简单直接,速度最快。
1.3 什么是集体通信?
[图表描述:左侧展示了Reduce操作,Rank 0、1、2、3的数据汇聚到Rank 0,计算公式为$[T = t0 + t1 + t2 + t3]$。右侧展示了AllReduce操作,Rank 0、1、2、3之间全连接通信,最终每个节点都得到总和,计算公式为$[T = t0+t1+t2+t3]$。]
- 集体通信思路:多个进程发送数据,多个进程接收数据
- 缺点:速度慢,成本高
📝通俗解释:就像全班同学轮流自我介绍,老师要让每个人都听到所有人的介绍,需要反复沟通,效率比较低。
1.4 什么是数据并行?
- 介绍:将整个数据集切分为多份,每张GPU分配到不同的数据进行训练,每个进程都有一个完整的模型副本。
[图表描述:上图展示了"本地训练神经网络的迭代过程":输入数据→前向传递计算损失→后向传递计算梯度→优化器更新模型参数→保存模型。下图展示了"数据并行的迭代过程":分为机器一和机器二。机器一流程:输入数据→前向传递local→后向传递local→AllReduce梯度通信→优化器更新local→保存模型。机器二流程:输入数据→前向传递local→后向传递local→AllReduce梯度通信→优化器更新local。两个机器之间通过"通信环节"连接AllReduce步骤。]
- 关键:保证多个GPU上的模型副本是相同的
- 确保所有worker都从相同的初始化模型参数开始训练。在训练开始前,通常会将0号卡的模型参数通信同步到其他卡。
- 每次训练迭代中,在后向传递之后、优化器更新参数之前,插入reduce通信操作来规约梯度,确保所有worker上的梯度都是相同的。
📝通俗解释:就像让多个同学同时抄写同一本书(模型副本),每个人负责不同的章节(数据),学完后互相交流心得(AllReduce梯度),确保大家学到的知识一致,然后再各自更新自己的理解(更新模型参数)。
相同的初始化模型参数 + 相同的梯度 → 相同的模型参数。
1.5 数据并行如何提升效率?
- 梯度分桶:动机是集体通信在大张量上比在小张量上效率更高
- 计算与通信重叠:有了梯度分桶之后,在等待同一个桶内的梯度计算完后,就可以进行通信操作
- 跳过梯度同步:梯度累加,减少梯度通信的频次
[图片描述:包含三个图表]
- 左图(计算与通信重叠):柱状图展示了不同模型的归一化延迟分解。图例包括FWD(前向)、BWD(后向)、COMM(通信)、OPT(优化器)以及Overlap(重叠部分,橙色)。图表显示通过重叠通信可以显著减少总时间。
- 中图(梯度分桶bucket_size的影响):散点图/箱线图展示了Bucket Size对Per Iteration Latency的影响。
- 右图(跳过梯度同步):折线图展示了GPU数量对Average Per Iteration Latency的影响。随着GPU数量增加,no_sync系列的延迟增长较缓。
📝通俗解释:
- 梯度分桶:就像搬家时把所有小箱子打包成几个大箱子一次性搬运,比一个个搬更省力
- 计算与通信重叠:边听老师讲课边做笔记,而不是听完再做
- 跳过梯度同步:每处理几批数据再交流一次,而不是每批都交流,减少沟通次数
1.6 什么是流水线并行?
- 层间划分,将不同的层划分到不同的GPU上
- 前3层在0号卡上,后3层在1号卡上
[图表描述:神经网络层间划分示意图,展示了一个多层神经网络被垂直分割为左右两部分]
[图表描述:GPipe与PipeDream流水线并行对比图]
- GPipe:展示了设备1到设备4的时间轴。Forward Pass依次通过各个设备,完成后进行Backward Pass。中间有"Pipeline flush"标记,右侧显示"Devices idle",表明存在气泡(空闲时间)。
- PipeDream:展示了设备1到设备4的时间轴。Forward Pass和Backward Pass交错进行,使得设备利用率更高。
- 底部文字:显存效率:PipeDream > GPipe
📝通俗解释:就像工厂的流水线,第一道工序在GPU 0完成传给GPU 1,第二道工序在GPU 1完成传给GPU 2。每个GPU只负责几层,这样一张显卡就装得下整个模型了。
1.7 什么是张量并行(intra-layer)?
- 层内划分:切分一个独立的层划分到不同的GPU上
- 0号卡和1号卡分别计算某个层的不同部分
[图表描述:神经网络层内划分示意图,展示了一个多层神经网络被水平分割为上下两部分]
对于一个简单的矩阵乘法GEMMs $Y = XA$,按照对权重矩阵A的分块方式,张量并行分为行并行和列并行。
行并行 vs 列并行
行并行:权重矩阵A按行分为两块,同时将输入X按列分为两块。
$$ A = \begin{bmatrix} A_1 \ A_2 \end{bmatrix}; X = [X_1 \quad X_2] $$
$$ XA = [X_1 \quad X_2] \begin{bmatrix} A_1 \ A_2 \end{bmatrix} = X_1A_1 + X_2A_2 = Y_1 + Y_2 = Y $$
列并行:将权重矩阵A按列来分成两块,不用分割输入X。
$$ A = [A_1 \quad A_2] $$
$$ XA_1 = Y_1, \quad XA_2 = Y_2, \quad XA = Y = [Y_1, Y_2] $$
行并行(计算图流程)
- 输入层($f$):
- forward:$X_i$ (split)
- backward:$\frac{\partial L}{\partial X} = [\frac{\partial L}{\partial X_1}, \frac{\partial L}{\partial X_2}]$ (all-gather)
- 中间计算:$X_1, X_2$分别计算$X_1A_1, X_2A_2$得到$Y_1, Y_2$
- 输出层($g$):
- forward:$Y = Y_1 + Y_2$ (all-reduce)
- backward:$\frac{\partial L}{\partial Y_1} = \frac{\partial L}{\partial Y}$ (identity)
列并行(计算图流程)
- 输入层($f$):
- forward:$X$ (identity)
- backward:$\frac{\partial L}{\partial X} = \frac{\partial L}{\partial X}|_1 + \frac{\partial L}{\partial X}|_2$ (all-reduce)
- 中间计算:$X$分别计算$XA_1, XA_2$得到$Y_1, Y_2$
- 输出层($g$):
- forward:$Y = [Y_1, Y_2]$ (all-gather)
- backward:$\frac{\partial L}{\partial Y_i}$ (split)
📝通俗解释:就像两个人合作做一道数学题,张量并行是把一道大题拆成两部分,一个人算前半部分,一个人算后半部分,最后把结果拼起来。这种方式可以让一张显卡只装得下一个层的一半参数。
1.8 数据并行 vs 张量并行 vs 流水线并行?
| 并行方式 | 特点 |
|---|---|
| 数据并行 | 计算效率高、实现简单 |
| 显存效率:每张卡上都保存了完整的模型、梯度、优化器状态,显存效率不高 | |
| 计算效率:当增加并行度时,单卡计算量保持恒定,可实现近乎完美的线性扩展。但规约梯度的通信开销与模型大小成正相关 | |
| 张量并行 | 因模型结构而异,实现难度大 |
| 显存效率:随着并行度增加,成比例地减少显存占用。是减少单层神经网络中间激活的唯一方法 | |
| 计算效率:频繁的通信,限制了两个通信阶段之间的计算量,计算效率很低 | |
| 流水线并行 | 通信成本最低 |
| 显存效率:减少的显存与流水线并行度成正比。但流水线并行不会减少每层中间激活的显存占用 | |
| 计算效率:成本更低的点对点(P2P)通信。通信量与流水线各个阶段边界的激活值大小成正比 |
显存效率:模型并行 > 流水线并行 > 数据并行
通信效率:流水线并行 > 数据并行 > 模型并行
📝通俗解释:这三种并行方式就像三种不同的分工方式:
- 数据并行:每个人复制整个任务,各干一部分,然后汇总
- 张量并行:把任务拆成几块,每个人负责一块
- 流水线并行:每个人只做任务的一部分,形成流水线
1.9 什么是3D并行?
[图表描述:图中展示了Data Parallel Rank 0和Data Parallel Rank 1两个大组。每个Rank内部包含Pipeline Stage 0、1、2、3四个阶段。每个Stage内部又包含了多个并行的计算单元(如MP 1、MP 2...),代表张量并行。]
3D并行:4路张量并行,4路流水线并行,2路数据并行,共32个workers。
📝通俗解释:3D并行就是三种方式一起用,比如一个团队里既有分工(张量并行),又有流水线(流水线并行),还有多组同时干活(数据并行),这样就能训练超大规模的模型。
1.10 想要训练1个LLM,如果只想用1张显卡,那么对显卡的要求是什么?
显卡显存足够大,nB模型微调一般最好准备20nGB以上的显存。
📝通俗解释:比如要训练一个7B的模型,至少需要7×20=140GB的显存,这基本上市面上的单卡都做不到,所以需要并行训练。
1.11 如果有N张显存足够大的显卡,怎么加速训练?
数据并行(DP),充分利用多张显卡的算力。
📝通俗解释:就像有N个人同时帮你干活,每个人都训练一部分数据,最后把结果汇总,这样训练速度就能快N倍。
1.12 如果显卡的显存不够装下一个完整的模型呢?
最直观的想法是需要分层加载,把不同的层加载到不同的GPU上(accelerate的device_map),也就是常见的PP(流水线并行)。
📝通俗解释:就像一本大书一张桌子放不下,那就把书分成几部分,分别放在几张桌子上。
1.13 PP推理时,是一个串行的过程,1个GPU计算,其他空闲,有没有其他方式?
- 横向切分:流水线并行(PP),也就是分层加载到不同的显卡上
- 纵向切分:张量并行(TP),在DeepSpeed世界里叫模型并行(MP)
📝通俗解释:PP是按"层"切分,TP是按"每层的参数"切分。PP让GPU串行工作,TP可以让多个GPU同时计算同一层的不同部分。
1.14 3种并行方式可以叠加吗?
是可以的,DP+TP+PP,这就是3D并行。**如果真有1个超大模型需要预训练,3D并行是必不可少的。**毕竟显卡进化的比较慢,最大显存的也就是A100 80G。
单卡80G可以完整加载小于40B的模型,但是训练时+梯度+优化器状态,5B模型就是上限了。而现在100亿以下(10B以下)的LLM只能叫small LLM。
📝通俗解释:三种并行方式可以组合使用,就像一个公司可以既有部门(数据并行),又有项目组(流水线并行),还有小组(张量并行),这样就能处理超大的项目。
1.15 Colossal-AI有1D/2D/2.5D/3D,是什么情况?
Colossal-AI的nD是针对张量并行,指的是TP的切分方式,对于矩阵进行各种切分,和3D并行不是一回事。
📝通俗解释:Colossal-AI的2D、2.5D、3D是指张量并行的不同切分方式,是一种更高级的张量并行实现,和数据并行+流水线并行的3D并行概念不同。
1.16 除了3D并行有没有其他方式大规模训练?
可以使用更优化的数据并行算法FSDP(类似ZeRO-3)或者直接使用DeepSpeed ZeRO。
📝通俗解释:除了3D并行,还可以使用更"聪明"的数据并行,比如ZeRO技术,它可以把模型参数、梯度、优化器状态分片存储,让每张卡只保存一部分,大大减少显存占用。
1.17 有了ZeRO系列,为什么还需要3D并行?
根据ZeRO论文,尽管张量并行的显存更省一点,张量并行的通信量实在太高,只能限于节点内(有NVLINK)。如果节点间张量并行,显卡的利用率会低到5%。
但是,根据Megatron-LM的论文,当显卡数量增加到千量级,ZeRO-3是明显不如3D并行的。
[图表描述:图表展示了PTD-P和ZeRO-3在两种不同GPT模型(175B和530B)下的每GPU吞吐量。ZeRO-3随着GPU数量增加,吞吐量显著下降;而PTD-P在GPU数量增加时保持相对稳定的高吞吐量。]
📝通俗解释:ZeRO就像一个省钱但效率不高的方案,小规模用用还可以。当显卡数量特别多(上千张)时,ZeRO的通信瓶颈就很明显了,而3D并行虽然实现复杂,但效率更高。
1.18 平民适不适合玩3D并行?
不适合。
**3D并行的基础是节点内显卡间NVLINK超高速连接才能上TP。有没有NVLINK都是个问题。**而且节点间特殊的网络通常有400Gb/s,远超普通IDC内的万兆网络10Gb/s。
📝通俗解释:3D并行就像需要顶级配置的游戏,普通显卡根本带不动。NVLINK就像显卡之间的高速公路,没有这条路,显卡之间传输数据太慢,效率很低。
1.19 平民适不适合直接上多机多卡的ZeRO-3(万兆网)?
不适合。
想象一下,当65B模型用ZeRO-3,每一个step的每一张卡上需要的通信量是195GB(3倍参数量),也就是1560Gb。万兆网下每步也要156s的通信时间,这画面太美。
📝通俗解释:65B模型用ZeRO-3,每步需要传输1560Gb的数据,万兆网每秒只能传10Gb,需要156秒,光通信就要等好几分钟,训练效率极低。
1.20 分布式并行及显存优化技术有哪些,都有什么特点?
| 技术类型 | 代表框架 | 特点 |
|---|---|---|
| 数据并行 | PyTorch DDP | 实现简单,计算效率高 |
| 模型/张量并行 | Megatron-LM(1D)、Colossal-AI(2D、2.5D、3D) | 减少单卡显存占用 |
| 流水线并行 | GPipe、PipeDream、PipeDream-2BW、PipeDream Flush(1F1B) | 减少显存,支持超大模型 |
| 多维混合并行 | 3D并行(数据并行+模型并行+流水线并行) | 适用于超大规模训练 |
| 自动并行 | Alpa(自动算子内/算子间并行) | 自动选择最优并行策略 |
| 优化器相关并行 | ZeRO(零冗余优化器)、PyTorch FSDP | 分片存储,减少显存 |
📝通俗解释:分布式训练技术就像不同的"干活方式",有的让人人都有完整工作(数据并行),有的把工作拆开分给不同人(张量并行),有的让人排成队流水线干活(流水线并行)。
1.21 显存优化技术有哪些,都有什么特点?
| 技术 | 原理 | 特点 |
|---|---|---|
| 重计算(Recomputation) | Activation checkpointing,用时间换空间 | 减少激活值显存占用,增加计算时间 |
| 卸载(Offload)技术 | 模型参数在CPU内存和GPU显存之间来回切换 | 用通信换显存,如ZeRO-Offload、ZeRO-Infinity |
| 混合精度(BF16/FP16) | 使用半精度浮点数 | 降低显存消耗,提升训练速度2-4倍 |
| BF16 | 计算时可避免溢出,很少出现Inf | |
| FP16 | 超过65506时可能溢出,出现Inf |
📝通俗解释:
- 重计算:就像做完题不记过程,需要时再算一遍,省内存但费时间
- 卸载技术:就像把部分工作记在纸上(CPU内存),需要时再翻出来看
- 混合精度:就像用简写来记笔记,省地方但可能不太精确
1.22 常见的分布式训练框架有哪些,都有什么特点?
第一类:深度学习框架自带的分布式训练功能
- TensorFlow、PyTorch、MindSpore、OneFlow、PaddlePaddle等
第二类:基于现有深度学习框架进行扩展和优化
- Megatron-LM(张量并行)
- DeepSpeed(ZeRO-DP)
- Colossal-AI(高维模型并行,如2D、2.5D、3D)
- Alpa(自动并行)
📝通俗解释:分布式训练框架就像不同的"工作流程系统",有自带的(PyTorch DDP),也有专门优化的(DeepSpeed、Megatron-LM)。
2. 实践篇
2.1 假如有超多的8卡A100节点(DGX A100),如何应用3D并行策略?
- 首先,张量并行:3种并行方式里,张量并行对于GPU之间的通信要求最高,而节点内有NVLINK通信速度可以达到600GB/s
- 其次,流水线并行:每个节点负责一部分层,每35个节点组成一路完整的流水线,也就是一个完整的模型副本,这里一个模型副本需280卡
- 最后,数据并行:官方也做了8路、10路、12路的并行实验
参考:Megatron-Turing NLG 530B
📝通俗解释:大规模训练就像管理一个大工厂,先在车间内分工(张量并行),再把不同车间连成流水线(流水线并行),最后多组同时开工(数据并行)。
2.2 如果想构建这样一个大规模并行训练系统,训练框架如何选?
可以参考Megatron-Turing NLG 530B:NVIDIA Megatron-LM + Microsoft DeepSpeed
BLOOM则是PP+DP用DeepSpeed,TP用Megatron-LM
📝通俗解释:不同框架擅长不同的事,Megatron-LM擅长张量并行,DeepSpeed擅长数据并行和流水线并行,结合使用效果最好。
2.3 训练框架如何选?
下面这个图是BLOOM的一个实验,DP/TP/PP都能降显存,核心是要降到单卡峰值80G以下。
真大模型就是要TP=8,充分利用NVLINK,然后优先PP,最后DP。
| GPUs | Size | DP | TP | PP | MBS | Mem | TFLOPs | Notes |
|---|---|---|---|---|---|---|---|---|
| 8 | 20B | 1 | 8 | 1 | 1 | 68GB | 107.48 | |
| 80 | 200B | 1 | 8 | 10 | 1 | 75GB | 97.82 | |
| 160 | 200B | 2 | 8 | 10 | 1 | 53GB | 96.19 |
然而假大模型(7B)比如LLaMA-7B,可以不用3D并行,直接用DeepSpeed ZeRO更方便,参考Open-LLaMA项目。
📝通俗解释:对于真正的超大模型(几百B),需要用TP=8(8路张量并行),充分利用显卡间的高速通信,然后优先用流水线并行,最后才考虑数据并行。对于小模型(7B),直接用DeepSpeed ZeRO就足够了。
3. 并行化策略选择篇
3.1 如何选择一款分布式训练框架?
- 训练成本:不同的训练工具,训练同样的大模型,成本是不一样的。对于大模型,训练一次动辄上百万/千万美元的费用。合适的成本始终是正确的选择。
- 训练类型:是否支持数据并行、张量并行、流水线并行、多维混合并行、自动并行等
- 效率:将普通模型训练代码变为分布式训练所需编写代码的行数,我们希望越少越好
- 灵活性:选择的框架是否可以跨不同平台使用?
📝通俗解释:选框架就像选工具,要考虑成本(花钱多少)、功能(能不能干这个活)、易用性(好不好学)、兼容性(能不能在不同电脑上用)。
3.2 如何选择技术栈?
- TPU + XLA + TensorFlow/JAX:由Google主导,TPU和自家云平台GCP深度绑定
- GPU + PyTorch + Megatron-LM + DeepSpeed:由NVIDIA、Meta、Microsoft大厂加持,社区氛围活跃,也更受大家欢迎
📝通俗解释:目前最流行的是PyTorch + Megatron-LM + DeepSpeed组合,因为生态好、社区活跃、文档完善。
3.3 单GPU
- 显存够用:直接用
- 显存不够:上offload,用CPU
📝通俗解释:一张显卡够用就直接用,不够就把部分数据放到内存里,用CPU帮忙处理。
3.4 单节点多卡
- 显存够用(模型能装进单卡):DDP或ZeRO
- 显存不够:TP或者ZeRO或者PP
重点:没有NVLINK或者NVSwitch,也就是穷人模式,要用PP
📝通俗解释:多张显卡在同一台电脑上,如果没有高速连接(NVLINK),张量并行效果不好,最好用流水线并行。
3.5 多节点多卡
如果节点间通信速度快(穷人的万兆网肯定不算): ZeRO或者3D并行,其中3D并行通信量少但是对模型改动大。
如果节点间通信慢,但显存又少: DP+PP+TP+ZeRO-1
📝通俗解释:多台电脑一起训练,网络快就用ZeRO或3D并行,网络慢就多种方法组合起来用。
4. 问题篇
4.1 推理速度验证
ChatGLM在V100单卡的推理耗时大约高出A800单卡推理的40%。
ChatGLM推理耗时和问题输出答案的字数关系比较大:
- 答案字数500字以内,A800上大概是每100字耗时1秒
- V100上大概是每100字耗时1.4秒
ChatGLM在A800单卡推理耗时统计
| 问题 | 运行次数 | 平均答案长度 | 平均耗时 |
|---|---|---|---|
| 给我介绍一下苹果公司,50个字 | 5 | 146.6 | 1.95s |
| 给我介绍一下微软公司,50个字 | 5 | 104.6 | 1.30s |
| 给我介绍一下苹果公司,100个字 | 5 | 165.4 | 2.10s |
| 给我介绍一下微软公司,100个字 | 5 | 154.4 | 1.91s |
| 给我介绍一下苹果公司,200个字 | 5 | 168.4 | 2.13s |
| 给我介绍一下微软公司,200个字 | 5 | 208.8 | 2.61s |
| 给我介绍一下苹果公司,300个字 | 5 | 443.4 | 5.40s |
| 给我介绍一下微软公司,300个字 | 5 | 484.2 | 5.98s |
| 给我介绍一下苹果公司,500个字 | 5 | 525.4 | 6.25s |
| 给我介绍一下微软公司,500个字 | 5 | 591.6 | 6.96s |
ChatGLM在V100单卡推理耗时统计
| 问题 | 运行次数 | 平均答案长度 | 平均耗时 |
|---|---|---|---|
| 给我介绍一下苹果公司,50个字 | 5 | 138.4 | 2.76s |
| 给我介绍一下微软公司,50个字 | 5 | 78.8 | 1.57s |
| 给我介绍一下苹果公司,100个字 | 5 | 144.6 | 2.87s |
| 给我介绍一下微软公司,100个字 | 5 | 180.8 | 3.49s |
| 给我介绍一下苹果公司,200个字 | 5 | 168.8 | 3.47s |
| 给我介绍一下微软公司,200个字 | 5 | 268.6 | 5.27s |
| 给我介绍一下苹果公司,300个字 | 5 | 460.2 | 9.27s |
| 给我介绍一下微软公司,300个字 | 5 | 472.2 | 9.08s |
| 给我介绍一下苹果公司,500个字 | 5 | 558 | 11.04s |
| 给我介绍一下微软公司,500个字 | 5 | 585.4 | 11.41s |
结论:
- 训练效率方面:多机多卡训练,增加训练机器可以线性缩短训练时间
- 推理性能方面:
- ChatGLM在V100单卡的推理耗时大约高出A800单卡推理的40%
- ChatGLM推理耗时和问题输出答案的字数关系比较大
📝通俗解释:A800比V100快大约40%,这就是为什么大家都在抢更好的显卡。答案越长,推理时间越长,因为需要生成更多字。
4.2 并行化训练加速
可采用DeepSpeed进行训练加速,目前行业开源的大模型很多都是采用基于DeepSpeed框架加速来进行模型训练的。
DeepSpeed在深度学习模型软件体系架构中所处的位置:
DL model → train optimization(DeepSpeed) → train framework → train instruction (cloud) → GPU device
当然需要对比验证DeepSpeed的不同参数,选择合适的参数。分别对比stage 2和stage 3进行验证,在GPU显存够的情况下,最终使用stage 2。
📝通俗解释:DeepSpeed就像一个加速器,可以把模型训练变得更省显存、更快。Stage 2适合显存够用的情况,Stage 3适合显存不够的情况。
4.3 DeepSpeed训练过程,报找不到主机
解决方法:DeepSpeed的关联的多机的配置文件Hostfile配置中使用IP,不使用hostname
📝通俗解释:就像打电话时要用手机号码而不是人名,配置多台电脑时要写IP地址而不是电脑名字。
4.4 为什么多机训练效率不如单机?
多机训练可以跑起来,但是在多机上模型训练的速度比单机上还慢。
通过查看服务器相关监控,发现是网络带宽打满,上不去了,其他系统监控基本正常。原理:初始的多机之间的网络带宽是64Gbps,后面把多机之间的网络带宽调整为800Gbps,问题解决。
实验验证,多机训练的效率,和使用的机器数成线性关系,每台机器的配置一样。如一台GPU机器跑一个epoch需要2小时,4台GPU机器跑一个epoch需要半小时。除了训练速度符合需求,多机训练模型的loss下降趋势和单机模型训练的趋势基本一致,也符合预期。
📝通俗解释:多机训练就像多人协作干活,如果沟通不畅(网络带宽低),反而不如一个人干。现在很多公司内部网络只有万兆(10Gbps),不够用的。
4.5 多机训练不通,DeepSpeed配置问题
多机间NCCL不能打通
解决方法:新建.deepspeed_env文件,写入如下内容:
NCCL_IB_DISABLE=1
NCCL_DEBUG=INFO
NCCL_SOCKET_IFNAME=eth0
NCCL_P2P_DISABLE=1📝通俗解释:这是让DeepSpeed正确找到网络通道的配置,就像告诉它应该从哪个门出去找人。
总结
如果没有NVLINK和节点间还是万兆网的穷人,TP别想了,DP也勉强(显存不够),主要靠PP,再试试ZeRO-1。
📝通俗解释:对于普通人(没有高端设备),最好的策略是:
- 流水线并行(PP)- 把模型分层放到不同显卡
- ZeRO-1 - 优化器状态分片存储 这两种对硬件要求最低,适合平民玩家。
参考链接:Model Parallelism: https://huggingface.co/docs/transformers/v4.17.0/en/parallelism