演示集跑通后,才进入全量。全量意味着:时间以「天」计、必须可中断、必须可续训、必须能看懂进度。这一篇讲长时训练的运维细节。

这是「多模态微调实战」的第 06 篇。从「几十分钟」跨到「数天」,运维方式要随之升级。

一、规模与时间预期

项目 量级
训练样本 约 37 万
验证样本 约 4 万
epoch 3(可调)
单卡 16GB 常见要数天;具体取决于分辨率、I/O、实现细节
显存 约 9~11GB 量级(冻结 ViT + LoRA)

不要相信「一定 30 小时」这种绝对数字;以你机器上稳定后的 s/it 估算:

1
剩余小时 ≈ 剩余 step × 每 step 秒数 / 3600

二、启动方式:前台 vs 后台

前台

适合调试:

1
bash script/train_lora_full.sh

关掉终端,训练一般也会停。

后台(推荐)

1
bash script/train_lora_full_bg.sh

典型实现要点:

  • nohup ... & 写入日志;
  • 记录 PID;
  • 提供 status / stop 子命令。

查看:

1
2
bash script/train_status.sh
tail -f output/train/train_full.log

停止:

1
bash script/train_lora_full_bg.sh stop

注意:若训练在 docker run 里,只杀宿主机 bash 可能不够,需要同时停掉对应容器,否则 GPU 仍被占着。

三、超参:与演示集尽量一致

全量阶段建议先复用演示集已验证的超参,只替换数据路径与输出目录,例如:

  • --dataset .../train_full.jsonl
  • --val_dataset .../val_full.jsonl
  • --output_dir .../ocr_plate_lora_full
  • --eval_steps 500 --save_steps 500(全量可加大间隔,减少 I/O)

保持一致的好处:出问题时容易判断是「数据」还是「超参」导致。

四、断点续训

ms-swift / Transformers 风格续训:

1
2
3
swift sft \
...(其余参数保持不变)... \
--resume_from_checkpoint /workspace/output/.../checkpoint-25500

含义:

  • 恢复模型(LoRA)权重;
  • 恢复优化器 / 随机状态(完整 resume);
  • 从对应 global step 继续,而不是从头数 epoch。

脚本层可以做成:默认自动找最新 checkpoint-*FRESH_START=1 强制从头。

重要: 中途手动停掉时,如果还没到下一个 save_steps,内存里多跑的那几百 step 不会落盘。以磁盘上的 checkpoint 为准。

五、监控看什么

5.1 过程指标

logging.jsonl 里常见字段:

  • losstoken_acclearning_rate
  • global_step/max_steps
  • epoch
  • train_speed(s/it)
  • remaining_time(框架估算,早期可能偏乐观/悲观)

5.2 系统层

1
2
nvidia-smi
docker ps

确认:没有其他大模型服务占显存;利用率不是长期 0(除非在做超大数据预处理)。

5.3 验证指标

周期性 eval_loss / eval_token_acc。经验上可能出现:

  • 验证 loss 最优不在最后一个 step
  • 后半段 loss 略回升,但 token_acc 仍缓升或持平。

因此「业务用哪个 checkpoint」不要只看最终 step,见下一节与合并篇。

六、如何选 checkpoint

假设训练结束后还留着 checkpoint-93000(验证 loss 最优)与 checkpoint-140001(最终 step)。对比示例(脱敏后的量级):

Checkpoint eval_loss eval_token_acc
约 93k(最优 loss) 更低 已经很高
最终 step 略高一点 可能略高或持平

建议:

  1. 先看框架记录的 best_model_checkpoint
  2. 再用你的 Exact Match 脚本对候选 checkpoint 各评一次;
  3. 业务上两者差距很小时,选更稳或更方便部署的那个。

七、训练完成后发生什么

日志走到 global_step == max_steps 后,往往还会:

  1. 再跑一轮(或两轮)全量验证——数万条可能要十几~几十分钟;
  2. 保存 checkpoint-<final>
  3. 打印 train_runtime / train_loss
  4. 容器退出,显存释放。

所以「step 到 100%」不等于「进程已退出」,别太早杀进程。

八、小结

全量训练完成标志:

  • 最终 checkpoint 已写出;
  • 日志出现完成标记 / train_runtime
  • GPU 空闲;
  • 你已选定(或待评测选定)业务 checkpoint。

多模态微调实战第 06 篇完。下一篇:把 LoRA 合并回基座,得到一份独立完整的模型。