一台机器装不下之后:分布式机器学习该按什么顺序学 | xkmchenmu Blog

一台机器装不下之后:分布式机器学习该按什么顺序学

分布式训练并不是多启动几个进程,而是把优化问题、模型状态与通信流量重新切分。本文从“为什么单机不够”出发,给出算法语义、并行策略、集合通信、扩展效率和故障恢复五层学习路线,并为每层配置可验证练习。

当训练时间过长、模型与优化器状态超出单卡显存,或数据吞吐让设备长期等待时,增加计算节点看起来是自然选择。但新节点同时带来梯度通信、参数版本、负载不均和故障恢复,计算量并不会自动按设备数等比例缩短。学习分布式机器学习的关键,是先把瓶颈说清,再理解算法允许怎样拆分,最后才接触框架命令。否则,系统即使能启动,也无法解释为何卡越多反而越慢。

第一问不是“用几张卡”,而是“哪里放不下”

可以分别测量参数、梯度、优化器状态、前向激活和一个批次数据的内存占用,再用性能剖析观察数据加载、计算与通信时间。若模型能放下但单步太慢,优先考虑数据并行;若单层矩阵本身过大,需要张量切分;若不同层可分到多个设备,可考虑流水线;若主要压力来自状态副本,则参数、梯度或优化器分片更直接。没有这份单机基线,任何并行方案都缺少比较对象。

一台机器装不下之后:分布式机器学习该按什么顺序学 - 单机瓶颈分流图
限制现象 可能的切分方向 新增代价
训练样本计算量大 各设备处理不同小批次 每步聚合梯度
某层权重无法单卡容纳 在层内切分矩阵或张量 频繁集合通信
连续层整体过大 按阶段构建流水线 气泡与激活传输
优化器状态占用突出 按工作节点分片保存 更新前后收集与散布
输入读取跟不上 分片、预取与并行解码 一致的数据顺序管理

数据并行改变了全局批大小

每张卡维持相同本地 batch,设备数增加后,全局 batch 会随之放大,而每个 epoch 的参数更新次数减少。这不仅是系统变化,也是优化变化:学习率、预热、总步数和正则效果可能需要重新验证。若为了保持全局 batch 而减小每卡样本数,设备利用率又可能下降。扩展实验应同时报告达到同一验证质量所需时间,而不是只报告每秒处理样本数。

吞吐更高却需要更多训练步才能达到原有质量,不能称为完整加速;质量相同而成本翻倍,也不一定是可接受扩展。

最小练习是先用两张设备复现单卡一个更新步:固定相同输入,比较聚合后梯度和参数变化是否在允许误差内。数值对不上时,先检查梯度求和还是平均、损失缩放和随机层状态,不要直接跑长训练。

同步语义决定每个梯度针对哪份参数

同步数据并行让所有工作节点基于同一参数版本计算,等全部梯度聚合后再共同更新。优点是语义清楚,缺点是最慢节点决定单步时间。异步方案允许节点独立提交更新,能够绕过部分等待,却产生陈旧梯度:某个梯度可能由较早参数计算,抵达时全局模型已经变化。局部更新、周期平均与弹性训练位于两端之间,各自改变收敛条件。

  1. 画出一个训练步的参数读取、前向、反向、聚合与更新顺序。
  2. 注明所有节点是否在屏障处等待,以及慢节点怎样处理。
  3. 记录梯度是求和还是平均,丢失节点是否改变有效 batch。
  4. 对异步方案测量版本延迟分布,而不只记录平均吞吐。
  5. 比较相同步数、相同样本数和相同墙钟时间三种评价口径。

参数服务器与 AllReduce 是两种组织方式

参数服务器由一个或多个服务器维护参数,工作节点拉取并推送更新,便于表达异步与稀疏访问,但服务器可能成为热点。AllReduce 让参与节点共同完成梯度聚合,不要求单一中心持有全部结果;环、树或分层算法会在带宽利用和启动延迟之间取舍。节点内高速互联与跨机网络性能不同,拓扑感知的分层聚合通常比把所有链路视为同速更合理。

  • 先测点对点带宽与延迟,再测实际张量大小的集合操作。
  • 观察通信能否与反向计算重叠,以及最后几个梯度桶是否形成尾巴。
  • 小张量过多时关注启动开销,大张量则更受带宽限制。
  • 使用压缩或量化前验证它对收敛与最终质量的影响。

扩展曲线比峰值数字更诚实

固定总问题规模、增加设备观察训练时间,属于强扩展;让每台设备维持近似工作量、总问题规模同步增加,属于弱扩展。二者回答不同问题。加速比可由单机时间除以多机时间计算,扩展效率再除以设备数。理想线性很少长期成立,因为串行数据处理、同步、网络和负载不均会逐渐占据关键路径。

实验至少选择一、二、四、八等多个规模点,记录每步计算、通信、等待和输入时间。若新增设备后通信增长超过计算节省,应尝试更大计算粒度、重叠通信、调整拓扑或停止扩容,而不是继续堆机器。成本报告还要包括设备小时、存储读写和失败重跑。

长训练必须假设节点会失败

检查点不仅保存模型权重,还可能需要优化器状态、学习率调度、随机数、混合精度缩放器和数据迭代位置。恢复后如果大量重复或跳过样本,训练轨迹已经改变。检查点写入应原子完成,并保留至少一个已验证旧版本;分布式分片检查点还要记录世界大小和重新映射规则。

可以主动终止一个工作节点、断开短时网络或让存储写入失败,观察控制面是否停止、重试或弹性重组。弹性成员变化会改变全局 batch 和随机数据划分,不能只让进程数量恢复就宣布成功。故障演练的验收是恢复后损失连续、样本进度合理、最终质量可接受。

一条由产物驱动的阅读路线

先复习单机 SGD 与性能剖析,产出一份内存和时间分解;再实现两设备同步数据并行,产出数值一致性测试;随后学习参数服务器和集合通信,产出带宽、延迟与扩展曲线;最后研究分片、流水线和容错,产出故障注入与恢复报告。教材中从基础、框架模块、算法组合到主流系统和未来方向的章节,也可以按这条路线重新组织。

每阅读一种方法,都追问它解决的是显存、算力还是墙钟时间,通信量如何随设备数变化,参数一致性是什么,达到同一质量需要多少样本和成本,故障后从什么状态继续。分布式机器学习恰好位于优化算法与计算系统的交界:只有两边的语义都能用实验验证,集群规模才会成为能力,而不是更昂贵的不确定性。

(0)
打赏 支付宝扫一扫 支付宝扫一扫

发表回复

登录后才能评论