AI训练为什么需要Checkpoint GPU集群发生故障后如何减少重复计算
在大规模AI训练集群中,GPU故障、节点宕机、网络异常、驱动崩溃甚至存储故障都可能导致训练任务中断。对于运行数天甚至数周的大模型训练任务,如果每次发生故障都必须从头开始计算,浪费的不只是几个小时的GPU时间,而可能是数百万甚至更高的计算资源。
Checkpoint的作用,就是把训练过程中的关键状态周期性持久化。当训练任务发生故障后,可以从最近一次成功保存的状态继续,而不必重新计算全部历史训练步骤。不过,Checkpoint并不是简单地“把模型参数保存到硬盘”,在分布式训练环境中,它本身就是一个需要认真设计的存储、通信和一致性问题。
Checkpoint究竟保存什么
最简单的训练程序可能只保存模型权重,但真正需要支持断点续训的训练系统通常还需要保存优化器状态、学习率调度器状态、当前训练step以及随机数生成器状态等信息。
优化器状态尤其重要。例如Adam等优化器除了模型参数之外,还维护一阶和二阶动量。如果只保存模型权重而没有保存优化器状态,恢复之后虽然可以继续计算,但训练过程已经不再严格等价于原来的训练过程。
对于混合精度训练,还可能涉及GradScaler等状态。对于数据并行、张量并行、流水线并行或其他分布式训练方式,还需要考虑各个Rank对应的状态以及Checkpoint的分片布局。
因此,一个真正的训练Checkpoint可以理解为某个训练时刻的完整恢复状态,而不仅仅是一份模型权重文件。
Checkpoint频率决定了故障时需要重复多少计算
Checkpoint最直接的作用,是限制故障发生后需要重新计算的训练量。
假设训练任务每两个小时保存一次Checkpoint,而故障发生在距离上一次成功保存Checkpoint约90分钟之后,那么恢复时通常最多需要重新计算这90分钟左右的训练进度。
如果Checkpoint每10分钟保存一次,理论上的重复计算窗口会明显缩小,但Checkpoint本身会产生额外的I/O、网络流量和存储压力。
因此Checkpoint并不是越频繁越好。
实际系统通常需要根据训练任务的GPU成本、Checkpoint大小、存储吞吐量、恢复时间目标以及故障概率综合决定保存频率。对于超大模型,单次Checkpoint可能非常庞大,如果每几分钟都把完整状态写入远程对象存储,Checkpoint本身就可能成为训练性能瓶颈。
分布式训练的Checkpoint比单GPU复杂得多
在单GPU训练中,可以简单地保存模型和优化器状态。但在大规模GPU集群中,一个训练任务可能同时运行数百甚至数千个GPU。
此时模型参数可能已经按照数据并行、张量并行、流水线并行或其他并行策略分布在不同GPU和节点上。
因此Checkpoint也经常采用分片方式保存。
例如模型状态被分散到多个Rank,每个Rank负责保存自己对应的一部分状态。恢复时,再根据当前训练拓扑把这些状态重新映射到对应的计算进程。
这里不能简单地认为“发生故障后只读取故障节点的Checkpoint即可”。如果训练任务的并行拓扑发生变化,或者某些分片状态位于其他节点,那么恢复过程可能需要重新加载和重新分布整个训练状态。
现代训练系统因此越来越重视与并行策略配合的Sharded Checkpoint以及高效的分布式状态保存机制。
故障发生之后并不是简单地重新启动程序
GPU集群发生故障后,系统首先需要判断故障属于哪一种类型。
如果只是某个训练进程崩溃,调度系统可能重新启动对应任务;如果整个节点不可用,则需要重新分配计算资源;如果网络或存储系统发生异常,则必须先恢复通信或存储能力。
在很多分布式训练框架中,只要一个Rank发生严重故障,整个训练Job可能都需要重新建立进程组,而不是简单地让其他GPU继续运行。
重新启动之后,训练程序从最近一次一致的Checkpoint读取状态,并恢复模型、优化器以及其他训练状态。
因此,真正的故障恢复过程通常包括故障检测、资源重新调度、进程组重建、Checkpoint读取、状态恢复以及重新建立通信等多个步骤。
为什么Checkpoint也需要一致性
分布式训练最大的难点之一,是Checkpoint必须代表一个可以恢复的训练状态。
假设部分Rank已经把step 100000的状态写入存储,而另外一些Rank仍然保存的是step 99950的数据,如果此时发生故障,简单地把所有文件放在一起并不能保证得到一个一致的训练状态。
因此分布式Checkpoint通常需要相应的协调机制,使系统知道哪些分片属于同一个有效Checkpoint,并能够判断一次保存操作是否真正完成。
工程上经常会使用临时目录、完成标记、manifest、版本号或其他提交机制,避免恢复程序误读尚未完成的Checkpoint。
这也是为什么“每个节点异步把自己的文件上传到对象存储”并不等于已经实现了可靠的分布式Checkpoint。
如何减少Checkpoint对训练性能的影响
Checkpoint最大的成本通常来自I/O和网络传输。
一个大型模型的完整训练状态可能远大于模型本身,因为优化器状态、混合精度状态以及其他训练信息都会增加存储规模。
因此工程系统通常会采用分片Checkpoint、异步写入、分层存储以及专门的Checkpoint服务等方式降低影响。
一种常见思路是先把Checkpoint写入本地NVMe或高速并行文件系统,再异步复制到更可靠的共享存储或对象存储。这样可以减少训练主路径等待远程存储写入的时间。
不过异步Checkpoint也必须解决一致性问题。训练进程不能简单地在状态仍然发生变化时随意复制内存中的数据,否则保存出来的内容可能并不是一个可以可靠恢复的状态。
增量Checkpoint和状态压缩并非万能方案
为了降低Checkpoint存储量,可以研究增量Checkpoint,只保存与上一次Checkpoint相比发生变化的部分。
也可以使用压缩技术降低存储空间和网络传输量。
但是对于训练状态来说,压缩并不一定总能获得理想收益。GPU训练产生的大量浮点状态并不一定具有很高的压缩率,而压缩和解压本身还会消耗CPU、GPU或I/O资源。
量化更需要谨慎。推理模型的量化与训练Checkpoint压缩并不是同一个概念。直接对训练状态进行低精度量化,可能改变恢复后的数值状态,从而影响训练过程。因此不能简单把“量化Checkpoint”理解成无损的存储优化。
实际工程中更重要的往往是选择合理的Checkpoint格式、分片方式、存储层级以及写入路径。
如何真正减少故障后的重复计算
减少重复计算主要有三个方向。
第一是合理设置Checkpoint间隔。Checkpoint越频繁,理论上的最大重复计算窗口越小,但I/O开销越高。
第二是提高Checkpoint恢复速度。如果保存Checkpoint需要十分钟,而恢复又需要二十分钟,那么即使重复计算量很小,故障恢复的总时间仍然可能很长。因此Checkpoint系统不仅要关注保存速度,也必须关注恢复吞吐量。
第三是提高训练任务本身的容错能力。例如通过可靠的集群调度、GPU健康检查、节点自动替换以及故障预测减少训练中断次数。
需要注意的是,不能简单认为“只恢复故障GPU”就一定能够减少重复计算。在数据并行训练中,如果训练进程组必须整体重新启动,那么其他GPU同样可能需要从一致的Checkpoint重新恢复。
真正能够减少恢复成本的关键,是让Checkpoint状态、并行拓扑和训练框架的恢复机制能够相互配合。
存储系统决定了Checkpoint能否真正发挥作用
Checkpoint最终必须进入可靠存储。
本地SSD速度很快,但节点发生故障时本地数据可能同时丢失,因此通常不能把它作为唯一Checkpoint副本。
对象存储具有较好的持久性和扩展能力,但远程写入延迟和吞吐量需要认真评估。对于大规模训练,也可能采用本地高速存储、并行文件系统和对象存储组成的分层架构。
例如最近的Checkpoint可以暂存在高速存储中,用于快速恢复;更长期的Checkpoint则复制到持久化对象存储中。
与此同时,还应该保留多个Checkpoint版本。如果最新Checkpoint因为存储损坏或写入异常无法恢复,可以回退到更早的有效版本。
Checkpoint不是备份系统的替代品
Checkpoint主要服务于训练任务恢复,而传统备份解决的是更广泛的数据保护问题。
训练数据集、代码、配置文件、Tokenizer、数据处理版本以及依赖环境同样需要进行版本化管理。如果只有模型Checkpoint而训练数据和代码已经发生变化,即使成功恢复模型,也未必能够得到原来的训练结果。
因此真正可恢复的训练环境应该尽量保存模型状态、优化器状态、训练配置、代码版本、数据版本以及运行环境信息。
对于长期训练任务,还应该定期验证Checkpoint是否真的可以恢复,而不是等GPU集群发生故障之后才第一次尝试读取。
AI训练的容错能力最终是一套系统工程
随着GPU集群规模不断扩大,故障已经不能被简单看成偶发事件。GPU、节点、网络、存储和软件都可能成为训练任务的故障点。
Checkpoint解决的是“故障发生以后从哪里继续”的问题,但它不能单独解决整个系统的可靠性。
一个成熟的训练平台需要把GPU健康监控、集群调度、分布式Checkpoint、可靠存储、故障检测、自动重启以及恢复验证结合起来。
最理想的状态不是让GPU集群永远不发生故障,而是即使某个GPU、节点或者训练进程发生故障,系统也能够快速发现问题,从最近一次有效Checkpoint恢复训练,并把重复计算控制在可以接受的范围内。
对于大模型训练来说,Checkpoint最终追求的并不是“保存一个模型文件”,而是建立一条可靠的恢复链路:训练状态能够正确保存,故障能够及时发现,计算资源能够重新调度,训练状态能够一致恢复,并且恢复后的训练能够继续沿着原来的状态向前推进。
AI 训练为什么需要 Checkpoint,GPU 集群发生故障后如何减少重复计算
图片说明:示意图 图片来源:Public Domain(公有领域)
喜欢这篇报道?
使用下面的功能,方便以后继续阅读和分享 MNewsTV
关于文章收藏
收藏不需要注册帐号,收藏信息仅保存在当前浏览器中。
删除收藏请进入「我的收藏」进行管理。
捐助(Paypal): https://www.paypal.me/observeccp 订阅中国观察电报 Telegram : https://t.me/s/ObserveCCP