9、训练结果与备份
9.1 训练输出文件
训练结束后,在 JupyterLab 左侧依次打开 saves → Qwen3-0.6B-Thinking → lora → keywords-clean,也可以在 AutoDL 终端执行:
ls -lh /root/autodl-tmp/LLaMA-Factory/saves/Qwen3-0.6B-Thinking/lora/keywords-clean按下面的用途检查并保留输出文件:
| 文件 | 查看或保留的用途 |
|---|---|
adapter_model.safetensors、adapter_config.json | 本轮 LoRA 权重与加载配置,一起保留 |
checkpoint-50/、checkpoint-100/、checkpoint-150/ | 不同更新步保存的训练存档 |
trainer_state.json | 查看训练进度、最佳检查点和对应验证损失 |
training_args.bin、启动 YAML | 保留训练设置;WebUI 会生成 training_args.yaml,CLI 上传的 YAML 需另外备份 |
llamaboard_config.yaml(WebUI 路线) | 页面设置记录,与训练参数文件区分开 |
trainer_log.jsonl、Loss 图、运行日志 | 复查训练和验证过程 |
train_results.json、eval_results.json | 汇总统计,不是逐条关键词预测答案 |
示例 Adapter 约 20 MB,保存的是 LoRA 增量权重;第 32 章会把它与对应的 Qwen3-0.6B 一起加载。
配套 results/keywords-clean/training/ 提供日志、曲线和统计,对应训练配置为 configs/keywords_clean_train.yaml,方便不启用 GPU 时学习。这是参考资料目录,不含 Adapter 权重及完整检查点,不能直接填入 WebUI 的检查点路径。
WebUI 路线保留结果目录中的子进程日志及自动保存的训练参数;CLI 路线还需保留第 8.3 节指定的 YAML 与重定向日志。
9.2 最佳检查点核对
在 AutoDL 的项目根目录读取 trainer_state.json,核对完成步数与选中的检查点:
python - <<'PY'
import json
from pathlib import Path
result_dir = Path("saves/Qwen3-0.6B-Thinking/lora/keywords-clean")
state = json.loads((result_dir / "trainer_state.json").read_text(encoding="utf-8"))
print("完成步数:", state["global_step"])
print("最佳检查点:", state["best_model_checkpoint"])
print("对应验证损失:", state["best_metric"])
PY示例完成 150 步,最佳检查点为 checkpoint-150,对应验证损失约 1.5880。自己训练时按第 7.2 节的规则读取结果;最低损失也可能出现在较早的检查点。
加载 Adapter 检查回答需要相应权重和配置;完整续训还需要优化器、调度器和随机状态等,备份时应保留整个检查点目录。
备份时区分两种用途: 推理需要 Adapter 与加载配置;恢复训练还需要优化器、调度器等状态。按下面的方法检查自己的文件,不把只有权重的备份当作完整续训存档。
先确认中断的是访问,还是训练。 浏览器断开、SSH 隧道退出,只说明访问出了问题。重新连接 AutoDL 后,先在终端检查进程和原来的训练日志:
ps -eo pid,etime,args | grep -E 'llamafactory|keywords'进程列表可能同时出现 WebUI、训练子进程和搜索命令本身,要结合完整命令判断。按第 8.3~8.4 节查看自己那次运行的日志;如果训练仍在进行,就恢复访问并继续观察,不再启动第二份训练。进程退出且日志没有正常完成记录时,才考虑恢复。
再找最后一份完整写入的检查点。 例如,假设原计划训练 150 步,在第 120 步附近中断,最后完整保存的是 checkpoint-100,就只能从第 100 步的状态接续,尚未保存的更新需要重做。不能根据日志中的最大步数,虚构一份 checkpoint-120。
在自己那次训练的输出目录下检查文件。下面以本课单卡、普通 LoRA、AdamW 和 FP16 路线为例;将路径换成自己实际存在的检查点。这个命令只查看文件和 JSON,不加载模型:
python - <<'PY'
import json
from pathlib import Path
checkpoint = Path("saves/Qwen3-0.6B-Thinking/lora/keywords-clean/checkpoint-100")
required = [
"adapter_config.json", "adapter_model.safetensors", "trainer_state.json",
"optimizer.pt", "scheduler.pt", "rng_state.pth", "scaler.pt",
]
missing = [name for name in required if not (checkpoint / name).is_file()]
if missing:
raise SystemExit(f"缺少本路线的恢复文件,请核对原配置与备份:{missing}")
state = json.loads((checkpoint / "trainer_state.json").read_text(encoding="utf-8"))
print("检查点路径:", checkpoint.resolve())
print("已保存的更新步:", state["global_step"])
print("文件存在性检查通过;仍需在恢复时确认状态能够加载。")
PYoptimizer.pt 和 scheduler.pt 保存更新规则与学习率进度,rng_state.pth 保存随机状态,scaler.pt 保存本路线 FP16 梯度缩放的状态。其他精度或分布式路线的文件可能不同,不能直接套用这份清单。只找到 Adapter 文件时,可以另做推理或后续训练,但不能认定已拥有原训练的完整恢复状态。若当次使用了 save_only_model: true,之后再改成 false 也不能补回当时没有保存的状态。
最后准备恢复配置。 在 JupyterLab 中复制第 8.3 节自己当次实际使用的完整 YAML,在 LLaMA-Factory/configs/ 下另存为 train_keywords_resume.yaml。保持基础模型、数据及顺序、模板、LoRA 结构、批次、学习率、精度、种子和训练总轮次一致,只在副本中新增或替换下面两个字段;这是片段,不能单独作为训练配置:
output_dir: saves/Qwen3-0.6B-Thinking/lora/keywords-clean-resume
resume_from_checkpoint: saves/Qwen3-0.6B-Thinking/lora/keywords-clean/checkpoint-100恢复输出目录选一个尚未使用的新目录,保留原目录供核对。原来的 num_train_epochs: 3 表示总共训练三轮,恢复时仍保持三轮;不要误填成“剩下还要练几轮”。本例从 100 步接续到原定 150 步。也不要额外把检查点填成 adapter_name_or_path:本节演示的是通过 resume_from_checkpoint 恢复原 SFT 状态。
确认原进程已退出、恢复文件完整、配置与环境相符后,先按第 8.3 节进入 AutoDL 项目根目录并激活原 .venv,再执行。下面沿用原下载来源与线程设置,并将恢复日志另存:
(
set -e
if [ -e saves/Qwen3-0.6B-Thinking/lora/keywords-clean-resume ] ||
[ -e logs/keywords-clean-resume.log ]; then
printf '恢复输出目录或日志已存在,请先核对;本次不启动训练。\n'
exit 1
fi
OMP_NUM_THREADS=4 USE_MODELSCOPE_HUB=1 \
llamafactory-cli train configs/train_keywords_resume.yaml \
> logs/keywords-clean-resume.log 2>&1
)这个终端会等待训练,在另一个 AutoDL 终端用 tail -n 80 /root/autodl-tmp/LLaMA-Factory/logs/keywords-clean-resume.log 查看恢复日志。核对加载的检查点路径、恢复步数和后续进度,确认从已保存位置接续;出现状态加载失败或数据、配置不匹配时先停止排查,不把“程序能启动”当作恢复成功。更换数据、模型或训练方案,应另建实验,不冒充接续同一次训练。
参数传递方式见课程固定版本的 SFT 源码;仅保存模型与完整续训的区别见官方说明。
9.3 打包与下载
训练结果保存在 AutoDL 上,接下来打包并下载到自己的电脑。
先确认训练已经结束,再打包。 下列命令以本章路径为例,mktemp -d 会创建一个新的备份目录,不覆盖已有备份。
沿用本章主线、采用 第 8.2 节的 WebUI 方式时,在 AutoDL 终端执行。训练参数与 WebUI 子进程日志已在结果目录内:
cd /root/autodl-tmp/LLaMA-Factory
keyword_backup_dir=$(mktemp -d /root/autodl-tmp/keywords-backup-XXXXXX)
tar -czf "$keyword_backup_dir/keywords-clean-training-backup.tar.gz" \
saves/Qwen3-0.6B-Thinking/lora/keywords-clean \
data/keywords-cleanCLI 路线的启动 YAML 和运行日志在结果目录之外,需要一并打包。下面与上面的命令二选一:
cd /root/autodl-tmp/LLaMA-Factory
keyword_backup_dir=$(mktemp -d /root/autodl-tmp/keywords-backup-XXXXXX)
tar -czf "$keyword_backup_dir/keywords-clean-training-backup.tar.gz" \
saves/Qwen3-0.6B-Thinking/lora/keywords-clean \
data/keywords-clean \
configs/keywords_clean_train.yaml \
logs/keywords-clean-train.log这里打包的是本轮训练输出和数据记录,不包含基础模型大权重,也不打包整个 .venv。基础模型仍需单独保留或按记录重新准备。
等打包命令无报错结束,在同一个 AutoDL 终端继续检查压缩包、生成校验文件,并打印备份目录:
cd "$keyword_backup_dir"
gzip -t keywords-clean-training-backup.tar.gz &&
sha256sum keywords-clean-training-backup.tar.gz > keywords-clean-training-backup.tar.gz.sha256
pwd
ls -lhgzip -t 成功时通常不输出文字;如果报错,先停止下载步骤,检查是否有磁盘不足或文件缺失。pwd 打印的是刚创建的备份目录。
在 JupyterLab 文件面板打开这个目录,分别右键压缩包和 .sha256 文件,选择“Download / 下载”。把两个文件保存到本机同一个文件夹。分享操作截图或日志前,先去掉其中的实例连接信息和密码。
9.4 本机备份检查
以 Mac 为例,新建一个专门放本轮备份的本地文件夹,将刚下载的两个文件放进去。在这个文件夹打开终端;也可以先输入 cd ,再把文件夹拖入终端补全路径,按回车。
确认当前目录里有下载的文件后执行:
shasum -a 256 -c keywords-clean-training-backup.tar.gz.sha256
gzip -t keywords-clean-training-backup.tar.gz
tar -tzf keywords-clean-training-backup.tar.gz第一条应显示压缩包名称和 OK,说明它与服务器上的文件一致;第二条检查压缩包是否完整;第三条列出包内文件,应能找到 Adapter、各检查点、三份 JSONL 和登记文件,CLI 路线还应有上传的 YAML 与运行日志。如果校验不是 OK,先重新检查下载文件,不把这个包作为可用备份。
文件校验通过,说明下载内容与服务器文件一致;模型能否从备份正常加载,还需实际检查。保存训练结果时,把模型名称、环境与训练配置一并保留,下一章再加载 Adapter 验证。
9.5 用一张记录卡串起本轮实验
为便于核对 Adapter 使用的数据、模板和训练配置,在本机存放本轮备份的文件夹中,新建 实验记录.md,汇总这些信息及已有文件的位置。
| 记录什么 | 从哪里填写 |
|---|---|
| 本轮名称与目的 | 用一句话说明要检查什么,例如“用清洗版数据完成首次关键词 LoRA 训练” |
| 模型与输入 | 基础模型 ID、下载版本或权重校验记录、分词器、聊天模板与思考设置 |
| 数据版本 | 三份数据的路径、条数和 manifest.json;另记所采用的标注规则版本 |
| 环境与训练配置 | LLaMA-Factory 版本、环境检查结果、本轮实际配置和日志的位置,包括随机种子 |
| 保存的结果 | 选定的检查点、选择依据、备份包名称及校验文件 |
| 实际回答与结论 | 第 32 章完成后补入提示词、生成设置、原始预测、评分报告及尚未解决的问题 |
训练结束时先填前五项。配置路径必须对应本轮实际运行的文件,不能只指向后来反复改过的通用 YAML。
交给第 32 章的是本轮 Adapter 和这张记录卡。 如果实验名改过,下一章的检查点选择、预测和导出配置也指向它;预测与评分再保存到本轮的新目录。这样能从一份答卷追回所用数据、模型和设置。下一章即使分数不好,也把原始输出和限制一起记下,作为下一轮比较的依据。
章节思考题:
从第 29 章的数据开始,到本章取得 Adapter,应按什么顺序操作?哪些工作在本机,哪些在 AutoDL 上完成?
参考思路: 先准备远端环境并验证 GPU 计算,启动 WebUI、建立本机 SSH 隧道,再上传登记数据、预览样本、配置模型和训练参数,最后启动训练并备份结果。模型加载与训练在 AutoDL 上执行,本机用于浏览器访问和保存备份。nvidia-smi 能识别显卡后,还应在当前 Python 环境完成本课的计算检查。
配置中的 model_name_or_path、stage=sft、finetuning_type=lora 和 template 分别决定什么?把页面设置交给训练前怎样核对?
参考思路: 它们依次指定模型、训练阶段、参数更新方式和对话模板。本课选择 Qwen/Qwen3-0.6B、SFT、LoRA 与匹配的模板,不能把模型名和模板名混为一项。预览实际命令或 YAML,核对这些字段以及输出目录、批次、学习率、精度等设置;启动后再从日志确认实际加载和使用的内容。
dataset_info.json 中的登记名、文件路径和字段映射各有什么用?已有独立验证文件时,怎样选择数据并设置验证比例?
参考思路: 登记名供训练配置引用,文件路径指向具体数据,字段映射说明消息和角色怎样读取。预览确认训练集 1,600 条、验证集 200 条及内容正确后,训练页只保留 keywords_train,单独指定 eval_dataset 为 keywords_validation,val_size 为 0,表示不再额外切分。测试集不参与训练和检查点选择。
核对配置后,怎样启动并判断一轮训练是否完成?命令预览成功、进度显示 150/150 和文件保存成功,分别说明什么?
参考思路: 同一轮选择 WebUI 或 YAML 一种方式启动。预览成功只说明已生成配置;150/150 表示所显示的训练进度到达计划步数。还要确认日志正常结束,trainer_state.json 的进度与实际配置相符,Adapter 和相关文件已成功保存。当前数据与配置预计 150 步,其他配置应重新计算。
假设第 100 步的验证 Loss 最低,第 150 步正常结束,应怎样判断后续加载哪个检查点?
参考思路: 查看 trainer_state.json 的 best_metric 与 best_model_checkpoint,再核对保存和加载最佳模型的设置。按验证 Loss 选择时,应关注记录的最佳检查点,不能默认最后一步就是最佳版本;接着用相同验证输入比较实际回答。较低 Loss 只是选择依据之一,关键词质量在第 32 章继续检查。
本机突然打不开 127.0.0.1:7860,应该按什么顺序排查?若本轮用 YAML 启动,训练日志在哪里?
参考思路: 分别检查本机 SSH 隧道、远端 WebUI 和训练进程,并观察对应日志是否继续更新,确认中断的是哪一环。本章 YAML 启动方式把日志写入远端项目的 logs/keywords-clean-train.log;webui_subprocess.log 属于 WebUI 路线。训练仍在运行时不要重复启动,先恢复访问连接。
要让同事加载本次 Adapter 并复查结果,应该交接哪些材料?如果还要从中断处继续训练,要求有什么不同?
参考思路: 保存 Adapter 权重与配置、匹配的基础模型及版本、Tokenizer 和模板信息、实际训练配置、数据记录与日志,并核验下载的备份。复现回答还需输入和生成设置;完整续训另需检查点里的优化器、调度器、随机数等状态。对照第 9.5 节记录卡说明每份材料的位置与用途。
计划共 150 步,第 120 步时连接断开,最近完整检查点在第 100 步。确认训练进程已退出后,怎样安排恢复?
参考思路: 按第 9.2 节检查第 100 步存档是否保有所需训练状态,保留原数据与配置,再按完整检查点恢复。第 100 步之后未保存的更新需要重做;恢复后核对日志中的起点与总计划,不能再额外跑完整 150 步。只有 Adapter 权重不足以证明接续了原优化器和调度状态,数据改变则应另记为新实验。
本章小结:
- AutoDL 负责模型加载与训练,本机通过 SSH 隧道访问页面并保存备份。环境准备要检查当前 Python 和 GPU 是否能实际执行所需计算。
- 数据登记把名称、文件与消息字段连接起来,预览用于核对实际输入。独立验证集通过 eval_dataset 指定,val_size 保持 0;测试集留给后续评估。
- 模型、训练阶段、微调方式和对话模板是不同设置。WebUI、YAML 与启动日志应相符,同一轮选择一种启动方式,训练期间结合进程和日志观察进度。
- 训练完成要由正常结束日志、状态和输出文件共同确认;检查点选择还需结合验证表现。页面断开、训练退出和模型效果不好,应分别定位。
- 训练结果包含 Adapter、配置、日志与检查点,下载后还要核验备份。完整续训比推理加载需要更多训练状态,实验记录则帮助后续复现、评估与交接。
建议下一步: 完成第 9.5 节实验记录,确认结果与备份可用,再进入第 32 章。先用验证输入检查加载和对话,再比较固定测试集上的回答;暂时没有运行条件时,可用下一章附带预测练习评分,并注明材料来自课程案例。