Chapter 06

启动训练与监控

一行 train() 开跑,但会看 loss 曲线、会处理 OOM、会断点续训,才是能把训练跑完的人。

6.1 启动训练

配置好 trainer 后,训练只需一行。返回的 stats 里有耗时等信息:

trainer_stats = trainer.train()

print(trainer_stats.metrics)
# {'train_runtime': 1123.4, 'train_loss': 0.842, ...}

训练过程中会按 logging_steps 打印每步的 loss、学习率、梯度范数等:

# Step | Training Loss
#   1  | 1.9832
#   2  | 1.8410
#  10  | 1.2033
#  50  | 0.8721
# 100  | 0.8155   <- 逐渐下降并趋于平稳

6.2 名词解释:怎么读训练日志

training loss(训练损失)
模型在训练集上的预测误差。整体应下降并趋于平稳;不降说明学习率/数据有问题。
eval loss(验证损失)
在验证集上的误差。若训练 loss 降但 eval loss 升,是过拟合信号。
grad_norm(梯度范数)
梯度大小。突然飙到很大或变 NaN 表示训练不稳定,需降学习率或加梯度裁剪。
OOM(Out Of Memory)
显存耗尽报错 CUDA out of memory。微调最常见的错误,见 6.4 处理清单。
checkpoint(检查点)
训练中途保存的模型状态,用于恢复训练或回滚。由 save_steps 控制频率。
epoch / step
epoch 是遍历一遍数据;step 是一次参数更新。日志一般按 step 打印。
learning rate 曲线
随调度器变化的学习率,warmup 阶段上升、之后按 linear/cosine 下降。
throughput(吞吐)
每秒处理的 token/样本数,反映训练速度。Unsloth 的加速直接体现在这里。

6.3 用 TensorBoard / W&B 看曲线

SFTConfig 里加 report_to 即可把指标推到可视化工具:

# SFTConfig(...) 中:
report_to = "tensorboard",   # 或 "wandb"
logging_dir = "logs",

# 训练后启动 tensorboard 查看
# $ tensorboard --logdir logs

6.4 常见 OOM 处理清单

遇到 CUDA out of memory,按代价从小到大依次尝试:

  1. per_device_train_batch_size 减半,gradient_accumulation_steps 加倍。
  2. 确认 load_in_4bit=Trueuse_gradient_checkpointing="unsloth"
  3. 调小 max_seq_length(如 2048→1024)。
  4. 优化器换 adamw_8bit
  5. 换更小的模型(8B→3B)或减小 LoRA rank。
  6. 清缓存:训练前 torch.cuda.empty_cache(),关掉其他占卡进程。
OOM 常在第一步就发生

如果 loss 打印了几步后才 OOM,往往是遇到了超长样本。检查数据长度分布,或降低 max_seq_length / 开启 packing 让长度更均匀。

6.5 断点续训

设置了 save_steps 后,checkpoint 会存到 output_dir。中断后从最近检查点恢复:

# SFTConfig 中开启定期保存
# save_strategy="steps", save_steps=50, save_total_limit=2

# 从最新 checkpoint 恢复
trainer.train(resume_from_checkpoint=True)

# 或指定具体目录
# trainer.train(resume_from_checkpoint="outputs/checkpoint-100")

6.6 训练时的显存实时监控

# 训练前后各测一次,算出训练本身占了多少显存
start = torch.cuda.max_memory_reserved() / 1024**3
trainer.train()
peak = torch.cuda.max_memory_reserved() / 1024**3
print(f"训练峰值显存: {peak:.2f} GB (训练增量 {peak-start:.2f} GB)")

# 命令行实时看:watch -n 1 nvidia-smi
怎么判断训练"好了"

训练 loss 平稳在较低值、eval loss 不再下降即可停。SFT 通常 loss 落到 0.5-1.0 区间就有不错效果,具体看任务与数据。

6.7 小结与下一步