推理所需
- config + architecture code
- tokenizer / chat template / special tokens
- safetensors shards + index
- generation config / stopping
- precision / quantization metadata
保存完整状态以后,用 复现差异定位实验逐边界比较初值、输入、隐藏状态与更新。
ENGINEERING EXTENSION / ARTIFACTS
权重只是其中一部分。config 与模型实现共同定义结构和计算规则,tokenizer 决定输入的 ID,safetensors 分片承载参数, generation config 决定推理行为,训练 checkpoint 还要保存优化器、scheduler、RNG 与数据游标。
点击文件,查看它在训练、推理与恢复中的责任。不同框架文件名会变,但依赖关系基本不变。
MODEL CONFIG
config 与模型实现共同定义结构和计算规则。宽度、词表等不匹配可能在加载时暴露;RoPE 频率、Norm epsilon、注意力窗口等即使不改变权重形状,也可能改变输出。
必须
结构侧必须;还需数据/优化器状态
权重可加载也不证明配置兼容;核对配置与实现版本,再用固定输入比对 logits。
{
"hidden_size": 4096,
"num_hidden_layers": 32,
"num_attention_heads": 32,
"num_key_value_heads": 8
}
这些字段能解释参数量、显存与推理行为。可据此核对配置与权重是否匹配。
hidden_size残差宽度 d注意力/MLP 接口宽度,影响矩阵与激活形状。
num_hidden_layersblock 堆叠次数 L参数量、激活与 KV 层数都按 L 增长。
num_attention_headsquery heads决定并行 head 数和 Q/O 投影宽度。
num_key_value_headsKV heads决定 K/V 投影和推理 KV Cache 大小。
intermediate_sizeFFN 宽度dense 或每 expert MLP 的中间维度。
vocab_size词表大小embedding 行数、LM head 宽度和 softmax 成本。
rope_thetaRoPE 频率尺度影响位置旋转的频率尺度及长上下文行为。
tie_word_embeddings输入/输出共享省参数,但输入查表与输出预测统计互相耦合。
文本推理需要结构、权重及匹配的 tokenizer/模板;恢复原训练轨迹还依赖优化器、调度器、随机数和数据位置。
恢复要和未中断基线比较:从同一 checkpoint、数据位置与随机状态各走相同步数,比较 loss、grad norm、LR 与参数差异。改变硬件、并行切分或非确定性 kernel 后,不一定逐位一致,需声明数值容差。优先在 optimizer step 边界保存;在累积中途保存还必须包含已累积梯度及进度。
运行八步小型 Transformer 训练,在指定更新边界保存状态。完整恢复与遗漏状态各自从保存点继续;对照连续运行的相同步数,观察第一次偏差。
模型复用整层反传页的两位置、hidden=2、FFN=3、三类词表 block,训练全部权重和两个 RMSNorm 的缩放参数。四个固定样本按顺序循环,每次输入加入 [−0.05,0.05) 的小扰动;随机源使用明确的整数状态。
优化器为 AdamW:β₁=0.9、β₂=0.99、ε=10⁻⁸、衰减 0.01;η=0.015/(1+0.15u),u 是此前完成的更新数。只有末位置监督,输入本身不作为可训练参数。所有读数来自实际前向、解析反传与更新。
| 样本 | 两位置输入(扰动前) | 末位置目标 ID |
|---|
初始随机状态 s=20261027。每次更新状态为 s′=(1664525×s+1013904223) mod 2³²,得到均匀数 u=s′/2³²,再用 0.05×(2u−1) 扰动一个输入元素。按矩阵行顺序消费四个随机数,保存时记录最后的整数状态;样本顺序为 A→B→C→D→A。
保存发生在 optimizer step 完成后,没有待累积梯度。RNG 使用 32 位线性同余状态,每条样本消费四个随机数;不复现 PyTorch RNG。
| 总步数 | 样本:基线 / 恢复 | LR:基线 / 恢复 | Loss:基线 / 恢复 | 梯度范数:基线 / 恢复 | 更新后参数差 |
|---|
| 状态 | 保存值 | 恢复值 |
|---|
权重经 JSON 序列化再恢复;Adam m/v 与步数同时保存。相同运行环境下完整恢复逐值一致。遗漏数据游标若刚好落在循环边界,本例可能仍一致;这只反映四样本顺序循环的条件。
清空 Adam 状态时,第一次恢复前向仍可能得到相同 loss 和梯度。动量与偏置校正不同会改变随后的参数更新,偏差从更新后开始显现。
相同种子能重建随机序列,恢复训练还需要回到该序列的正确位置。本例保存 RNG 整数状态;真实数据 worker、设备和随机算子可能拥有不同随机源。
本例无 shuffle,仅记录已读样本数。实际训练还可能需要 epoch、采样器置换、worker 进度、数据版本和累积窗口位置,才能解释后续读取的样本。
表格先记录输入、学习率、loss 与梯度范数,再执行更新,最后比较参数。恢复瞬间的参数相同只是起点,应继续比较后续轨迹。
项目提供零额外依赖的 Node CPU 实验。它运行连续基线,写出 checkpoint,再为每种恢复方式启动一个新进程,与页面使用的计算逐项核对。
npm run lab:cpu
# 可指定一份新的输出目录
npm run lab:cpu -- --out-dir /tmp/embedding-cpu-lab
输出包含 checkpoint.json、uninterrupted.json、六种 resume-*.json 和 report.json,记录输入、随机状态、loss、梯度范数、参数、运行环境与首次偏差。默认每次创建新的时间戳目录。完整恢复断言失败会以非零状态退出。
这个实验使用本站的 JavaScript 小模型和解析梯度,主要验证计算与状态恢复。它不下载预训练模型,也不代表 PyTorch、CUDA AMP 或真实分布式训练的性能与泛化结果。缓存对照另用位置页的四维 Attention 配置。
带完整序列任务的工件对照见小模型学习与恢复实验;同 checkpoint、输入与 RNG 的定向回放见真实故障实验。
数据顺序、tokenizer、并行和精度设置都会影响复现,需要与代码版本一同保存。
内容哈希、采样顺序与已消费位置。
vocab、normalization、special tokens、EOS。
结构、初始化来源、代码 commit。
学习率、accumulation、并行、kernel。
测试版本、切片、judge 与指标。
合并/转换、归一化、服务与回滚点。
恢复实验实际训练两位置小型 Transformer,四条固定样本、输入扰动、明确 AdamW 和 LR;JSON 保存参数、优化器、RNG 与游标。Node CPU 实验另启进程恢复。该例不验证 PyTorch、GPU 或跨硬件逐位复现。