跳转至

数据与恢复

数据目录是什么

这个项目把一次运行的所有核心结果都收进同一个 run 目录:

data/runs/<run_id>/

这不是为了目录好看,而是为了让训练、恢复、回放和统计分析共享同一组输入。

为什么一定要集中存放

如果 checkpoint、棋谱和 metrics 分散在不同地方,会有三个直接问题:

  1. 无法确定某个模型权重对应哪批训练数据。
  2. 恢复时很难准确找到最近一次完整状态。
  3. 工具渲染和离线分析容易读错文件。

run 目录里通常会有什么

如果你是第一次看这个目录,可以先把它理解成“一次运行的总档案袋”。和这次运行有关的核心东西,都应该能在里面找到。

checkpoint

它是什么: 训练状态快照,至少包含模型参数以及恢复训练所需的关键状态。

为什么需要: 长期运行不可能假设进程永远不掉。checkpoint 是恢复训练的基础输入。

输入输出是什么:

  • 输入:当前模型参数、优化器状态、scheduler 状态、训练步数、随机种子状态。
  • 输出:可读回的 latest.ptprevious.ptbest.pt

怎样判断结果是否正常:

  • 新 checkpoint 写入后可以重新加载。
  • 三槽轮转关系清楚,不会无限增长。

如果你只想先抓住最重要的一点:checkpoint 不是普通备份,它是“让训练从这里继续”的恢复入口。

棋谱与索引

它是什么: 自博弈对局记录和定位这些记录的索引。

为什么需要: 训练需要原始对局数据,回放和抽查也需要能定位到具体某一盘。

输入输出是什么:

  • 输入:每步行动、分数、提子、终局原因、配置关联信息。
  • 输出:压缩棋谱分片和 games.index.sqlite

怎样判断结果是否正常:

  • 索引能定位回对应分片和行号。
  • 压缩记录可以被读取,而不是只写进去不能用。

这里的“索引”可以先理解成一本目录。它不保存整盘棋的全部内容,而是告诉你“第几盘棋具体存在哪个文件、哪一行”。

metrics

它是什么: 训练和运行过程中的统计指标。

为什么需要: 没有 metrics,后面只能靠猜测判断训练是否健康。

输入输出是什么:

  • 输入:训练 step、loss、worker 数量、硬件策略、吞吐量等运行指标。
  • 输出:可分析的结构化指标文件。

怎样判断结果是否正常:

  • 指标持续写出,而不是只在程序退出时一次性吐出来。
  • 指标字段和配置、checkpoint、运行状态能对上。

如果你只看到一个最终总结,没有过程中的连续指标,后面就很难查出训练是在什么时候开始出问题的。

恢复流程在本项目里意味着什么

恢复不是单纯“把模型文件再读回来”。它应该至少恢复:

  • 模型权重
  • 优化器和调度器状态
  • 当前训练步数
  • 已生成的游戏计数
  • 对应 run 的配置快照引用

如果这些信息缺一大块,恢复后的训练就可能在表面上继续,实际上已经偏离原运行上下文。

读者怎么判断恢复链路正常

可以用下面的判断方式:

  1. 进程中断后能从最近 checkpoint 接着跑。
  2. 恢复后生成的 metrics 和 step 编号是连续的。
  3. 恢复流程不会偷偷换模型路线或改配置语义。

一个很实际的判断方法是:

  • 先让训练跑一段时间,确认已经写出 checkpoint 和 metrics。
  • 人为中断进程。
  • 再次启动后,看 step 是否继续增长,而不是从 0 或很早的数字重新开始。