训练产物在哪?Qwen2.5-7B输出目录详解
1. 引言:为什么你总在找“训练完的文件在哪”
刚跑完一条swift sft命令,终端跳出Saving checkpoint to output/v2-20250412-1632/checkpoint-200,你松了口气——微调成功了。
但下一秒,你卡住了:
“这个
checkpoint-200是不是就是我要的模型?”
“它能直接推理吗?还是得合并权重?”
“output目录里一堆文件夹,哪个才是最终可用的?”
“如果想换台机器继续训,要拷哪些东西?”
这不是操作失误,而是所有首次接触 LoRA 微调的新手必经的“路径困惑期”。
本篇不讲原理、不堆参数,只做一件事:带你亲手摸清 Qwen2.5-7B 在单卡微调镜像中每一份产出物的物理位置、文件含义和使用逻辑。
你会清楚知道:
训练结束时,真正的“成果”落在哪个绝对路径下
每个子目录(checkpoint-*、adapter_config.json、merges/)到底存着什么
如何用最简命令验证某次保存是否有效
怎样最小化备份——只拷 3 个文件就能完整迁移训练状态
全文基于已验证环境:NVIDIA RTX 4090D + 镜像预置的 ms-swift + Qwen2.5-7B-Instruct,所有路径与行为均实测可复现。
2. 输出根目录:/root/output是唯一真相
2.1 默认路径不可更改,也不建议改
镜像文档明确指出:
--output_dir output
这意味着,无论你执行多少次swift sft,只要没显式指定其他--output_dir,所有产出物必然落在/root/output下。
这是硬编码路径,不是约定俗成的习惯。你可以用以下命令立刻确认:
ls -l /root/output预期输出(首次训练后):
total 0 drwxr-xr-x 3 root root 96 Apr 12 16:32 v2-20250412-1632注意:
v2-20250412-1632是自动生成的版本号(v2表示 ms-swift v2.x 协议,后缀为时间戳)- 它是唯一合法的顶层训练产物容器,里面不再嵌套其他
output或results文件夹 - 如果你看到
/root/output/output或/root/output/train_output,说明你或脚本误写了--output_dir,需立即检查
2.2 为什么不是/root/Qwen2.5-7B-Instruct/output?
有人会疑惑:“基础模型在/root/Qwen2.5-7B-Instruct,那输出不该放它下面吗?”
答案是否定的。原因有二:
- ms-swift 设计哲学:严格分离“原始模型”(只读)与“训练产物”(可写),避免污染源模型目录
- 工程安全性:防止因训练中断、磁盘满等异常导致基础模型文件被意外覆盖或损坏
所以请牢牢记住:
所有训练产物,只存在于
/root/output及其子目录中;基础模型目录/root/Qwen2.5-7B-Instruct是只读的,永远不生成新文件。
3. 版本子目录解剖:v2-20250412-1632里有什么
3.1 进入版本目录,看清结构全貌
执行:
cd /root/output/v2-20250412-1632 ls -la典型输出:
total 24 drwxr-xr-x 5 root root 160 Apr 12 16:32 . drwxr-xr-x 3 root root 96 Apr 12 16:32 .. drwxr-xr-x 3 root root 96 Apr 12 16:32 checkpoint-100 drwxr-xr-x 3 root root 96 Apr 12 16:32 checkpoint-200 drwxr-xr-x 3 root root 96 Apr 12 16:32 merges -rw-r--r-- 1 root root 287 Apr 12 16:32 adapter_config.json -rw-r--r-- 1 root root 52 Apr 12 16:32 configuration.json -rw-r--r-- 1 root root 21 Apr 12 16:32 README.md -rw-r--r-- 1 root root 76 Apr 12 16:32 trainer_log.json我们逐项拆解其真实作用:
| 文件/目录 | 类型 | 是否必需 | 关键说明 |
|---|---|---|---|
checkpoint-100,checkpoint-200 | 目录 | 是(至少保留一个) | 每次save_steps触发时生成的完整 LoRA 权重快照,含adapter_model.bin和adapter_config.json |
merges | 目录 | 否(但强烈建议保留) | 存放合并后的完整模型权重(即 LoRA + 基座模型融合结果),用于脱离 ms-swift 环境直接加载 |
adapter_config.json | 文件 | 是 | 全局 LoRA 配置:r=8,alpha=32,target_modules=all-linear—— 所有 checkpoint 共享此配置 |
configuration.json | 文件 | 是 | 记录本次训练的超参快照:num_train_epochs=10,learning_rate=1e-4,max_length=2048等 |
trainer_log.json | 文件 | 否(调试用) | 训练过程中的 loss、lr、step 时间戳日志,纯文本可读 |
关键洞察:
checkpoint-*目录是增量训练的基础单元,而merges目录是生产部署的交付物。二者定位完全不同。
4. Checkpoint 目录详解:checkpoint-200的真实构成
4.1 进入 checkpoint,识别核心三件套
执行:
cd /root/output/v2-20250412-1632/checkpoint-200 ls -l输出:
total 128000 drwxr-xr-x 2 root root 64 Apr 12 16:32 . drwxr-xr-x 5 root root 160 Apr 12 16:32 .. -rw-r--r-- 1 root root 287 Apr 12 16:32 adapter_config.json -rw-r--r-- 1 root root 130992420 Apr 12 16:32 adapter_model.bin -rw-r--r-- 1 root root 52 Apr 12 16:32 configuration.json这 3 个文件就是 checkpoint 的全部有效内容:
adapter_model.bin(约 125MB):真正的 LoRA 权重矩阵,包含所有lora_A和lora_B参数。它是微调效果的物理载体,也是你后续推理时必须加载的文件。adapter_config.json:声明该 checkpoint 使用的 LoRA 架构(rank、alpha、target modules)。若你用不同配置训了多个模型,此文件会自动适配。configuration.json:记录本次 checkpoint 对应的训练步数(global_step=200)、学习率、batch size 等上下文信息,用于断点续训。
验证技巧:用
file adapter_model.bin查看文件类型,应返回data(二进制);若返回text,说明保存失败。
4.2 Checkpoint 不是“模型”,只是“补丁”
新手最大误区:把checkpoint-200当成一个独立模型。
事实是:它只是一个轻量级参数补丁(约 125MB),必须与原始模型/root/Qwen2.5-7B-Instruct配合使用。
你可以这样理解:
- 基座模型 = 一辆未改装的汽车(7B 参数,24GB 显存占用)
- LoRA checkpoint = 一套可插拔的性能套件(125MB,仅修改转向/油门响应逻辑)
- 推理时 = 汽车 + 套件 同时运行,缺一不可
因此,checkpoint-200不能单独复制到其他机器直接运行,必须同时携带基座模型路径。
5. Merges 目录:从“补丁”到“整车”的关键一步
5.1 为什么需要 merge?—— 解耦推理环境
checkpoint-200虽小,但依赖 ms-swift 框架加载。若你想:
- 在另一台没装 ms-swift 的服务器上部署
- 用 HuggingFace Transformers 原生 pipeline 加载
- 导出为 GGUF 格式供 llama.cpp 运行
- 上传到 Hugging Face Hub 供他人复用
就必须执行merge(合并):将 LoRA 权重永久注入基座模型,生成一个“全新”的、自包含的模型。
镜像已预置 merge 脚本,执行即可:
cd /root swift export \ --ckpt_dir /root/output/v2-20250412-1632/checkpoint-200 \ --output_dir /root/output/v2-20250412-1632/merges/merged-200 \ --model_type qwen完成后查看:
ls -lh /root/output/v2-20250412-1632/merges/merged-200/输出(关键文件):
-rw-r--r-- 1 root root 15G Apr 12 16:45 pytorch_model-00001-of-00002.bin -rw-r--r-- 1 root root 7.2G Apr 12 16:45 pytorch_model-00002-of-00002.bin -rw-r--r-- 1 root root 12K Apr 12 16:45 config.json -rw-r--r-- 1 root root 23K Apr 12 16:45 tokenizer.model此时
merged-200就是一个标准 HuggingFace 格式模型,可直接用AutoModelForCausalLM.from_pretrained()加载,无需任何框架依赖。
5.2 Merge 后的存储策略:只留最精简的交付包
merged-200目录约 22GB(含分片 bin 文件 + tokenizer + config),但实际部署只需 3 个核心文件:
pytorch_model-00001-of-00002.bin(主权重分片)pytorch_model-00002-of-00002.bin(次权重分片)config.json(模型结构定义)
tokenizer.model可选:若你只做中文任务且不涉及特殊 token,可省略(基座模型已内置);但为兼容性,建议一并保留。
备份黄金法则:
- 开发阶段:保留完整
checkpoint-*(用于续训、对比实验)- 交付阶段:只打包
merges/merged-200/下的 3 个文件(约 22GB)- 归档阶段:删除所有
checkpoint-*,仅留merges/—— 节省 85% 磁盘空间
6. 实战验证:三步确认你的产物真正可用
别信日志,要动手验证。以下命令在镜像内 10 秒内完成验证:
6.1 验证 checkpoint 可加载(LoRA 模式)
CUDA_VISIBLE_DEVICES=0 \ swift infer \ --adapters /root/output/v2-20250412-1632/checkpoint-200 \ --model Qwen2.5-7B-Instruct \ --model_type qwen \ --stream true \ --temperature 0 \ --max_new_tokens 128输入你是谁?,若返回我是一个由 CSDN 迪菲赫尔曼 开发和维护的大语言模型。,则 checkpoint 有效。
6.2 验证 merge 模型可独立加载(原生模式)
python -c " from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained('/root/output/v2-20250412-1632/merges/merged-200') model = AutoModelForCausalLM.from_pretrained( '/root/output/v2-20250412-1632/merges/merged-200', device_map='auto', torch_dtype='bfloat16' ) print(' Merge model loaded successfully') "无报错即通过。
6.3 验证跨机器可迁移(最小化备份测试)
假设你将merged-200/打包为qwen25-7b-csdn-merged.tar.gz,在新机器解压后:
# 新机器执行(无需安装 ms-swift) pip install transformers accelerate python -c " from transformers import pipeline pipe = pipeline('text-generation', model='/path/to/merged-200', device_map='auto') print(pipe('你是谁?')[0]['generated_text'][-50:]) # 打印末尾50字符 "若输出含CSDN 迪菲赫尔曼,则迁移成功。
7. 常见陷阱与避坑指南
7.1 “找不到 checkpoint” 的 3 个真实原因
| 现象 | 根本原因 | 解决方案 |
|---|---|---|
ls /root/output返回No such file or directory | 训练中途被 kill(如 OOM、Ctrl+C),output目录未创建 | 检查nvidia-smi显存是否爆满;用 `dmesg |
ls /root/output/v2-*为空 | --output_dir被误设为相对路径(如./output),实际写入/root/./output | 永远用绝对路径--output_dir /root/output |
checkpoint-200存在但adapter_model.bin仅几 KB | 磁盘满或权限不足导致写入失败 | df -h查磁盘;ls -ld /root/output确认 root 写权限 |
7.2 不要做的 3 件事
❌不要手动修改adapter_config.json:ms-swift 严格校验该文件,格式错误会导致infer报KeyError: 'r'
❌不要删除configuration.json:它是断点续训的唯一依据,缺失则--resume_from_checkpoint失效
❌不要用cp -r checkpoint-200 checkpoint-final重命名:ms-swift 依赖目录名中的checkpoint-前缀识别,重命名后infer无法加载
7.3 一个命令查清所有产物状态
将以下脚本保存为/root/check_output.sh,一键诊断:
#!/bin/bash echo "=== OUTPUT DIRECTORY STATUS ===" ls -ld /root/output echo -e "\n=== LATEST VERSION ===" LATEST=$(ls -t /root/output/v2-* | head -1) echo $LATEST ls -lh "$LATEST" echo -e "\n=== LATEST CHECKPOINT ===" LATEST_CKPT=$(ls -t "$LATEST"/checkpoint-* | head -1) echo $LATEST_CKPT ls -lh "$LATEST_CKPT"/adapter_model.bin echo -e "\n=== MERGE STATUS ===" ls -d "$LATEST"/merges/*/ 2>/dev/null || echo "No merges found"运行bash /root/check_output.sh,5 秒掌握全局。
8. 总结:你的训练产物地图已就绪
8.1 关键路径速查表
| 目标 | 绝对路径 | 说明 |
|---|---|---|
| 所有产物根目录 | /root/output | 唯一可信来源,其他路径均为干扰项 |
| 最新训练版本 | /root/output/v2-YYYYMMDD-HHMM | 时间戳命名,按字母序最新即最新 |
| 最佳 checkpoint | /root/output/v2-*/checkpoint-<step> | 选save_steps最大值(如checkpoint-200) |
| 生产交付模型 | /root/output/v2-*/merges/merged-<step>/ | 已合并,可脱离 ms-swift 运行 |
| 最小备份集 | merged-<step>/pytorch_model-*.bin + config.json + tokenizer.model | 3 文件,约 22GB |
8.2 行动清单:下一步你该做什么
- 立刻执行:
ls -lh /root/output/v2-*/checkpoint-*/adapter_model.bin确认文件大小 >100MB - 马上验证:用
swift infer --adapters测试一次问答,确保自我认知已更新 - 今日完成:运行
swift export生成merges/,并用原生 Transformers 加载验证 - 长期习惯:每次训练后,运行
bash /root/check_output.sh存档状态快照
你不再需要猜测、搜索或试错。现在,每一个字节的训练产物,都在你指尖掌控之中。
--- > **获取更多AI镜像** > > 想探索更多AI镜像和应用场景?访问 [CSDN星图镜像广场](https://ai.csdn.net/?utm_source=mirror_blog_end),提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。