Skip to content

[🐛BUG] 断点resume将导致性能下降 #2126

@asinsss

Description

@asinsss

描述这个 bug
当保存checkpoint并中断训练后,使用resume函数加载checkpoint并重启训练将会损害最终性能,例如LDiffRec的ndcg@10将由0.045降0.028。
导致这一问题的原因目前已发现两点,首先是缺乏恢复训练的逻辑,重启训练将导致train data从第一批次重新开始,当我们将train data与epoch对齐解决了这一点后,又发现中断重启会导致LDiffRec的encoder部分参数更新出错,继而得到更高的loss并造成最终的性能瓶颈。

如何复现
复现这个 bug 的步骤:

  1. 在某次epoch结束后调用_save_checkpoint函数保存checkpoint。
  2. 在quick_start.py的run_recbole函数中,在trainer.fit调用前添加检测checkpoint并调用resume函数的代码。
  3. 在trainer.py的fit函数的epoch循环中添加如下代码以对齐train data的批次和epoch_idx(可选)
    for epoch_idx in range(self.start_epoch, self.epochs): for i in range(self.start_epoch): # skip train_data epochs for batch in train_data: # skip train_data batchs pass
  4. 重新启动训练,观察log输出的评估结果。

预期
希望可以修复上述问题,并提供完整的resume逻辑,例如指定checkpoint文件以提示是否调用resume函数。
另外我注意到Time and Memory Costs中没有DiffRec等新模型的条目,希望后续可以添加以供参考。

实验环境:

  • 操作系统:Linux
  • RecBole 版本 0.1.2
  • Python 版本 3.8
  • PyTorch 版本 2.0
  • Cuda 版本 11.8

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions