① 训练可能中断
断电、机器故障、抢占式实例被回收、代码 bug 崩溃……真实训练环境充满不确定性。定期保存检查点,可以让训练从中断点恢复,而不是从头再来。
上一页我们训练了一个能生成文字的 Mini-GPT。但有个问题:一旦关掉浏览器,一切归零。真实的大模型训练要跑几周,中途断电、重启、调参都是家常便饭。所以必须有一套机制,把训练到一半的模型“拍个快照”存下来,下次能原样恢复、继续训练。这一页会把保存、加载、继续训练这条流水线彻底讲透。
训练一个模型可能花费数小时、数天甚至数周。如果训练完不能保存,那所有计算都白费了。保存和加载是训练系统里最基础、也最容易被忽视的一环。
断电、机器故障、抢占式实例被回收、代码 bug 崩溃……真实训练环境充满不确定性。定期保存检查点,可以让训练从中断点恢复,而不是从头再来。
先预训练,再微调,再对齐,再蒸馏。每个阶段都从上一阶段的权重出发。没有保存加载机制,这些流程根本无法串联。
训练好的模型要部署到服务器、边缘设备、浏览器。训练和推理是分开的,必须有一个标准格式把权重从训练环境传到推理环境。
下面是一个真实可训练的小模型(约 900 个参数)。你可以先训练几步,然后保存一个检查点,再重置模型,最后加载检查点继续训练。全程观察 loss 的变化,理解“继续训练”和“从头训练”的区别。
每次点击“训练”会执行 50 步梯度下降。观察 loss 下降、参数更新的过程。
给当前模型状态起个名字,然后保存到浏览器存储。检查点会包含:模型参数、优化器状态、训练步数、loss 历史。
所有已保存的检查点都在这里。点击“加载”可以把模型恢复到那个时刻,点击“删除”可以移除。
保存时,模型会被转换成 JSON 字符串。这是它长什么样子的预览:
很多人以为保存模型就是保存权重。其实,要完整恢复训练现场,检查点至少要包含四类信息。
这是最核心的部分:每一层权重矩阵、偏置、LayerNorm 的 γ 和 β。对于 LLM,这是几十亿到几千亿个浮点数。保存时必须保证精度一致(FP32 / FP16 / BF16)。
AdamW 的每个参数都有一阶矩 m 和二阶矩 v。如果不保存这些,加载后 Adam 会从零开始累积,导致前几百步更新方向错误,loss 出现 spike。这是“继续训练”和“从头训练”的关键区别。
当前是第几步、学习率是多少、loss 曲线、验证集指标。这些信息决定了加载后从哪个学习率继续、是否需要调整调度器。没有它,你只能盲猜。
模型结构(多少层、多少头、维度多少)、词表映射(字符 → id)、特殊 token 定义。没有这些,加载后的权重就是一堆无意义的数字。
本页面用 localStorage 演示,因为它最简单、同步、浏览器原生支持。真实训练中会根据规模选择不同的存储方案。
| 方案 | 容量 | 速度 | 持久性 | 典型场景 |
|---|---|---|---|---|
| localStorage | 5~10 MB | 快 | 浏览器内持久 | 教学演示、小模型 |
| IndexedDB | 几百 MB ~ GB | 中 | 浏览器内持久 | 浏览器端训练、PWA |
| 文件系统 / 对象存储 | 无限 | 取决于网络 | 持久、可备份 | 真实训练(S3、HDFS) |
| 分布式存储(分片) | TB ~ PB | 高吞吐 | 持久、容错 | 大模型训练(ZeRO) |
下面用六张卡片,把保存、加载、继续训练相关的每一个概念完整讲清楚。
检查点(Checkpoint)是训练过程中保存的模型状态快照,包含模型参数、优化器状态、训练元数据和配置信息。保存检查点称为 checkpointing,加载检查点恢复训练称为 resume from checkpoint。
序列化(Serialization)是把内存中的模型对象转换为可存储/传输的格式(JSON、二进制、Protobuf 等)的过程。反序列化则相反。PyTorch 常用 state_dict() 和 torch.save(),TensorFlow 用 tf.train.Checkpoint,HuggingFace 用 save_pretrained()。
检查点分为全量检查点(包含所有状态)和推理检查点(只含模型参数,不含优化器状态)。
想象你在玩一个很长的 RPG 游戏。你不能一口气通关,所以每次打到某个进度,就存一个档。下次打开游戏,从存档点继续,而不是重新开始。
训练模型也是一样。模型从随机参数出发,每走一步就更新一次参数。如果中途关掉,所有进度都会丢失。检查点就是这个“游戏存档”——它记录了模型当前学到哪儿了、优化器当前的“惯性”是多少、已经走了多少步。
为什么优化器状态也要存? 因为 Adam 不是无记忆的。它记住了每个参数过去梯度的均值和方差。如果只存模型参数,加载后 Adam 相当于失忆了,前几百步会“瞎走”。所以真正的检查点必须包含优化器状态。
它解决了“如何让长时间训练可中断、可恢复、可复用”这个问题。
保存和加载是训练系统的基础设施。没有它,大规模训练根本不可能进行。
它影响:
在 LLM 训练中,检查点保存是 I/O 密集型的核心环节。保存策略(频率、分片、异步)直接影响训练吞吐。好的检查点系统能让训练在故障时只损失几分钟,而不是几天。
优化器状态(Adam 的 m 和 v)、训练步数、学习率调度器状态都必须一起保存,否则继续训练时 loss 会跳。
JSON 通用但臃肿,二进制紧凑但需要框架支持。PyTorch 的 .pt、HuggingFace 的 safetensors、GGUF 各有适用场景。
保存太频繁拖慢训练,太少又容易丢进度。大模型训练通常用异步保存 + 分片并行,平衡安全与速度。