Skip to content

[🐞] 使用早停的训练代码在恢复时的行为可能无法被新手用户预期 #312

@Les1ie

Description

@Les1ie

Is there an existing issue / discussion for this? | 是否已有关于该错误的issue或讨论?

  • I have searched the existing issues / discussions | 我已经搜索过已有的issues和讨论

Is there an existing answer for this in tutorial? | 该问题是否在教程中有解答?

  • I have searched tutorial | 我已经搜索过tutorial

Current Behavior | 当前行为

场景:针对配置了 EarlyStopping 的训练代码,执行2次。假设 patience=10、num_epochs=100。

行为

  1. 第一次执行:代码在中间某个epoch触发早停结束训练,如第25个epoch。(符合预期)
  2. 第二次执行-模型加载:由于cfg.md5没变,因此会使用同一个ckpt目录并默认读取该目录下的ckpt恢复训练。(符合预期)
  3. 第二次执行-开始训练:在第25个epoch基础上,再次训练,直至达到 patience 或者 num_epochs 的结束条件。(可能难以被新手用户预期)

Expected Behavior | 期望行为

假设同一套cfg配置,执行过程以及结果应该是确定的、或者可被用户感知和预期的,例如如下一种:

  • 与 num_epochs 保持一致:恢复训练时,检测到之前模型已经由于早停结束,行为应该和恢复一个已经达到 num_epochs 条件的 ckpt 一致

    当前如果不配置早停,多次执行同一个训练脚本(例如复现方法中代码注释掉早停),只有第一次会正常训练、后续会跳过训练只进行测试。

  • 增加进一步的参数控制、或者补充一些文档和运行时的warning说明

Environment | 运行环境

- BasicTS: 1.1.0

BasicTS logs | BasicTS日志

No response

Steps To Reproduce | 复现方法

重复执行如下代码

# train.py
from basicts import BasicTSLauncher
from basicts.configs import BasicTSForecastingConfig
from basicts.models.DLinear import DLinear, DLinearConfig
from basicts.runners.callback import EarlyStopping

def main():

    model_config = DLinearConfig(input_len=12, output_len=12)

    BasicTSLauncher.launch_training(BasicTSForecastingConfig(
        model=DLinear,
        model_config=model_config,
        dataset_name="PEMS03",
        callbacks=[EarlyStopping()],
        input_len=12, 
        output_len=12,
        gpus="0"
    ))


if __name__ == "__main__":
    main()

Anything else? | 备注

感谢开发者~

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingneeds-triagedfor issues raised to be triaged

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions