本页章节
实战三 / 把“结果不同”定位到一次计算
同一个 seed,怎样追到首次差异?
使用自然语言项目的同一初始权重,分别重复同条件计算、转换数值精度和改变数据顺序。保存首次可观察差异,而不是只比较最终分数。
先说清要求复现到哪一层
文件身份
SHA-256 相同说明对应文件字节相同。重新序列化同值权重可能得到不同文件字节;检查权重值与检查文件身份各有用途。
相同环境的数值轨迹
固定初始状态、数据、算法和运行条件,比较相同计算边界。恢复时核对采样位置和优化器状态;相同 seed 无法代替已消费的 RNG 与数据位置。
改变条件后的数值对照
先声明精度、硬件与容差,再检查逐元素误差、目标与梯度。数学等价的实现也可能有舍入差,不把任意浮点差异立即判为逻辑错误。
学习表现的稳定性
固定评估与选择规则,保留全部 seed 和切片;检查波动与实际收益。一次结果接近,不能代替多 seed 能力证据,也不证明跨环境统计结论相同。
PyTorch 官方明确说明,固定 seed 不保证不同版本、平台或 CPU/GPU 之间完全复现。本轮受控探针均在当前同一 CPU 环境执行,没有模拟或宣称另一个操作系统的结果。
输入 → Embedding → 隐藏状态 → loss → 梯度 → 更新
每次使用两个最多 48-token 的窗口,执行 16 次 AdamW 更新。所有对照从相同的 float32 初始权重值开始;float64 条件将这些值精确转换到 double 后运算。表格中的“首次”限于这里实际观测的计算边界,不声称看到了每个底层 kernel 的内部操作。
这次探针能否解释旧记录的变化?
不能直接解释。旧页面快照中 seed 47 的训练和测试完整匹配率约为 93.33% 与 91.37%,本次重跑均为 100%。模型、数据、预算与 seed 的冻结配置一致,但系统及 Python 补丁版本不同;旧完整 checkpoint 和中间轨迹缺失,无法把两次运行逐步对齐。
本页的精度转换和数据顺序变化说明了可执行的排查方式,并没有证明历史差异就是由其中某一项造成。下一次应同时保存初值、首批样本、关键中间张量、逐步梯度与更新以及环境信息,再寻找最早分歧。历史状态保留为“尚未定位”,不补造旧轨迹。
核对本轮首次差异与完整恢复
包内 reproduction/comparison-tensors.pt 保存各对照首步的实际张量、固定数据索引和相同初始权重。自然语言项目还提供独立进程恢复报告。二者分别核验“改条件后在哪里开始不同”和“已保存状态能否接续”。
输出采样还要检查随机数分配。参见随机流与请求身份账本,比较批次重排、请求结束和游标恢复;该计算演示独立于本页训练实测,也不用于解释尚未定位的历史差异。
适用范围与一手资料
单线程 CPU、同一固定环境中的 16 步受控探针,保存首次边界张量与后续误差。精度转换和数据顺序说明当前可观察差异;旧 seed 47 与重跑差异缺少旧轨迹,原因仍未定位。未运行跨系统或 GPU 对照。
公式与机制的原始依据 · 3 项
- PyTorch 2.9 · Reproducibility2026-10-28 核对固定版本正文:控制随机源与确定性算法有适用环境,seed 不保证跨版本或平台逐值一致
- PyTorch · Numerical accuracy浮点精度、非结合性、矩阵运算累加与非有限值
- PyTorch · Saving and Loading Models模型 state 与恢复训练所需 optimizer state