
1. 从单卡到集群为什么多维混合并行是绕不开的坎搞大模型训练的人都有一个共识单卡性能再强也扛不住参数量的指数级膨胀。一张NPU的显存就那么大70B、130B甚至更大的模型光权重加载就能把显存吃干净更别提训练过程中的激活值、梯度、优化器状态这些“吃内存大户”。所以当训练规模从单机单卡走向多机多卡集群时并行策略就成了决定训练能不能跑起来、跑得快不快的核心问题。昇腾AI集群服务器架构里多维混合并行的本质就是一句话把一个大模型拆开分配到多个NPU上让它们协同完成训练同时尽可能减少通信开销、提升计算效率。听起来简单但实际操作中涉及数据并行、张量并行、流水线并行、序列并行等多种策略的组合每种策略切分的维度不同通信模式不同对网络拓扑的要求也不同。这篇文章适合谁看如果你正在搭建或优化昇腾AI集群准备训练百亿到千亿参数级别的模型或者你已经在用单机多卡但发现扩展效率上不去那这篇内容应该能帮你理清思路。我会从架构设计、核心原理、实操配置、问题排查几个维度展开尽量把“为什么这么设计”讲透而不是只丢一堆参数让你照抄。先给一个整体认知多维混合并行的“多维”指的是从不同角度切分模型和数据的策略组合。数据并行切分的是batch张量并行切分的是单层内的矩阵运算流水线并行切分的是模型层与层之间的堆叠序列并行切分的是输入序列长度。把这几种策略混合使用才能在不同规模的集群上找到计算效率和通信开销的最佳平衡点。2. 昇腾集群的硬件底座与通信基础2.1 NPU架构特点对并行策略的影响昇腾NPU和GPU在架构上有不少差异这些差异直接影响并行策略的选择。昇腾采用达芬奇架构计算核心是AI Core每个AI Core包含矩阵计算单元、向量计算单元和标量计算单元。在做张量并行时矩阵乘法的切分方式需要匹配AI Core的计算特性否则会出现计算单元利用率低下的问题。昇腾NPU的片上存储分为L1 Buffer、L0A/L0B/L0C等层级数据在不同层级之间的搬运有明确的带宽和延迟特征。这意味着在做张量并行时切分后的矩阵块大小需要和片上存储容量匹配太大放不下太小则搬运开销占比过高。实际调优时我通常会先确认单层矩阵乘法的shape然后根据L0 Buffer的容量反推最合适的切分粒度。另一个关键点是昇腾NPU的HCCL通信库。HCCL类似GPU生态里的NCCL负责集合通信操作。它支持AllReduce、AllGather、ReduceScatter、AlltoAll等原语这些原语正是多维混合并行的通信基础。HCCL在昇腾集群上的性能表现直接决定了并行策略的扩展效率。2.2 HCCL通信域与拓扑感知HCCL的一个核心概念是通信域。你可以把它理解为一个“通信组”组内的NPU可以互相做集合通信。在多维混合并行中不同的并行维度需要不同的通信域。比如数据并行需要一个全局通信域来做梯度AllReduce张量并行需要一个组内通信域来做层内AllReduce流水线并行则需要相邻stage之间的点对点通信。HCCL支持拓扑感知能自动识别集群内的网络连接方式。昇腾集群通常采用RoCE或专用互联网络节点内通过HCCS高速互联节点间通过网卡通信。拓扑感知的意义在于HCCL可以根据物理连接关系选择最优的通信路径。比如节点内的AllReduce走HCCS节点间的AllReduce走网络两者带宽差异很大如果通信域划分不合理跨节点通信就会成为瓶颈。实操提示创建通信域时尽量让通信密集的操作在同一节点内完成。张量并行通信频率最高优先放在节点内数据并行通信频率相对较低可以跨节点流水线并行的点对点通信量最小跨节点影响可控。2.3 集群组网对并行策略的约束昇腾AI集群的组网方式直接影响并行策略的可行性。常见的组网有单机8卡、多机RoCE互联、以及更大规模的集群组网。单机8卡内通过HCCS互联带宽高、延迟低适合做张量并行。跨节点通过RoCE网络带宽和延迟取决于网卡和交换机配置适合做数据并行或流水线并行。如果集群规模到了几十台甚至上百台服务器网络拓扑就变得更复杂。这时候需要考虑是否采用分层通信策略节点内先做一次AllReduce节点间再做一次AllReduce最后合并结果。HCCL支持这种分层通信模式但需要手动配置通信域和通信算法。我在实际项目中遇到过一个问题集群有32台服务器每台8卡总共256个NPU。最初把所有NPU放在一个通信域里做全局AllReduce结果通信时间占了总训练时间的40%以上。后来改成两层通信域节点内8卡先做AllReduce然后每台服务器出一个代表做跨节点AllReduce最后广播回去。通信时间直接降到了15%左右。这个优化的核心逻辑就是利用了节点内HCCS的高带宽减少了跨节点通信的数据量。3. 多维混合并行的核心策略拆解3.1 数据并行最基础但也有讲究数据并行是最容易理解的策略每个NPU持有完整的模型副本但处理不同的数据batch。前向计算各自独立反向计算得到各自的梯度然后通过AllReduce把所有NPU的梯度求平均再更新权重。数据并行的优势是实现简单、扩展性好。但缺点也很明显每个NPU都要存一份完整的模型参数、梯度和优化器状态。以Adam优化器为例每个参数需要存一阶矩和二阶矩加上梯度本身显存开销是参数量的4倍。一个10B参数的模型光这些状态就要占40GB以上的显存再加上激活值单卡根本放不下。所以在多维混合并行中数据并行通常不是单独使用的而是和其他并行策略组合。数据并行的通信量是梯度的大小对于大模型来说这个通信量非常可观。优化数据并行的关键在于减少通信量和重叠通信与计算。昇腾平台上数据并行的梯度AllReduce可以通过HCCL的AllReduce原语实现。为了减少通信量可以采用梯度压缩、梯度累积等技巧。梯度累积是指多个batch的梯度先累加再通信相当于增大了等效batch size减少了通信频率。梯度压缩则是对梯度做量化或稀疏化减少传输数据量但可能影响收敛性需要谨慎使用。3.2 张量并行切分矩阵乘法的艺术张量并行解决的是单层参数太大的问题。以Transformer为例自注意力层的Q、K、V投影矩阵和输出投影矩阵以及FFN层的两个大矩阵参数量都非常大。张量并行把这些矩阵按行或按列切分到多个NPU上每个NPU只计算一部分然后通过AllReduce或AllGather合并结果。具体来说对于一个线性层Y XW有两种切分方式。按列切分W按列分成W1和W2每个NPU计算Y1 XW1和Y2 XW2最后拼接得到Y。这种方式不需要通信但要求每个NPU都有完整的输入X。按行切分W按行分成W1和W2输入X也按列分成X1和X2每个NPU计算Y1 X1W1和Y2 X2W2最后需要AllReduce求和得到Y。在Transformer中通常采用组合切分方式。比如FFN层的第一个线性层按列切分第二个线性层按行切分这样中间不需要额外的通信只在最后做一次AllReduce。这种设计减少了通信次数提升了效率。昇腾NPU做张量并行时切分粒度需要仔细考虑。切得太细单个NPU上的矩阵太小计算效率下降切得太粗单卡显存又放不下。我通常的做法是先估算单层参数量和激活值大小然后根据单卡可用显存反推最大切分数再结合HCCL的通信效率确定最终切分方案。注意事项张量并行的通信非常频繁每一层都要做AllReduce或AllGather。如果跨节点做张量并行网络延迟会严重拖累训练速度。所以张量并行尽量限制在节点内利用HCCS高带宽互联。3.3 流水线并行按层切分与微批次调度流水线并行把模型按层切分成多个stage每个stage放在不同的NPU或NPU组上。数据像流水线一样依次经过各个stage前一个stage计算完把中间结果传给下一个stage。流水线并行的核心挑战是流水线气泡。因为stage之间有依赖关系如果只是简单地串行执行大部分时间会有NPU处于空闲状态。为了解决这个问题引入了微批次的概念把一个batch拆成多个微批次让不同微批次在不同stage上重叠执行从而填满流水线。昇腾平台上实现流水线并行需要配合HCCL的点对点通信。每个stage计算完后通过Send/Recv把激活值传给下一个stage。微批次的数量和大小需要仔细调优微批次太多通信次数增加微批次太少流水线气泡填不满。我实测下来微批次数量一般设为流水线stage数的2到4倍比较合适。比如4个stage微批次设为8到16个。这样既能有效填充流水线又不会让通信开销过大。3.4 序列并行长序列训练的利器序列并行是近年来随着长序列训练需求增加而流行起来的策略。它切分的是输入序列的维度把长序列分成多段每段放在不同的NPU上计算。对于注意力机制序列并行需要处理跨段的注意力计算通常配合Ring Attention等算法实现。序列并行的优势在于它不增加模型参数的副本也不切分模型本身而是切分计算过程中的序列维度。这对于处理超长序列比如128K甚至更长的上下文非常有用。但序列并行的通信模式比较复杂需要在注意力计算过程中进行多次数据交换。在昇腾集群上做序列并行需要仔细设计通信模式。Ring Attention的核心思想是让每个NPU持有序列的一段然后通过环形通信逐步交换K、V块计算局部的注意力分数。这种方式通信量较大但对长序列来说是必要的开销。3.5 多维混合组合策略的设计原则实际训练大模型时很少只用一种并行策略。通常是多种策略组合使用比如节点内用张量并行节点间用数据并行流水线并行跨节点数据并行和流水线并行组合张量并行、流水线并行、数据并行三者混合组合策略的设计原则是通信最密集的维度放在带宽最高的链路上通信最少的维度放在带宽最低的链路上。张量并行通信最频繁放在节点内HCCS上流水线并行通信量最小可以跨节点数据并行居中根据集群规模灵活安排。以一个典型的配置为例集群有8台服务器每台8卡总共64个NPU。模型是70B参数。可以采用这样的配置张量并行度8节点内流水线并行度4跨4台服务器数据并行度2剩余2台服务器做数据并行。这样总的NPU数是8×4×264正好用完。4. 实操配置与关键参数计算4.1 并行度配置的估算方法配置并行度之前需要先估算几个关键数据模型参数量、单层最大参数量、激活值大小、优化器状态大小。以70B模型为例假设是标准的Transformer架构层数80隐藏维度8192FFN中间维度28672。单层参数量估算自注意力层的QKV投影矩阵是3×8192×8192≈200M参数输出投影是8192×8192≈67M参数FFN层两个矩阵是8192×28672×2≈470M参数。单层总计约737M参数。80层总计约59B参数加上embedding和输出层接近70B。优化器状态Adam需要存一阶矩和二阶矩每个参数2个float32加上梯度本身1个float32总共每个参数12字节。70B参数就是840GB。这还没算激活值。单卡显存假设是64GB那么至少需要840/64≈14张卡来存优化器状态。但实际还需要存模型参数和激活值所以实际需要的卡数更多。张量并行度选择单层最大参数量是FFN层的470M参数如果张量并行度是8每个NPU上约59M参数float16存储约118MB完全放得下。张量并行度8正好对应节点内8卡通信走HCCS效率最高。流水线并行度选择总层数80如果流水线并行度是4每个stage有20层。每个stage的参数量约15B优化器状态约180GB需要至少3张卡来存。但每个stage实际上是一个张量并行组8卡8卡的总显存是512GB足够存下。数据并行度剩余维度就是数据并行。总卡数64张量并行8流水线并行4数据并行64/(8×4)2。4.2 HCCL通信域配置实操在昇腾平台上HCCL通信域的配置通常通过环境变量或代码接口完成。以下是一个典型的配置示例# 设置HCCL通信相关环境变量 export HCCL_CONNECT_TIMEOUT120 export HCCL_EXEC_TIMEOUT60 export HCCL_INTRA_ROCE_ENABLE0 export HCCL_INTRA_PCIE_ENABLE1 export HCCL_NPU_SOCKET_PORT_RANGE60000-60050这些环境变量的含义HCCL_CONNECT_TIMEOUT通信域建立连接的超时时间大规模集群建议设大一些HCCL_EXEC_TIMEOUT通信操作执行超时时间HCCL_INTRA_ROCE_ENABLE节点内是否使用RoCE通常设为0节点内走HCCSHCCL_INTRA_PCIE_ENABLE节点内是否使用PCIe根据实际硬件配置HCCL_NPU_SOCKET_PORT_RANGE通信使用的端口范围在代码层面创建通信域通常使用HCCL的Python接口或通过深度学习框架的分布式接口。以PyTorch为例import torch import torch_npu import torch.distributed as dist # 初始化分布式环境 dist.init_process_group(backendhccl, rankrank, world_sizeworld_size) # 创建张量并行通信组节点内8卡 tensor_parallel_group dist.new_group(ranks[0,1,2,3,4,5,6,7]) # 创建数据并行通信组跨节点 data_parallel_group dist.new_group(ranks[0,8,16,24,32,40,48,56])4.3 混合并行配置示例以下是一个完整的混合并行配置示例假设使用MindSpore框架from mindspore import context from mindspore.communication import init from mindspore.parallel import set_algo_parameters # 初始化分布式环境 context.set_context(modecontext.GRAPH_MODE, device_targetAscend) init() # 设置并行策略 # 假设总卡数64张量并行8流水线并行4数据并行2 parallel_config { tensor_parallel: 8, # 张量并行度 pipeline_parallel: 4, # 流水线并行度 data_parallel: 2, # 数据并行度 micro_batch_num: 16, # 微批次数量 optimizer_shard: True, # 优化器状态分片 } # 设置流水线调度 set_algo_parameters( fully_use_devicesTrue, parallel_optimizer_threshold64 )关键参数说明tensor_parallel张量并行度建议等于单节点NPU数pipeline_parallel流水线并行度根据模型层数和显存需求确定data_parallel数据并行度总卡数除以其他并行度的乘积micro_batch_num微批次数量影响流水线效率和通信频率optimizer_shard优化器状态分片进一步减少显存占用4.4 显存优化技巧即使配置了多维混合并行显存仍然可能不够用。以下是一些实用的显存优化技巧激活值重计算前向计算时不保存中间激活值反向计算时重新计算。这会增加约30%的计算量但能节省大量显存。在昇腾平台上可以通过设置recomputeTrue开启。优化器状态分片把优化器状态切分到多个NPU上每个NPU只存一部分。这本质上是ZeRO-1策略能显著减少显存占用。梯度累积多个batch的梯度累加后再更新减少通信频率同时允许使用更大的等效batch size。混合精度训练使用float16或bfloat16进行前向和反向计算float32只用于参数更新。昇腾NPU对float16有很好的支持混合精度训练能节省约一半的显存。实操心得显存优化是有优先级的。先开混合精度再开激活值重计算最后考虑优化器状态分片。因为混合精度几乎不影响训练速度激活值重计算会增加计算量优化器状态分片会增加通信量。5. 性能调优与常见问题排查5.1 通信瓶颈的定位方法多维混合并行训练中通信瓶颈是最常见的问题。定位通信瓶颈的方法有几种时间线分析使用昇腾提供的性能分析工具抓取训练过程中的时间线看通信操作占用了多少时间。如果通信时间占比超过30%说明通信是瓶颈。通信量估算计算每种并行策略的通信量和理论带宽对比。比如数据并行的AllReduce通信量是2×(N-1)/N×参数量张量并行的AllReduce通信量是每层激活值大小×层数。带宽测试单独测试HCCL的AllReduce带宽和理论值对比。如果实测带宽远低于理论值说明网络配置有问题。我遇到过一个典型案例训练速度比预期慢了40%用时间线分析发现AllReduce占了大量时间。进一步排查发现通信域配置有问题跨节点通信走了错误的网卡。修正后训练速度恢复正常。5.2 流水线气泡的优化流水线气泡是流水线并行的固有问题。优化气泡的方法包括增加微批次数量微批次越多气泡占比越小。但微批次太多会增加通信次数需要权衡。交错调度让不同stage的计算重叠执行比如1F1B调度一个前向一个反向交替。这种调度方式能有效减少气泡。均衡切分确保每个stage的计算量大致相等。如果某个stage计算量特别大它会成为瓶颈其他stage等待时间增加。在昇腾平台上MindSpore提供了流水线调度的配置接口。可以通过设置pipeline_schedule来选择调度策略。实测下来1F1B调度在大多数场景下表现最好。5.3 常见问题速查表问题现象可能原因排查方法解决方案训练速度慢通信占比高通信域配置不合理时间线分析查看通信操作耗时调整通信域划分优化并行策略显存溢出并行度不够或激活值太大查看显存占用分布增加并行度开启激活值重计算流水线气泡大微批次数量不足计算气泡占比增加微批次数量使用1F1B调度梯度不收敛并行策略影响梯度正确性对比单卡训练结果检查AllReduce是否正确调整学习率HCCL连接超时网络配置或端口问题检查网络连通性和端口占用调整超时时间检查防火墙设置负载不均衡模型切分不均匀查看各NPU计算时间重新切分模型均衡各stage计算量5.4 独家避坑技巧坑一通信域创建顺序影响性能。HCCL通信域的创建顺序会影响通信组的物理拓扑映射。建议按照“先节点内、后节点间”的顺序创建通信域这样HCCL能更好地利用HCCS高带宽链路。坑二微批次大小要匹配。微批次大小不是随便设的最好让每个微批次的计算量是NPU计算单元的整数倍。比如矩阵维度是8192微批次大小设为16或32这样每次计算都是满负载。坑三不要忽视数据加载。大规模集群训练时数据加载可能成为瓶颈。建议使用高效的数据预处理和加载管道必要时使用数据预取和缓存。坑四学习率需要调整。使用数据并行时等效batch size变大学习率通常需要相应增大。但张量并行和流水线并行不影响等效batch size学习率不需要调整。混合并行时只有数据并行维度影响学习率。坑五定期保存检查点。大规模训练容易出各种意外定期保存检查点能避免从头开始。建议根据训练时间和集群稳定性设置合理的保存间隔。6. 扩展思考从训练到推理的并行策略迁移多维混合并行的思路不仅适用于训练推理阶段同样需要并行策略。但推理和训练的并行需求有所不同推理不需要存优化器状态显存压力小很多推理对延迟敏感需要优化首token延迟和吞吐量。在昇腾集群上做推理常用的并行策略包括张量并行和流水线并行。张量并行减少单卡计算量降低延迟流水线并行提高吞吐量适合大批量请求。数据并行在推理中通常不需要因为推理没有梯度同步。一个典型的推理配置是张量并行度8节点内流水线并行度2跨节点总共16卡服务一个模型。这种配置能平衡延迟和吞吐量适合在线服务场景。从训练迁移到推理时需要注意几点权重格式可能需要转换训练用的混合精度权重可能需要转成推理用的格式并行策略需要重新调优推理的最优并行配置和训练不同通信模式需要调整推理没有反向传播通信模式更简单。我个人在实际操作中的体会是多维混合并行的核心不是记住一堆配置参数而是理解每种并行策略的通信模式和计算特性然后根据硬件拓扑和模型结构灵活组合。参数可以查文档但组合的逻辑需要自己琢磨。踩过几次坑之后你会对“什么维度放在什么链路上”有一种直觉这种直觉比任何文档都管用。最后分享一个小技巧调优并行策略时先用小规模集群比如2台服务器做实验快速迭代找到最优配置然后再扩展到大规模集群。小规模实验的成本低、周期短能帮你快速排除明显不合理的配置。等小规模验证通过后再按比例放大到大规模集群成功率会高很多。