首页 / 资讯中心 / 文章详情

大模型分布式训练架构全解析:从数据并行到混合并行的工程实践

大模型分布式训练架构全解析:从数据并行到混合并行的工程实践 ★ FEATURED ARTICLE
1. 从单卡到千卡集群大模型分布式训练到底在解决什么问题很多人第一次接触大模型训练脑子里想的都是模型结构、注意力机制、数据配比这些事但真正上手跑一次百亿参数级别的训练任务就会发现模型代码可能两天就写完了剩下的两周全耗在“怎么让它跑起来”上。单卡显存装不下、梯度同步慢得离谱、训练到一半loss突然炸掉、checkpoint存了三个小时还没写完——这些才是日常。分布式训练架构要解决的核心矛盾就一句话单张卡的显存和算力有物理上限而模型规模和训练数据量在持续膨胀。我拿一个具体的数字来算这笔账。假设一个模型有130亿参数用FP16存储光权重就需要26GB显存。训练时还要存梯度26GB、优化器状态Adam的话FP32的momentum和variance各占52GB合计104GB再加上前向传播的激活值。粗算下来没有160GB以上的显存根本跑不动。而目前单张主流加速卡的显存普遍在40GB到80GB之间差距一目了然。这就是为什么必须做分布式——把模型切开放到多张卡上或者把数据切开放到多张卡上或者两者兼而有之。分布式训练的策略大致可以分成四类我按“切什么”来区分数据并行Data Parallelism, DP每张卡持有完整的模型副本但喂给每张卡不同的数据batch。梯度通过AllReduce同步。优点是实现简单缺点是模型必须能装进单卡。流水线并行Pipeline Parallelism, PP把模型按层切成若干段每段放到不同的卡上。数据像流水线一样依次经过各段。优点是能训超大模型缺点是存在“气泡”bubble即某些卡在等待上游输出时处于空闲状态。张量并行Tensor Parallelism, TP把单个矩阵运算拆开比如一个大的矩阵乘法切成几块分别在不同卡上算完再拼起来。优点是切分粒度细缺点是通信频繁对带宽要求极高。专家并行Expert Parallelism, EP主要用于MoE混合专家架构把不同的专家网络放到不同的卡上每个token只激活部分专家。优点是参数量可以做得极大而计算量可控缺点是负载均衡很难做好。实际的大规模训练几乎不会只用一种策略而是把这几样组合起来业内常说的“3D并行”就是DPPPTP的组合。再往上还有ZeRO零冗余优化器这类技术它本质上是对数据并行中冗余存储的优化——每张卡不再存完整的优化器状态而是切分存储需要时再通过通信拼起来。ZeRO把数据并行的显存效率提升了一个数量级让“用数据并行训大模型”重新变得可行。理解这些策略的关键在于抓住一个核心权衡计算和通信的比值。切得越细单卡的计算量越小但卡与卡之间需要交换的数据就越多。如果通信时间超过了计算时间加卡反而会变慢。这就是为什么张量并行通常只在单机内部通过NVLink等高带宽互联使用而跨机场景更多用流水线并行或数据并行——因为跨机网络的带宽通常比机内互联低一个数量级。一个常见的误区是“卡越多越快”。实际上当并行度超过某个阈值后通信开销会吃掉全部收益。我在一个项目里见过有人用32张卡做张量并行结果比8卡还慢原因就是跨机通信的延迟太高每次矩阵乘都要等数据传过来。所以做分布式训练架构设计第一步不是写代码而是算账模型多大、单卡显存多少、机内带宽多少、跨机带宽多少、目标batch size多大。把这些数字摆出来方案基本就确定了。下面我会逐个拆解每种并行策略的实现细节、通信原语、以及在实际项目中怎么选、怎么调。2. 数据并行的通信原语与ZeRO的显存账本数据并行是最直观的策略也是大多数人接触分布式训练的第一个方案。它的逻辑很简单每张卡有一份完整的模型各自跑不同的数据算完梯度后大家同步一下确保每张卡上的模型保持一致。但“同步一下”这三个字背后涉及大量工程细节尤其是当卡数上去之后通信就成了瓶颈。2.1 AllReduce的工作机制与Ring实现数据并行的核心通信操作是AllReduce所有卡把自己的梯度拿出来求和或求平均然后每张卡都拿到求和后的结果。最朴素的实现是选一张主卡收集所有梯度、求和、再广播回去但这样主卡会成为瓶颈而且带宽利用率极低。实际用的是Ring AllReduce把所有卡组成一个逻辑环分两个阶段Scatter-Reduce阶段每张卡把自己的梯度分成N份N等于卡数然后沿着环依次传递并累加。经过N-1步后每张卡上有一份完整的求和结果。AllGather阶段把上一步得到的各部分结果沿着环传播经过N-1步后每张卡都拥有完整的梯度。Ring AllReduce的妙处在于它的通信量与卡数无关只与梯度大小有关。每张卡发送和接收的数据量都是2×(N-1)/N×梯度大小当N很大时趋近于2倍梯度大小。这意味着加卡不会显著增加单卡的通信负担理论扩展性很好。但理论归理论实际中Ring AllReduce的效率受限于两个因素一是环上最慢的那张卡会拖累所有人木桶效应二是如果梯度很大通信时间可能超过计算时间。我实测过一个10亿参数的模型梯度用FP16存储是2GB在25Gbps的跨机网络上做一次AllReduce大约需要1.3秒而单步计算可能只要0.5秒。这种情况下通信就是纯开销加卡只会让情况更糟。2.2 ZeRO的三个阶段与显存收益计算ZeROZero Redundancy Optimizer的思路是数据并行中每张卡都存了完整的优化器状态、梯度和模型参数但这些信息其实是冗余的——既然大家最终要同步成一样的为什么每张卡都要存一份ZeRO把这部分冗余切分到各卡上需要时再通过通信收集。ZeRO分三个阶段逐步加深切分程度阶段切分内容显存节省相对基线额外通信ZeRO-1优化器状态约4倍无ZeRO-2优化器状态梯度约8倍无ZeRO-3优化器状态梯度参数与卡数成正比前向/反向各一次AllGather以130亿参数模型为例用Adam优化器、FP16混合精度训练基线显存占用大约是参数26GB 梯度26GB 优化器状态104GB 156GB。开启ZeRO-1后优化器状态被切分到N张卡上每卡只存104/N GB总显存降到2626104/N。当N8时每卡约65GB已经能装进80GB的卡了。开启ZeRO-3后参数也被切分每卡只存26/N GBN8时每卡约16GB非常宽裕。但ZeRO-3的代价是通信量增加。每次前向传播需要AllGather收集参数反向传播再AllGather一次反向结束后还要ReduceScatter梯度。通信量大约是ZeRO-1的1.5倍。所以在带宽充足的场景下ZeRO-3很香如果跨机带宽紧张ZeRO-1或ZeRO-2可能更划算。实操建议先用ZeRO-1如果显存不够再升到ZeRO-2最后才考虑ZeRO-3。ZeRO-3虽然省显存但通信开销和实现复杂度都明显更高而且对训练速度的影响在带宽受限时非常明显。2.3 梯度累积与micro-batch的配合数据并行中还有一个常被忽略的细节梯度累积。当单卡显存装不下目标batch size时可以把一个大batch拆成几个micro-batch依次前向和反向梯度累加起来等所有micro-batch跑完再做一次AllReduce。这样等效于增大了batch size但通信频率降低了。这里有个容易踩的坑BatchNorm和梯度累积的交互。如果模型里有BatchNorm层每个micro-batch的统计量是独立的累积后的梯度并不等价于大batch的梯度。解决办法是用SyncBatchNorm让所有卡的所有micro-batch一起算统计量但这又增加了通信。所以现在大模型基本都用LayerNorm或RMSNorm天然没有这个问题。另一个坑是学习率的缩放。增大等效batch size后学习率通常需要相应调整。常见的做法是线性缩放batch size翻倍学习率翻倍或平方根缩放。但这不是铁律具体要看优化器和数据分布。我在一个项目里试过线性缩放结果训练初期loss震荡得厉害后来改成平方根缩放才稳定下来。3. 流水线并行的气泡问题与调度策略流水线并行的核心思想是把模型按层切成若干段stage每段放在不同的卡上。数据从第一段进入经过前向传播后传给第二段以此类推。反向传播则反过来。这样每张卡只需要存模型的一部分显存压力大大降低。但流水线并行有个天然缺陷气泡。假设模型切成4段放在4张卡上。第一张卡算完第一个micro-batch的前向后把结果传给第二张卡自己开始算第二个micro-batch的前向。但第二张卡在收到第一个micro-batch的结果之前是空闲的。同理第三张卡要等第二张卡算完才能开始。这就导致在流水线填充和排空阶段部分卡处于空闲状态。3.1 GPipe与PipeDream的调度差异解决气泡问题的思路有两种代表GPipe和PipeDream。GPipe的做法是把一个batch切成多个micro-batch所有micro-batch依次走完前向然后再依次走反向。这样气泡只出现在流水线的填充和排空阶段中间阶段所有卡都在满负荷工作。气泡占比大约是 (stage数-1) / micro-batch数。比如4段流水线、16个micro-batch气泡占比约19%。micro-batch越多气泡越小但显存占用也越大因为要存所有micro-batch的激活值。PipeDream的做法更激进它让前向和反向交错进行每张卡算完一个micro-batch的前向后立刻开始算上一个micro-batch的反向。这样气泡几乎为零但问题是梯度更新会变得异步——不同stage可能在不同版本的参数上计算。PipeDream通过维护多个版本的权重来解决一致性问题但实现复杂度很高实际用得不多。目前主流框架如Megatron-LM、DeepSpeed默认用的是GPipe风格的调度因为实现简单且效果稳定。1F1BOne Forward One Backward调度是GPipe的改进版它在流水线填满后每张卡交替执行一个前向和一个反向进一步压缩了气泡。3.2 流水线切分的实操原则流水线怎么切直接决定了训练效率和显存均衡。几个实操原则按层切不要按算子切流水线并行的通信粒度是stage之间的激活值如果切得太细通信次数会暴增。通常以Transformer层为单位切分。均衡各stage的计算量如果第一段有10层、第二段有2层那第二段的卡大部分时间在等第一段。理想情况下每段层数相近。但首尾段有embedding和输出层计算量可能不同需要单独调整。考虑通信开销stage之间的通信量等于激活值的大小与batch size和序列长度成正比。如果序列很长激活值可能很大跨机传输会成为瓶颈。这种情况下可以把流水线并行限制在机内跨机用数据并行。我在一个项目里把40层模型切成8段每段5层结果发现第一段和最后一段明显更慢——因为第一段要做embedding查表最后一段要做logits计算和loss。后来改成第一段3层、中间段各5层、最后一段7层整体吞吐提升了约12%。这种微调没有理论公式只能实测。注意流水线并行和数据并行可以叠加。常见配置是“机内流水线跨机数据并行”这样跨机通信只发生在数据并行的梯度同步上频率低、数据量大适合高延迟网络。4. 张量并行把矩阵乘法拆开算张量并行是切分粒度最细的策略它直接对模型中的矩阵运算下手。以Transformer中的多头注意力为例假设有H个头可以把H个头分到不同的卡上每张卡算一部分头最后拼接。前馈网络FFN中的两个大矩阵也可以按列或按行切分。4.1 列并行与行并行的组合张量并行的核心操作是矩阵乘法的切分。考虑一个线性层 Y XA其中X是输入A是权重矩阵。有两种切法列并行把A按列切成[A1, A2]每张卡算Y1 XA1和Y2 XA2最后拼接得到Y。这种切法不需要通信因为每张卡独立算出一部分输出。行并行把A按行切成[A1; A2]每张卡算Y1 X1A1和Y2 X2A2最后需要AllReduce求和得到Y Y1 Y2。Transformer的FFN通常是“先列并行再行并行”第一个线性层用列并行第二个线性层用行并行。这样中间不需要通信只在最后做一次AllReduce。注意力层也是类似Q、K、V的投影用列并行输出投影用行并行。这种设计的精妙之处在于它把通信次数降到了最低。一个Transformer层只需要两次AllReduce注意力输出一次FFN输出一次而且通信量是激活值大小相对可控。4.2 张量并行的通信瓶颈与适用场景张量并行的通信非常频繁每层都要做AllReduce而且通信量与激活值大小成正比。如果跨机做张量并行网络延迟会直接拖垮训练速度。所以张量并行几乎只在单机内部使用依赖NVLink或类似的高带宽互联。我实测过一组数据在机内NVLink带宽约600GB/s上做张量并行8卡扩展效率能到85%以上同样的配置放到跨机25Gbps网络上扩展效率直接掉到30%以下。差距就是这么明显。所以实际的大模型训练配置通常是机内张量并行8卡利用高带宽互联跨机流水线并行或数据并行通信频率低比如一个1750亿参数的模型可以用8路张量并行16路流水线并行总共128张卡。每8张卡在一个节点内做张量并行节点之间做流水线并行。这样跨机通信只发生在stage边界频率远低于张量并行。4.3 序列并行与上下文并行的补充当序列长度很长时比如32K tokens激活值的显存占用会变得很大。这时候可以引入序列并行把序列维度也切分开每张卡处理一部分token。序列并行通常和张量并行配合使用因为LayerNorm和Dropout等操作需要完整的序列信息序列并行可以避免在这些地方做额外的通信。上下文并行是序列并行的一种扩展专门针对超长序列场景。它把注意力计算中的KV缓存也切分开每张卡只存一部分KV计算时通过通信获取需要的部分。这在长文本生成任务中非常有用但实现复杂度较高目前主要在少数框架中支持。5. 混合并行实战从方案设计到参数调优前面分别讲了数据并行、流水线并行和张量并行实际项目中几乎不会只用一种而是根据模型规模、硬件配置、网络条件组合使用。这一节我以一个具体场景为例走一遍方案设计和调优的完整流程。5.1 场景设定与硬件盘点假设我们要训练一个70亿参数的模型硬件是4个节点每个节点8张80GB显存的加速卡机内NVLink互联跨机25Gbps网络。目标batch size是4M tokens序列长度4096。先算显存。70亿参数FP16存储是14GB梯度14GBAdam优化器状态56GB合计84GB。单卡80GB装不下必须切分。用ZeRO-1切分优化器状态8卡时每卡7GB总显存1414735GB加上激活值大约10GB总共45GB能装下。所以数据并行ZeRO-1是可行的。但4M tokens的batch size如果每卡micro-batch是8序列长度4096那每卡每步处理32K tokens。4M/32K128需要128步梯度累积。这个累积步数太多了训练效率会很低。所以需要增加并行度来降低单卡负担。改用8路张量并行4路数据并行每8张卡组成一个张量并行组共4个组做数据并行。张量并行把模型切成8份每卡只存1/8的模型显存压力骤降。数据并行组之间做梯度同步通信频率低。这样每卡micro-batch可以设大一些梯度累积步数减少。5.2 并行维度的分配逻辑并行维度的分配有一个经验法则优先用满机内带宽再考虑跨机。具体来说张量并行放在机内因为通信最频繁必须用高带宽互联。通常设为单节点的卡数如8。流水线并行跨机通信频率中等跨机可以接受。但要注意stage之间的负载均衡。数据并行跨机通信频率最低每步一次适合跨机。但梯度同步的数据量大需要网络带宽支撑。对于上面的场景8路张量并行正好用满一个节点。剩下4个节点可以做数据并行或者2路流水线2路数据并行。如果模型层数很多比如80层可以考虑流水线并行把模型切成4段每段20层放在4个节点上。但这样每个节点内的8张卡做张量并行节点之间做流水线并行数据并行度为1。这意味着没有数据并行batch size受限于单条流水线的吞吐。实际选择取决于模型结构和训练目标。如果模型层数不多比如32层流水线切4段每段8层也可以但气泡占比会高一些。如果追求高吞吐数据并行更简单直接。5.3 通信重叠与计算图优化分布式训练的性能瓶颈往往不在计算而在通信。把通信和计算重叠起来是提升效率的关键手段。常见做法梯度同步与反向传播重叠在反向传播算完某一层的梯度后立刻开始这层的AllReduce而不是等所有层都算完再统一同步。这样通信和计算可以并行。流水线并行中的1F1B调度前向和反向交错执行让不同stage的卡尽量保持忙碌。ZeRO-3中的参数预取在前向传播需要某一层参数之前提前发起AllGather等参数到了直接算减少等待时间。这些优化在主流框架中都有实现但需要正确配置才能生效。比如PyTorch的DDP默认支持梯度同步与反向重叠但需要设置gradient_as_bucket_viewTrue来减少内存拷贝。DeepSpeed的ZeRO-3需要配置stage3_prefetch_bucket_size来启用预取。一个容易忽略的点通信重叠会增加显存占用因为需要缓存多份梯度或参数。如果显存本来就紧张开启重叠可能导致OOM。这时候需要权衡是牺牲一点速度换显存还是牺牲显存换速度。5.4 训练稳定性与故障恢复大规模分布式训练跑几天甚至几周是常态期间硬件故障、网络抖动、进程崩溃都可能发生。没有故障恢复机制一次崩溃可能损失几天的训练进度。Checkpoint策略是基础。但存checkpoint本身也有讲究异步保存不要让所有卡停下来等checkpoint写完。可以用后台线程异步写盘训练继续。分片保存每张卡只存自己那部分参数恢复时各卡读各自的。这样并行度高速度快。定期保存滚动删除保留最近N个checkpoint避免磁盘爆满。除了checkpoint还需要监控训练稳定性。Loss突然飙升、梯度范数异常、某些卡的吞吐明显下降这些都是故障前兆。我习惯在训练脚本里加一个简单的监控每100步打印一次各卡的吞吐和梯度范数如果某张卡连续几次吞吐低于平均值20%以上就发告警。另一个实操经验在正式训练前先跑一个短时间的“冒烟测试”用真实数据和真实并行配置跑几百步确认没有OOM、没有通信死锁、loss能正常下降。这个测试能提前暴露90%的配置问题比直接上大规模训练再排查要高效得多。6. 经典论文的阅读顺序与核心贡献拆解分布式训练领域的论文很多但真正奠定基础的也就那么几篇。我按“先读什么、后读什么”的顺序梳理一下每篇只说核心贡献和实操价值。6.1 并行策略的奠基性工作Megatron-LM2019是张量并行的开山之作。它详细描述了如何把Transformer的注意力层和FFN层做列并行和行并行切分并给出了通信量的理论分析。这篇论文的价值在于它证明了张量并行可以在不损失精度的前提下大幅降低单卡显存而且给出了具体的切分方案。读这篇的时候重点关注第3节“Model Parallelism”里面有完整的矩阵切分图示。GPipe2019提出了流水线并行的micro-batch调度方案。核心贡献是证明了流水线并行可以用“填充-稳定-排空”的三段式调度来压缩气泡并且给出了气泡占比的公式。这篇论文的实验部分展示了在8卡上训练一个80亿参数模型的结果扩展效率相当不错。读的时候注意第4节的调度算法伪代码。PipeDream2019提出了异步流水线并行用权重版本管理来解决梯度一致性问题。虽然实际用得不多但它对气泡问题的分析很透彻值得一读。特别是它提出的“1F1B”调度后来被Megatron-LM采纳并改进。6.2 ZeRO系列与显存优化ZeRO2020是微软DeepSpeed团队的工作系统性地分析了数据并行中的显存冗余并提出了三个阶段的切分方案。这篇论文的精华在第4节它用表格形式给出了每个阶段的显存节省和通信开销对比。我建议重点看ZeRO-1和ZeRO-2因为这两个阶段没有额外通信性价比最高。ZeRO-Offload2021进一步把优化器状态和梯度卸载到CPU内存让单卡也能训大模型。核心思路是利用CPU内存比GPU显存大得多的特点把不常用的数据放过去。代价是CPU和GPU之间的数据传输但通过计算和传输重叠可以部分掩盖。这篇论文适合显存极度受限的场景。ZeRO-Infinity2021把卸载扩展到NVMe磁盘理论上可以训任意大的模型。但磁盘IO速度是硬伤实际训练速度会慢很多。这篇论文的价值更多在于展示了“显存不够就往外存”的极限思路。6.3 混合并行与自动化策略Megatron-Turing NLG2021是一个5300亿参数模型的训练报告详细描述了如何组合张量并行、流水线并行和数据并行来训练超大模型。这篇论文的实操价值极高它给出了具体的并行配置、batch size、学习率调度等超参数。读的时候重点关注第3节“Parallelism”和第4节“Training Details”。Alpa2022提出了自动并行策略搜索根据模型计算图和硬件拓扑自动决定用什么并行组合。核心贡献是把并行策略选择形式化为一个优化问题并用整数线性规划求解。这篇论文适合想深入了解并行策略自动化的读者但实现复杂度较高实际项目中用得不多。FlexFlow2019是另一个自动并行的工作它提出了“SOAP”搜索空间把并行维度分为Sample、Operation、Attribute、Parameter四个维度。这篇论文的搜索算法比较复杂但它的分析框架很有启发性。6.4 论文阅读的实操建议读这些论文的时候我建议带着三个问题去读它解决了什么显存或通信瓶颈每篇论文的动机都是某个具体的瓶颈搞清楚这个瓶颈是什么才能理解它的设计选择。它的通信量是多少大部分论文都会给出通信量的理论分析这是判断它是否适合你的场景的关键。它的实验配置是什么论文里的实验配置卡数、网络、模型大小直接决定了它的结论是否适用于你的场景。如果论文用的是机内NVLink而你是跨机网络那它的扩展效率数据对你参考价值有限。另外论文里的公式推导不用全看但关键公式要理解。比如ZeRO的显存节省公式、流水线的气泡占比公式、张量并行的通信量公式这些是方案设计的理论基础。7. 框架选型与踩坑记录理论讲完了最后说说工具。分布式训练的框架主要有PyTorch DDP、DeepSpeed、Megatron-LM、FairScale、Colossal-AI等。每个框架的定位和适用场景不同选错了会走很多弯路。7.1 各框架的定位与适用边界PyTorch DDP是最基础的方案只支持数据并行但胜在稳定、易用、和PyTorch生态无缝集成。如果你的模型能装进单卡或者用ZeRO-1/2就能装下DDP是首选。它的API极其简单基本上把model包一层DistributedDataParallel就能跑。DeepSpeed是微软的框架核心卖点是ZeRO系列显存优化和Offload。它和PyTorch兼容性好配置通过JSON文件管理比较灵活。缺点是文档质量参差不齐有些配置项的含义需要看源码才能搞清楚。我在用DeepSpeed的时候踩过一个坑stage3_gather_16bit_weights_on_model_save这个配置如果不设成True保存的checkpoint是分片的恢复时需要额外处理。Megatron-LM是英伟达的框架专注于张量并行和流水线并行性能优化做得非常极致。缺点是代码耦合度高想改模型结构比较麻烦。它更适合从头训练标准Transformer架构的场景不太适合做研究性质的模型改动。Colossal-AI是一个较新的框架主打自动并行和异构内存管理。它的API设计比较友好支持多种并行策略的组合。但生态还不如DeepSpeed成熟遇到问题可参考的资料少一些。选型建议先用DDP跑通显存不够上DeepSpeed ZeRO需要张量并行或流水线并行再考虑Megatron-LM或Colossal-AI。不要一上来就上最复杂的框架调试成本太高。7.2 常见报错与排查思路分布式训练的报错信息往往很隐晦因为涉及多进程通信。我整理了几个高频问题和排查方法报错现象可能原因排查方法NCCL timeout某张卡卡住或网络不通检查各卡是否都在运行用nvidia-smi看GPU利用率OOM但显存看起来够激活值或临时缓冲区超预期减小micro-batch开启梯度检查点Loss变成NaN学习率太大或梯度爆炸降低学习率加梯度裁剪训练速度突然下降某张卡降频或网络拥塞监控各卡吞吐和温度Checkpoint恢复后loss异常优化器状态未正确恢复确认checkpoint包含优化器状态NCCL timeout是最常见的通常是因为某张卡上的进程挂了但其他卡还在等它。解决办法是设置合理的timeout并在超时后打印各卡状态。PyTorch的init_process_group有个timeout参数默认是30分钟可以调小到几分钟这样出问题时能更快发现。7.3 性能调优的实操清单最后给一份性能调优的检查清单按优先级排序确认通信瓶颈在哪用profiler看AllReduce、AllGather等操作占了多少时间。如果超过30%说明通信是瓶颈。调整micro-batch大小micro-batch越大计算效率越高但显存占用也越大。找到显存刚好够用的最大值。开启通信重叠DDP的gradient_as_bucket_view、DeepSpeed的overlap_comm、Megatron的--overlap-grad-reduce。优化数据加载用DataLoader的num_workers和prefetch_factor确保GPU不等数据。检查是否有不必要的同步比如torch.cuda.synchronize()调用过多或者日志打印太频繁。尝试不同的并行组合如果当前配置扩展效率低换一种并行策略试试。有时候TP4PP2比TP8PP1更快。一个反直觉的经验有时候减少卡数反而更快。因为通信开销降低了单卡的计算效率提升了。我在一个项目里从32卡降到16卡总吞吐只下降了10%但训练稳定性大幅提升综合下来反而更划算。分布式训练没有银弹每个方案都有取舍。理解原理、算清账、多实测比盲目套用别人的配置要靠谱得多。
阅读完成 · 觉得有帮助?
咨询建站