已关闭
[Bug]: PyNative 续训时 global_batch_size 变化导致训练 0 步静默退出且无任何提示 #2590
Java不加糖创建于  9月10日关闭于  9月10日
Java不加糖成员
9月10日 创建

Checklist

🐞 问题详细描述

PyNative 断点续训时,若本次训练的 training.global_batch_size 与 checkpoint 中记录的
不一致,训练会不报任何错、以 0 退出码静默结束,且一步都没有训练。

根因在 mindformers/pynative/trainer/trainer.py:

Trainer._load_checkpoint 在恢复优化器状态时,会按 ckpt_gbs / current_gbs 缩放恢复出的
global_step,以保持已消耗样本数的语义不变:

if common_info.global_batch_size and common_info.global_batch_size != self.global_batch_size:
    global_step = int(
        common_info.global_step
        * (common_info.global_batch_size / self.global_batch_size)
    )
    logger.info(f"Scaled global step: {common_info.global_step} -> {global_step} ...")

但 training.steps 不会跟随缩放。_inner_train_loop 的循环条件是:

logger.info("Start training loop...")
step = self.state.global_step
with Profiler(self.config.profiler) as prof:
    while step < self.state.max_steps:   # max_steps = training.steps

当缩放后的 global_step >= training.steps 时,循环体一次都不执行,直接走到
on_train_end 并正常退出。日志中只有一句 Start training loop...,之后再无任何输出,
也没有任何告警。

复现步骤:

  1. 以 training.global_batch_size: 64、training.steps: 1000 启动 PyNative 训练,
    训练到第 500 步及以后保存权重(checkpoint.no_save_optim: false)。
  2. 将 training.global_batch_size 改为 32,training.steps 保持 1000,
    checkpoint.no_load_optim: false,从上一步的权重续训。
  3. 恢复出的 global_step 被缩放为 500 * (64 / 32) = 1000,达到 max_steps,
    训练 0 步后静默退出。

期望行为:至少给出明确的告警日志,说明本次训练将执行 0 步及其原因;当前没有任何提示,
排查成本很高。

日志中唯一的线索是 info 级别的 Scaled global step,在大规模多卡日志中很容易被淹没:

[INFO] Scaled global step: 500 -> 1000 (batch size changed from 64 to 32)
...
[INFO] Start training loop...
(此后无任何输出,进程正常退出)

详细的环境信息描述

  • 硬件:Ascend 910,64 卡
  • 模型/配置:DeepSeek-V3,PyNative 模式(context.mode: 1),seq_length 4096,
    dp4 / tp4 / pp4 / ep16 / cp1,local_batch_size: 1,优化器 Muon
  • 关键配置项:checkpoint.no_load_optim: false(断点续训),
    training.steps: 1000,首次训练 global_batch_size: 64,续训 global_batch_size: 32
  • 代码分支:master

其他辅助信息

该问题与具体模型、并行配置无关,属于 Trainer 通用续训路径的问题:只要续训时
global_batch_size 变小到使缩放后的 global_step 达到 training.steps,就会触发。

相关代码位置:

  • mindformers/pynative/trainer/trainer.py Trainer._load_checkpoint(global_step 缩放)
  • mindformers/pynative/trainer/trainer.py Trainer._inner_train_loop(while step < max_steps)

版本信息

master 分支,commit 876658938(!8795 fix(pynative): ignore forced FSDP runtime params)。

likedislike
lanshaozuishuai成员
9月10日 评论:

该问题已由上游问题单 https://gitcode.com/mindspore/org-issues/issues/43350 跟踪,本 issue 与其重复,关闭。修复 PR 见 !8802,已改为关联 org-issues #43350。

likedislike
Llanshaozuishuai成员
9月10日 关闭了 issue
MindSpore-Bot
MindSpore-Bot成员
9月10日 评论:

Notice

@ , this issue is linked to an open PR. Please merge the PR before closing this issue.

likedislike
MindSpore-BotMindSpore-Bot成员
9月10日 重新打开了 issue
Llanshaozuishuai成员
9月10日 关闭了 issue
MindSpore-Bot
MindSpore-Bot成员
9月10日 评论:

Notice

@ , this issue is linked to an open PR. Please merge the PR before closing this issue.

likedislike
MindSpore-BotMindSpore-Bot成员
9月10日 重新打开了 issue
JJava不加糖成员
9月10日 关闭了 issue
MindSpore-Bot
MindSpore-Bot成员
9月10日 评论:

Notice

@ , this issue is linked to an open PR. Please merge the PR before closing this issue.

likedislike
MindSpore-BotMindSpore-Bot成员
9月10日 重新打开了 issue
Llanshaozuishuai成员
9月10日 issue状态由 TODO 改变为 CLOSED
Llanshaozuishuai成员
9月10日 关闭了 issue
MindSpore-Bot
MindSpore-Bot成员
9月10日 评论:

Notice

@ , this issue is linked to an open PR. Please merge the PR before closing this issue.

likedislike