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,按代价从小到大依次尝试:
- 把
per_device_train_batch_size减半,gradient_accumulation_steps加倍。 - 确认
load_in_4bit=True、use_gradient_checkpointing="unsloth"。 - 调小
max_seq_length(如 2048→1024)。 - 优化器换
adamw_8bit。 - 换更小的模型(8B→3B)或减小 LoRA rank。
- 清缓存:训练前
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 小结与下一步
trainer.train()一行开跑;重点是会读 loss/grad_norm 判断健康度。- OOM 按清单处理:减 batch、开检查点、减序列长度、换 8bit 优化器。
- 用
save_steps+resume_from_checkpoint实现断点续训。 - 训练完成后,下一章做 推理与测试,对比微调前后效果。