1 分布式训练原理要回答什么
训练图像分类模型时,单张 GPU 跑完 1 轮需要 40 分钟,增加到 4 张 GPU 后,时间会变成 10 分钟吗?如果模型连单张 GPU 都放不下,增加 GPU 又该怎样分工?分布式训练研究的就是这些问题:怎样把数据、模型和训练工作分给多个计算参与者,怎样交换必要的信息,以及怎样判断额外资源是否值得。它首先是任务划分与协作问题,随后才是设备数量问题。
先固定训练的基本动作。模型读取 1 个批次的样本,前向计算得到预测与损失,反向计算得到梯度,优化器再用梯度更新参数。这里把完成 1 次参数更新称为 1 个 Step。梯度指出当前损失相对参数的变化方向,并不等于新的参数。多个设备合作时,必须说清它们算的是哪些样本、持有哪些参数,以及更新前要汇总什么信息,否则看似同时训练,实际可能在优化不同的目标。
本课以 CIFAR-10 图像分类为主要背景。它包含 10 个类别,输入是图像像素,输出是类别预测。可把官方训练集的 50000 张图像划成 45000 张训练图像和 5000 张验证图像,保留官方 10000 张测试图像用于最终评估。拆分记录应固定,并检查重复图像或相关来源是否跨集合。训练集用于求梯度,验证集用于选择配置,测试集不能成为反复调参的反馈来源。并行训练只改变计算组织,不会让泄漏变得合理。
对于其他任务,原则相同。使用公开的银行营销表格数据预测客户是否响应时,输入可以包含年龄、职业、账户与过往接触信息,但不能把预测时尚未发生的通话结果当作特征。使用 AG News 做短文本分类时,应在训练集上拟合词表或文本处理规则,再应用到验证集与测试集。若真实部署面对更新的新闻主题,还需另外检查时间上的分布偏移;随机拆分的高分不能直接代表未来表现。
我们关心 2 类结果:计算结果与学习结果。前者包括 Step 时间、每秒处理的样本数和显存占用;后者包括验证损失、准确率及宏平均 F1。对于正类稀少的响应预测,还应报告精确率、召回率、F1 和 ROC AUC,必要时补充 PR AUC。宏平均 F1 让各类别获得相同权重,能帮助发现小类别被忽视的情况。吞吐增加但验证质量下降,不能直接称为训练成功。

2 并行策略与通信域
最容易理解的是数据并行:各设备持有相同结构、相同起点的完整模型,读取不同样本,分别计算梯度,再合并梯度并更新参数。例如 4 张 GPU 各读 32 张图像,若没有梯度累积,全局批量就是 128。这里的本地批量表示单个数据副本处理的样本数,全局批量表示共同支持 1 次更新的样本总数。设备变多时,这 2 个量不能混用。
数据并行通常以 All-Reduce 完成梯度汇总。入门阶段可以把它理解为:参与设备共同求和,并让每个参与者都得到结果,再按约定得到平均梯度。实际实现不必让某张 GPU 收齐全部梯度后再广播。只要起点、梯度结果和更新规则一致,各副本就能保持参数一致。通信搬运的是梯度张量,不是把原始训练图像交给每张 GPU 重新计算。
模型并行则拆分模型。张量并行把某些层的张量计算分给多个设备,例如共同计算较大的矩阵乘法;这些设备需要频繁交换局部结果。流水并行把连续的层分成多个阶段,样本的中间表示依次经过阶段,反向时梯度沿相反方向返回。它们可以帮助容纳单张设备放不下的模型,但也引入更多协作。对能放进单张 GPU 的小型 CIFAR-10 分类器,直接增加模型并行通常没有足够的收益。
通信域是“谁必须一起交换某类信息”的范围,也常称通信组。假设有 8 张 GPU,每 2 张共同构成 1 个张量并行模型,共有 4 个数据副本,那么张量并行组有 2 个参与者,而对应参数分片的数据并行组有 4 个参与者。通信组可能交叉存在,并不等于把所有设备放进同一个大组做所有操作。节点是承载设备的机器;跨节点链路与节点内链路的能力可能不同,因此分组还要考虑设备拓扑。
批量计算也要沿这个边界理解。全局批量可写为“本地微批量 × 数据并行副本数 × 梯度累积次数”。张量并行的 2 张 GPU 若共同处理同一批样本,只算 1 个数据副本,不能把样本数再乘 2。微批量是拆分后的计算小批次,梯度累积表示连续处理多个微批量后才更新参数。累积能减少更新频率或控制单次显存需求,却不会凭空消除总计算量。
对入门训练方案,可以先问模型是否能放入单卡,再问当前时间主要花在哪里。模型能放下且计算足够重时,优先评估数据并行;模型放不下时,再考虑模型切分及下一课的显存优化。策略可以组合,但组合意味着更多通信组、批量约定和故障位置。还未测量单卡行为就同时加入多种并行,会让结果难以解释。
3 同步、异步与气泡
同步数据并行要求各参与者在更新前得到本次所需的共同梯度结果。它不要求所有设备的每条指令同时执行,但更新存在依赖:某个参与者还没有贡献所需梯度,其他参与者就不能完成这次共同更新。假设 4 个参与者的本地计算分别用时 40、41、42、65 毫秒,较快的设备可能需要等待较慢者。处理较大图像、读取数据变慢或共享资源竞争,都可能制造这种拖尾。
异步训练允许部分参与者不等待所有其他参与者,较早提交自己的更新。但当某个参与者开始计算后,其他参与者可能已经改变了参数,它提交的梯度便对应较旧的参数版本,这称为梯度陈旧。异步能减少某些等待,却改变优化过程,也增加质量分析的难度。本课只建立这个区别,不展开一致性协议或收敛证明。不要把“不同时间启动 GPU 工作”都叫作异步训练;框架内部的异步执行可以服务于同步更新。
流水并行中的气泡,是某个阶段因为上下游依赖而暂时没有有效计算的空档。例如模型分成 4 个阶段,首个微批量进入第 1 阶段时,后续阶段还没有输入;末尾阶段完成后,前面的阶段也可能等待反向信号。把批次拆成更多微批量,可以让多个阶段同时处理不同微批量,摊薄启动和排空的空档。但过小的微批量又可能让计算效率下降,不能只看填满的格子数量。
为了形成直觉,可以使用平衡阶段、相同计算时长且忽略通信的简化流水模型。若阶段数为 p,微批量数为 m,则一种简单调度的理想忙碌比例可近似写成 m/(m+p−1)。当 p=4、m=4 时约为 57.1%;当 m=16 时约为 84.2%。这个公式不是所有训练调度的通用预测器,它只是展示固定启动与排空开销如何被更多微批量摊薄。真实情况还受反向调度、阶段失衡与通信影响。

等待还可能来自通信。同步点让慢链路、慢计算或数据读取问题显现出来,但同步点本身不一定是根因。看到设备利用率下降时,应先定位它在等待数据、等待梯度还是等待下一阶段输入。反过来,利用率很高也不保证训练高效,设备可能在执行很多低效率的小操作。时间线上的有效工作与验证质量,才是解释现象的依据。
4 动手:分解一次 Step 时间
现在为 CIFAR-10 分类器设计可复现的计时实验。固定训练与验证划分、模型结构、精度设置、优化器和数据增强规则,记录软件版本与设备条件。比较 1 张和 4 张 GPU 时,先选全局批量均为 128 的设置:单卡本地批量为 128,4 卡各为 32,且不使用梯度累积。这样可以先观察处理相同训练工作时的系统变化。不同本地批量仍可能影响部分层的统计行为,因此验证指标也要一起检查。
测量前先完成 20 个预热 Step,让运行时初始化、缓存和首次执行开销基本过去,再连续测量 100 个 Step。设备操作常以异步方式提交,主机端函数返回不代表 GPU 已完成。测整段墙钟时间时,应在测量边界等待设备完成;查看细节时使用设备事件或性能分析器。不要为统计每个小操作都强制同步,否则会打断原本可能重叠的执行。所有参与者都必须使用一致的测量范围。
把观测分为数据准备、前向、反向、梯度通信和优化器更新,同时保留完整时间线。各段累计时长可能重叠,不能直接相加当作 Step 时间。设单卡的非重叠简化记录为:数据等待 8 毫秒、前向与反向 72 毫秒、更新 4 毫秒,总计 84 毫秒。假设 4 卡时数据等待 8 毫秒、本地计算 22 毫秒、通信 18 毫秒、更新 4 毫秒,若全部串行,总计为 52 毫秒。这些是教学用的假设测量值。
若通过分桶通信,让部分梯度就绪后就开始传输,18 毫秒通信中有 12 毫秒与反向计算重叠,那么留在关键路径上的通信只有 6 毫秒,Step 可降至约 40 毫秒。关键路径指决定整步何时能完成的依赖链。这里计算得到的 40 毫秒建立在其他时间不变的假设上;实际通信还可能争用计算资源,必须重新测量,不能直接从配置项推断。
固定全局批量为 128 时,84 毫秒对应约 1524 样本/秒,40 毫秒对应 3200 样本/秒,加速比为 84/40=2.1。若通信完全未重叠,52 毫秒对应约 2462 样本/秒,加速比约为 1.62。计算吞吐时,分子使用去除重复填充后的有效样本数;若末尾批次为了对齐而重复样本,不能把重复处理都当成新增训练数据。

最后记录每组的 Step 时间中位数与 P95,并记录验证损失和宏平均 F1。P95 表示约 95% 的观测值不超过这个时间,可揭示偶发拖尾。模型保存和完整验证若不在 Step 计时范围内,应另外统计;估计总训练耗时时再加回。若输入流水线持续提前准备数据,数据处理时长也不等于可见等待时长。实验报告必须说明时间边界,避免把不同范围的数字直接相除。
5 扩展效率与复杂度取舍
加速比 S 表示基线耗时除以并行耗时;扩展效率 E=S/N,其中 N 是相对基线的设备数。前面的 4 卡实验中,S=2.1,E=52.5%。它说明新增设备没有按比例转化为速度,并不自动说明方案不可用。若任务有严格的完成期限,2.1 倍加速可能有价值;若资源紧张,单卡可能更合适。应把耗时、资源消耗和任务目标放在同一张评估表里。
以 GPU 秒衡量占用,单卡每步消耗 0.084 GPU 秒,4 卡每步消耗 4×0.040=0.160 GPU 秒。在全局批量和更新步数固定的条件下,后者更快,却消耗更多设备时间。这个指标只表示设备占用量,不等于精确费用,也没有覆盖 CPU、内存与存储开销。选择策略时还要考虑故障恢复、检查点与工程维护成本,不能把加速比当作唯一答案。
固定全局批量、增加设备数,常用来观察强扩展能力;固定各数据副本的本地批量、随设备数增加全局批量,则更接近弱扩展观察。后者常能保持每张 GPU 的计算量,但每轮更新次数减少,优化行为也会变化。例如从全局批量 128 增至 512,处理相同数量样本的更新次数约为原来的 1/4。不能因为每轮更快,就断定达到相同验证指标也更快。
因此还应测量“达到目标质量所需时间”。例如在固定验证集上,以宏平均 F1 达到预先约定的阈值且保持稳定为条件,比较从训练开始到达标的墙钟时间。学习率、训练轮数与预热安排可能需要随批量重新评估,不存在适用于所有任务的机械缩放规则。若验证集反复参与大量配置选择,最终仍应在保留测试集上确认泛化结果,并报告多次运行的波动。
滑块使用理想化数据并行模型:设备数 N 增加时,可并行计算项按 72/N 毫秒缩小,固定项为 12 毫秒,另有用户设置的通信时间。这个模型帮助理解“可分摊计算逐渐变小,固定开销开始主导”的趋势。它不预测某种设备的性能,也不描述模型能否放入显存。真实训练中的小批量效率、网络拥塞和数据供应变化,都可能使扩展比示意结果更差。
复杂度也有学习成本。数据并行通常较容易建立可靠基线;张量并行需要细粒度协作;流水并行需要处理阶段边界、微批量和调度。模型较小时,把任务放到更多设备上可能只增加传输与管理负担。优先选择能满足显存、完成时间和质量目标的较简单配置,再通过证据决定是否增加复杂性。
6 常见坑:通信与计算未重叠
一种常见误解是“调用了异步通信接口,通信就已经被计算隐藏”。异步提交只意味着调用方可能不立即等待;能否重叠,还取决于梯度何时就绪、通信何时实际启动,以及后续计算是否独立。若等整个反向计算结束才发送全部梯度,后面已经没有多少计算可以覆盖通信。若发送后立刻等待完成,再执行剩余反向计算,也会把原本可能并行的部分重新串行化。
分桶是一种常见处理方式:把梯度分成若干组,某组梯度准备好后便开始归约,其余层继续反向。桶过大,首个通信启动较晚;桶过小,通信次数增多,启动开销可能占比过高。入门阶段无需推导具体算法,只需在时间线上确认“就绪—发起—完成”的位置,并检查结尾是否仍有很长的通信尾巴。调小桶不是通用答案,必须让同一实验条件下的测量说话。
还有看似通信问题、实则来自计算或输入的问题。如果某个参与者读取图像持续变慢,其他参与者可能在归约时等待它;若短文本批次长度差异很大,填充与计算时间也会不平衡。诊断时先比较各参与者的数据等待、计算结束时间和通信启动时间,再决定是否调整数据加载、长度分桶或通信参数。仅看到 All-Reduce 持续时间长,无法证明链路带宽不足。

正确性也可能被分布式配置破坏。若各设备没有正确划分数据,可能反复读取相同样本;若每轮没有更新采样次序,训练顺序可能长期重复;若梯度累积时损失缩放不一致,则更新幅度可能改变。验证时应汇总各设备的预测与真实标签,或汇总足以计算指标的统计量。F1 和 AUC 通常不能简单平均各设备的指标;尤其 AUC 依赖样本间排序,需要正确的全局评估方式。
类别不平衡还会放大误判。某个数据分片可能几乎没有正类,其本地召回率没有代表性;各设备独立做过采样,也可能造成重复样本过多或整体类别权重偏移。应先明确全局采样目标,再检查每轮实际样本分布。对银行营销数据,若准确率很高但正类召回率很低,增加 GPU 无法修复目标定义。先核对标签、阈值与采样,再讨论加速。
7 案例:流水气泡吞掉加速比
考虑 1 个使用 AG News 的教学实验:把文本编码模型分成 4 个连续阶段,放在 4 张 GPU 上。训练数据划出固定验证集,官方测试集保留;输入为截断到固定上限的词元序列,记录准确率和宏平均 F1。为便于解释,假设模型也能在单卡运行,单卡是性能基线。最初配置只使用 1 个微批量,目的是观察流水依赖,而不是展示理想的生产配置。
在阶段计算时间接近的简化情况下,1 个微批量沿 4 个阶段前进时,往往只有少数阶段在工作。即使每段计算只需约 10 毫秒,1 次前向也仍需顺序经过约 40 毫秒的计算,再加边界传输;反向还有相反方向的依赖。4 张 GPU 的显存占用下降了,但样本并没有获得 4 倍处理速度。这时增加设备解决了模型分布位置,却没有自动创造足够的并行工作。
接着固定每次更新使用 64 个样本,把它拆为 16 个微批量,每个微批量含 4 个样本,并在这次更新内累积梯度。微批量依次进入流水后,不同阶段有机会同时处理不同微批量。前面简化模型给出的忙碌比例从 m=1 时的 25% 提升至 m=16 时的约 84.2%。这只证明依赖空档可以摊薄,实际吞吐仍要测量;小微批量可能降低矩阵计算效率,传输也会增加额外负担。
如果第 3 阶段含较多层,计算时间明显超过其他阶段,填充更多微批量仍会让它成为瓶颈。此时要根据阶段耗时重新选择切分位置,并同时检查边界激活的大小。按层数平均切分不等于按耗时平均切分;选择在大张量处切开,也可能让通信代价超过计算均衡的收益。更改切分后需重新确认显存可容纳,因为阶段需要保存的中间结果也会变化。
这个案例的验收包括 3 个方面:时间线上空闲区间是否减少,达到相同验证质量的时间是否缩短,总资源占用是否符合约束。若单卡本来能容纳模型,且数据并行更简单、更快,最终可以选择数据并行。若必须切分才能运行,就接受合理的气泡并继续优化。训练方案应允许比较结果改变选择,而不是为了保留最初的并行策略而挑选指标。
8 把并行策略写进训练方案
可复现方案先写任务边界:数据来源、预测时刻、输入特征、标签定义与评估目标。对于客户响应预测,明确是否只使用发起联系前可获得的年龄、职业与历史接触特征,说明缺失值与类别编码规则如何在训练集拟合。若同一客户有多条记录,应按客户分组拆分;若目标是预测未来响应,应考虑按时间拆分。否则训练更快只会让错误的评估更快完成。
随后写资源与并行配置:节点数、每节点设备数、数据副本数、模型切分方式、本地微批量、累积次数与全局批量,并明确同步更新规则。记录数据采样如何避免不同副本重复读取,以及末尾不完整批次如何处理。若采用类别权重或重采样,要说明它们定义在全局数据层面还是本地批次层面,避免设备数变化时训练目标悄悄变化。
性能部分同时写基线和候选方案。基线必须注明模型、数值精度、计时范围与批量;候选方案给出 Step 时间中位数、P95、有效样本吞吐、加速比与设备时间。对于存在显存限制、无法运行单卡的模型,可以使用能运行的较小设备组作基线,并清楚标注,不能虚构单卡加速比。若比较改变了全局批量,应单独解释质量控制与学习率选择。
质量部分预先约定验证指标与接受范围。例如图像分类报告准确率和宏平均 F1;响应预测报告精确率、召回率、F1、ROC AUC 与 PR AUC,并在验证集选择决策阈值。阈值改变会改变精确率和召回率,即使排序能力相近,业务效果也可能不同。对分布偏移,另外保留较新时间段或不同来源的评估切片,检查总体分数是否掩盖特定人群或类别的退化。
最后记录恢复与复核方法。检查点应足以恢复模型、优化器与进度,并说明随机状态和数据次序能恢复到什么程度;恢复后是否允许重复处理少量样本也应明确。先做短程验证,确认损失有限、样本覆盖合理、指标汇总正确,再启动完整训练。分布式训练的方案价值,在于别人能够复现选择依据,并在设备数或数据分布改变后重新评估,而不是只复制启动命令。
9 从分布式训练原理走向显存优化(A42)
到这里应区分 2 类约束:算得太慢,以及根本放不下。数据并行复制完整模型,通常不能直接解决单个副本的模型状态超出显存的问题;减少本地批量主要减少部分激活占用,也不一定足够。模型并行把内容分到多个设备,但可能增加边界通信与等待。显存与速度相互影响,却不是同一个指标,不能仅凭显存下降推断训练加速。
下一课 A42 会进一步区分参数、梯度、优化器状态和前向激活的显存来源,并讨论混合精度、激活重计算与状态分片等方向。当前只需知道它们改变了“保存什么、保存在哪里、何时重新计算或搬运”。例如以额外计算换取更少的激活保存,可能让模型能运行,也可能延长 Step;状态分片可能降低冗余,但增加通信。具体机制与配置边界留给下一课。
进入显存优化前,保留本课的基线记录:可运行批量、显存峰值、时间线、吞吐和验证质量。还要记录峰值发生在初始化、前向、反向还是更新附近,因为常驻占用与瞬时峰值需要不同解释。若已有通信尾巴,加入更多搬运可能使其更严重;若计算尚有余量,额外重计算也可能值得评估。所有判断都应回到同一个训练目标与相同数据划分。
本课可以形成清晰的决策顺序:先证明数据与评估正确,再测量单卡或最小可运行基线;依据容量与耗时瓶颈选择并行方式;用时间线区分计算、通信和等待;最后比较达到目标质量的时间与资源消耗。这样进入 A42 时,显存优化就有明确的出发点,也能判断它究竟解除了容量限制,还是改善了整体训练效率。
放进方案里
本项目使用 CIFAR-10 完成 10 类图像分类,官方训练集固定划分为 45000 张训练图像和 5000 张验证图像,官方 10000 张测试图像仅用于最终确认。数据增强只用于训练,验证与测试采用固定预处理,并检查重复样本。验收同时记录准确率、宏平均 F1 和验证损失,避免只依据吞吐判断训练效果。若后续引入不同来源图像,另设评估切片检查分布偏移。
模型能够在单张 GPU 运行,因此先建立单卡基线,再评估 4 卡同步数据并行。全局批量固定为 128,单卡本地批量为 128,4 卡各为 32,梯度累积次数为 1。各数据副本读取不同样本,并在每轮更新采样顺序。固定模型、优化器与精度设置,记录可能因本地批量改变而受影响的层行为,完整保存实验配置。
每组预热 20 个 Step 后测量 100 个 Step,记录中位数、P95、有效样本吞吐和显存峰值,并用时间线观察梯度通信与反向计算的重叠。若出现拖尾,先比较各参与者的数据等待与计算结束时间,再检查通信尾部。教学估算中的单卡 84 毫秒、4 卡 40 毫秒仅用于说明计算方法,正式决策使用实际测量结果。
正确性验收保留各副本的样本编号与更新次数,确认共同更新步数一致,末尾填充样本已从验证统计中去重。汇总全局混淆矩阵后计算宏平均 F1,禁止直接平均各卡 F1。单卡与多卡的质量容差依据重复基线实验预先确定;超出容差时,先核查梯度归约的求和或平均约定及批量统计层,再接受性能结论。
候选方案必须报告加速比、扩展效率、设备时间和达到预定验证质量的耗时。若全局批量改变,重新评估学习率与收敛过程。检查点保存模型、优化器和训练进度,并进行短程恢复验证。若显存成为限制,带着峰值位置和时间线进入 A42,评估相应优化对容量、通信、计算及质量的共同影响。
10 小结:下一步显存优化(A42)
分布式训练通过划分工作并交换必要信息,让多个设备共同完成训练。数据并行划分样本,张量并行划分层内计算,流水并行划分连续阶段;同步等待、通信尾部与流水气泡决定新增资源能转化为多少速度。最终验收还包括样本划分、指标汇总和泛化质量。
自测时试着解释:4 个数据副本各处理 16 个样本、累积 2 次,全局批量为何是 128?通信累计时长为何不能直接加到计算时长上?4 卡吞吐增加后,为何仍需比较达到目标 F1 的时间?能回答这些问题,就可以带着容量与关键路径的区别,进入 A42 的显存优化。