AI Engineer · VO Coding

Microsoft 可恢复 DataLoader:样本顺序、游标和预取确认

把可恢复训练输入定义成数据版本、epoch 排序、已确认 batch 游标和随机状态的检查点,说明多 worker 预取边界。

题目重点:把可恢复训练输入定义成数据版本、epoch 排序、已确认 batch 游标和随机状态的检查点,说明多 worker 预取边界。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练数据集以稳定 datasetVersion 和样本 ID 固定;每个 epoch 的样本顺序由 seed、epoch 和分片配置确定,可重建。
  • checkpoint 只推进到训练步骤已经成功提交的 batch;prefetch 完成不代表训练已消费。
  • 恢复时至多重复最后未确认 batch,但不能静默跳过已确认之后的样本;如果要求严格一次梯度更新,需将模型/优化器 checkpoint 与数据游标原子绑定。

解题路线

  1. 定义迭代器状态为 datasetVersion、epoch、sampler seed、world size/rank、已确认的 nextBatchIndex,必要时保存动态 shuffle RNG 状态与 worker 分片游标。
  2. 在一个 epoch 内使用确定性 sampler 产生样本 ID 序列,按 rank 和 worker 切分且分片互斥;若 world size 改变,原样本分配可能变,需重新分片策略或从稳定全局样本序号恢复。
  3. DataLoader 可预取 batch,但消费方只在 optimizer step 和模型状态成功持久化后确认游标;崩溃时从最近一致 checkpoint 恢复模型、优化器、随机数状态与 nextBatchIndex。
  4. 持久化 checkpoint 用临时文件+原子发布/manifest,校验数据版本和配置 hash;恢复前拒绝错误版本或不兼容 batch size,避免看似续跑实则跳样本。
  5. 测试在读取前、预取后、交付后、梯度更新前和 checkpoint 提交后注入故障,检查已确认样本不丢、重复范围受控、训练结果在确定性条件下复现。

手动走一遍

worker 已预取 batch 10、11,但训练只完成 batch 9 并把模型和 nextBatchIndex=10 一起提交;此时崩溃,恢复后应重新交付 10,而不是从 12 开始。若模型已更新到 10、游标仍是 10,重跑会重复梯度,所以两份状态必须一致发布。

规模与取舍

N 个样本、B batch size:索引顺序 O(N) 存储或通过确定性置换/分片按需生成;checkpoint 元数据可 O(worker 数),如果直接存完整 shuffle permutation 则 O(N)。恢复成本受定位到游标和读取数据版本影响。

易错点与追问

容易失分的边界

  • 把预取游标当已训练游标,故障时跳过 batch。
  • 只存数据游标,不存模型/优化器及随机数状态,却承诺精确续训。
  • 数据集更新或 world size 改变后沿用旧位置而不核验。
  • 多 worker 使用相同随机 seed 和分片,造成重复样本。
  • 题目接口不可读却编造 PyTorch 特定方法签名。

继续深挖

  • 弹性训练 worker 数变化后怎样保证样本覆盖?
  • 流式不可回放数据源如何做 at-least-once 与去重?
  • batch 由随机增强产生时需要保存哪些 RNG 状态?
  • 如何验证恢复前后模型更新序列一致?
✓已复制微信号!