概述
分布式训练的本质:拆分任务、协同计算,不同策略的核心差异在于:拆什么、怎么协同。
模型一致性问题:各节点都有基于自身数据算出的梯度?
为解决模型一致性问题,分布式训练的梯度同步策略分为异步(Asynchronous)梯度更新与同步(Synchronous)梯度更新机制。
同步,即所有节点均采用相同模型参数开展训练,等所有设备完成batch训练,收集梯度并求均值,最后一次性更新所有网络模型参数。由于每轮迭代结束时,计算快的节点得等待计算慢的节点信息完成同步,才能开启下一轮迭代,如同木桶效应,同步方式的性能取决于集群中通讯最慢的节点。
在异步通讯模式下,各节点完成一个批数据的训练后,无需等待其他节点,可直接更新Server中的网络模型参数。异步更新方式避免因等待单节点数据而产生的阻塞,从而使整体训练速度大幅提升。
然而,异步通讯存在梯度失效(stale gradients)问题。起初所有节点采用相同参数进行训练,但在异步环境中,当某节点完成T步迭代训练时,可能会发现模型参数已被其他设备在T+n步更新。若此时该节点将T步迭代训练得到的参数更新至Server,就会导致n步内的梯度更新失效。尽管异步训练速度较快,但受梯度失效问题影响,可能陷入次优解(sub-optimal training performance)。
MPI
官网,Message Passing Interface缩写,消息传递接口,用于并行计算的标准通信协议,在计算集群、超算等场景下,MPI应用广泛,很多传统科学计算的并行程序都借助它来编写。因其接口兼容性出色、通信功能丰富,在深度学习框架里,MPI主要承担CPU数据的通信任务。
作为开放接口,MPI有多种实现库。如Open MPI是一种被广泛使用的开源实现。部分硬件厂商也会提供针对自身硬件进行优化后的MPI实现版本。
自1994年首次发布以来已成为高性能计算(HPC)领域最重要的并行编程模型之一。MPI定义一组函数接口规范,使程序员能够在分布式内存系统中编写可移植的并行程序。
核心特点:
- 标准化:由MPI论坛制定和维护的开放标准
- 可移植性:可在各种硬件平台和操作系统上运行
- 高效性:针对大规模并行计算优化
- 丰富功能:提供超过300个通信原语
MPI的发展历程见证高性能计算通信技术的演进与革新。这一标准化进程始于1994年MPI-1的发布,首次统一并行计算的通信规范,定义基础的点对点通信(如Send/Recv)和集体通信操作(如Broadcast、Reduce),并创新性地提出通信器(Communicator)概念,解决早期各厂商私有接口不兼容的问题。
1998年推出的MPI-2实现重大扩展,引入动态进程管理、并行文件I/O和远程内存访问等关键特性,使MPI从单纯的通信库升级为支持复杂应用场景的完整并行计算平台。
随着计算规模不断扩大,2012年发布的MPI-3针对超大规模系统进行深度优化,其标志性的非阻塞集体操作显著提升通信与计算的重叠能力,同时增强容错机制和工具接口。
最新一代MPI-4标准于2021年问世,重点优化持久化通信请求和大规模系统支持,通过减少重复通信开销来适应现代超算和AI训练集群的需求。值得注意的是,MPI标准始终保持严格的向后兼容性,各版本迭代均围绕实际应用痛点展开,体现"性能导向"的核心设计哲学。
经过近三十年的发展,MPI已从最初的通信规范成长为支撑科学计算、AI和大数据处理的基石技术,其演进历程不仅反映并行计算技术的进步,更彰显工业界与学术界协同标准化的成功典范。当前主流实现如OpenMPI和MPICH仍在持续完善对MPI-4的支持,确保这一经典标准在E级计算时代继续发挥关键作用。
通信原语
合理运用通信原语可优化训练流程,减少通信延迟,提升计算资源利用率,加速训练速度。若通信原语使用不当,会出现数据传输瓶颈、训练效率低下等问题,影响大模型训练效果和性能。
包括:
- All-Reduce:可实现全局梯度同步,让各节点获取相同规约结果,保证模型参数更新一致性;
- All-Gather:
- Reduce-Scatter:能将规约结果分块到各节点,便于并行计算。
策略
几种并行策略:
- 数据并行
Data Parallel,DP,一种常用的深度学习训练策略,通过在多个GPU上分布数据来实现并行处理。在数据并行的框架下,每个GPU(工作单元)都会存储模型的完整副本,都能独立地对其分配的数据子集进行前向和反向传播计算。
需每个设备加载完整模型,将训练数据切分为多个mini-batch(小批次),各自计算梯度后同步更新参数。反向传播后,再通过通信归约梯度,保证优化器在各个机器进行相同的更新。
计算流程:单卡算梯度→All Reduce通信(NCCL协议)汇总梯度→取平均值更新全量参数;
工具选择:PyTorch的DDP(Distributed DP),多进程架构比早期DP更稳定,支持多机多卡。
优势:代码改动小(仅需3-5行DDP初始化代码),适配模型能装下、数据量超大场景(10亿参数内模型+千万级数据集),计算效率高;
缺点:设备数超8张时,梯度同步通信开销陡增(16张GPU通信耗时占比可达30%),单卡存完整模型导致显存浪费。
- 模型并行
Model Parallel,MP,一个GPU可能放不下全部大模型参数,需要拆分大模型分散到不同GPU上,通常对模型/张量进行切分,每个GPU处理一/几层/一块张量。通常是指在多个计算节点上分布式地训练一个大型的神经网络模型,其中每个节点负责模型的一部分。主要用于解决单个计算节点无法容纳整个模型的情况。
可突破单卡显存限制,拆分模型结构,将模型的不同部分(或层)分配到不同GPU上,每个设备仅加载部分模型,通过设备间传递中间结果完成计算。
计算流程:输入数据在GPU0算前12层隐藏态→传递至GPU 1算后12层并输出损失→反向传播时梯度回传GPU0,各自更新参数;
进阶优化:模型较宽时(如注意力头数多),可按维度拆分(12个注意力头拆为6+6),减少中间结果传输量。
优势:解决超大模型单卡装不下问题,显存利用率比数据并行高50%以上(显存效率高);
痛点:GPU间数据传输会引入严重瓶颈;设备间依赖强(GPU1需等待GPU0计算完成),易出现负载不均(部分GPU空闲);计算效率低。
模型并行可进一步细分为几种策略,包括流水线并行(Pipeline Parallel,PP)和张量并行(Tensor Parallel,TP)。
- 张量并行
将单个张量操作分布到多个设备或处理器上,对模型的内部层进行分割,将某一层的计算分配到不同的设备上。基于大张量操作(如矩阵乘法)可分解为小操作的理念,PyTorch等框架已内置此策略。

- 流水线并行
将模型的不同层放置在不同的设备上。如,前几层放在一个设备上,中间几层放在另一个设备上,最后几层放在第三个设备上。可在不同设备上并行执行不同的模型阶段,从而提高效率。

- 混合并行:是数据并行和模型并行的结合。
混合拆分:先按模型并行将96层Transformer拆为8段(每段12层对应1张GPU),再按数据并行将批次数据拆为4份,用4个8卡模型组同步训练;
计算流程:单8卡组内按模型并行完成全量计算→组间按数据并行同步梯度→全局更新参数;
工业界实践:OpenAI训练GPT-3采用模型并行+数据并行+流水线并行的3D混合并行,训练效率提升3倍。
优势:取两者优点,解决模型并行中GPU闲置问题,通过交错处理微批次数据提高GPU利用率;支持千亿级模型在百卡集群训练;
痛点:实现复杂(需协调拆分粒度与比例),依赖高级API(如Megatron-LM的3D并行接口)。

对于模型训练来说,不管是哪一种并行策略,其本质上包括将模型进行纵向或横向切分,然后将单独切分出来的放在不同的机器上进行计算,来充分的利用计算资源。
可优化点:数据并行、梯度更新、模型并行、通讯等。
加速方法
- AI平台化
- 优化训练库:包括CUDA内核优化和库SDK增强;
- 拓扑感知的数据传输
- 拓扑感知的容器编排
- 辅助服务:边缘数据存储
实际生产中通常是多种并行方法一起使用。缺点是数据并行和模型并行时,会保存模型运行时的全部状态,造成大量内存冗余。
Open MPI
官网,主要是C实现、开源(GitHub,2.6K Star,990 Fork)规范项目,由学术界、研究机构和工业界的合作伙伴共同开发和维护,旨在为高性能计算(HPC)社区提供最优的MPI库。结合来自HPC社区的专业知识、技术和资源,广泛应用于系统和软件供应商、应用开发者以及计算机科学研究人员。官方文档。
特点
- 跨平台支持:Open MPI支持多种硬件和操作系统,适用于不同HPC环境
- 高性能:通过优化通信和计算性能,提供卓越效率
- 模块化设计:其模块化架构允许用户根据需求定制功能
- 多语言支持:支持C、Fortran和Java等多种编程语言
MPICH
官网,
Microsoft MPI
开源(GitHub,303 Star,84 Fork)
DeepSpeed
微软开源大模型加速训练框架,特点:
- 高效性:能够充分利用硬件资源实现高吞吐和可扩展性;
- 有效性:高精度、快速收敛、低成本;
- 易于使用:提高开发生产力。
核心技术是ZeRO,可有效的提高训练时显存的利用率和计算效率。ZeRO可克服数据并行和模型并行的局限性,同时实现两者的优点,它是将模型划分为状态参数、梯度、优化器状态来降低内存冗余,提升显存利用率。
ZeRO共分为三个阶段:
- ZeRO-1:切分优化器状态,每个GPU只需要保存自己那部分优化器状态参数即可,优化器状态参数是大模型训练中显存占比最高的部分,使用ZeRO-1可减少4倍内存消耗,通讯量和数据并行相同;
- ZeRO-2:在ZeRO-1基础上,增加切分梯度,每个GPU只需要保存自己那部分优化器状态和梯度参数即可,进一步降低显存占比,可减少8倍内存消耗,通讯量和数据并行相同;
- ZeRO-3:在ZeRO-2基础上,增加参数切分,内存减少与数据并行度Nd呈线性关系。
例如,在64个GPU(Nd=64)之间进行拆分将产生64倍的内存缩减,则通信量也有比较大的增加,前两个ZeRO只在反向传播时需要通讯,ZeRO-3在前向传播时也需要进行不同GPU间的通讯,类似于参数并行。
ZeRO优化:
- ZeRO-Offload:同时利用CPU和GPU内存来训练大型模型。核心是将优化器状态和梯度卸到CPU内存中,在利用到参数时,再将其调度到GPU。优点:节省显存;缺点:通讯延迟增加;
- ZeRO-3 offload:ZeRO-3和ZeRO offload相结合,优点:极高的内存效率、使用方便、每个GPU的高性能吞吐量和跨GPU的超线性可扩展性,用于分布式训练。
以上多种优化方式都有优缺点,增加模型显存利用的同时,会带来通许延迟的增加,是一个需要根据资源、时间等综合考虑的方式;
除ZeRO外的其他优化:
- 可扩展性:支持高效的数据并行、模型并行、管道并行及其组合,即3D并行;
- 通信效率:pipline并行减少分布式训练期间的通信量,使用户可在网络带宽有限的集群上以2-7倍的速度训练数十亿参数的模型;
- 支持长序列:提供一种稀疏注意力内核技术,与经典稠密的Transformer相比,可支持长达一个数量级的输入序列,速度快6倍,准确度与原来相当。优于最先进的稀疏实现,执行速度提升1.5-3倍;
- 快速收敛以提高效率:支持先进的超参数调整和大批量大小优化器,如LAMB,以提高模更快型训练的效果,并减少达到所需精度所需的样本数量。
Megatron
Megatron-LM是Nvidia开发的加速框架,对Nvidia卡适配更好,训练速度通常比DeepSpeed快20%-30%。
核心优化技术:
- 多并行技术组合:利用PTD-P技术,结合流水线、张量和数据并行;
- 优化张量并行:把Masked Multi-Head Self Attention和Feed Forward都进行切分以并行化,利用Transformer网络结构,通过添加一些同步原语来创建一个简单的模型并行实现;
- 流水线并行优化:传统的流水线并行通常会在一个设备上放置几个模块,通过在计算和通信之间取得平衡来提高效率。
在设备数量不变的前提下,将流水线阶段进一步细分,以承载更多的通信量,从而降低空闲时间的比率,以缩短每个步骤的执行时间。
Torchrun
PyTorch提供的一个命令行工具,用于简化分布式训练的启动和管理。在PyTorch1.10中引入的,取代之前torch.distributed.launch模块,旨在提供更便捷、灵活的方式来运行分布式深度学习任务。改进包括:
- 弹性训练支持:支持动态调整工作节点数量(Elastic Training);
- 错误处理:更好地管理进程崩溃和重启;
- 跨平台兼容性:无需手动指定启动命令,支持单机多进程和多机分布式场景。
通过以下步骤启动分布式任务:
- 解析参数:根据用户提供的命令行参数(如进程数、节点数等),配置分布式环境;
- 环境变量设置:为每个进程设置分布式训练所需的环境变量:
- RANK:当前进程的全局排名;
- WORK_SIZE:总进程数;
- MASTER_ADDR和MASTER_PORT:主节点的地址和端口,用于进程间通信;
- 进程启动:根据指定的
--nproc_per_node(每个节点的进程数)和--nnodes(节点数),启动多个Python进程; - 运行用户脚本:每个进程独立运行用户提供的Python脚本,并通过PyTorch的分布式通信后端(如NCCL、Gloo或MPI)进行协作。
核心组件:
- 分布式环境初始化:通过
torch.distributed设置通信基础; - 进程管理:启动和管理多进程,支持单机/多机;
- 通信后端:依赖NCCL/Gloo/MPI实现高效通信;
- 数据并行:与DDP和DistributedSampler协作;
- 弹性训练:通过
torch.distributed.elastic支持动态调整; - 日志与错误处理:提供调试和容错支持;
- 用户接口:通过命令行参数灵活配置。