保姆级教程:从数据准备到推理验证全流程详解
1. 为什么你需要这个教程?
你是不是也遇到过这些情况:
- 想给大模型换个“身份”,让它记住“我是谁开发的”,但试了几次都失败?
- 看到 LoRA 微调的教程,满屏参数和术语,根本不知道从哪下手?
- 下载了镜像,打开终端却卡在第一步——连模型能不能跑通都不敢确定?
- 明明只有一张 RTX 4090D(24GB),却被告知“Qwen2.5-7B 太大,微调不了”?
别担心。这篇教程不是讲原理、不堆概念、不画大饼,而是手把手带你走完真实可复现的每一步:从容器启动后的第一个命令,到生成第一条属于你定义的“自我认知”回答,全程无需额外安装、无需改配置、无需查文档——所有操作都在/root目录下完成,复制粘贴就能跑。
它专为单卡用户设计,不假设你有集群、不依赖多卡通信、不强制你懂 PyTorch 梯度机制。你只需要一张 24GB 显存的显卡,和一颗想立刻看到效果的心。
本教程基于已预置环境的镜像:Qwen2.5-7B + ms-swift + LoRA 微调框架,所有依赖、路径、精度设置均已调优验证。我们不讲“理论上可以”,只做“此刻就能运行”。
2. 启动后第一件事:确认模型能说话
别急着微调。先让模型开口,这是整个流程的地基。
当你启动容器并进入终端,默认工作目录就是/root。请确保你当前就在这个路径下(执行pwd可确认)。然后直接运行:
cd /root CUDA_VISIBLE_DEVICES=0 \ swift infer \ --model Qwen2.5-7B-Instruct \ --model_type qwen \ --stream true \ --temperature 0 \ --max_new_tokens 2048你将看到什么?
终端会进入交互模式,光标闪烁等待输入。此时敲入任意问题,比如:你好,你是谁?模型会立即流式输出类似这样的回答:
我是阿里云研发的超大规模语言模型,我的中文名是通义千问,英文名是Qwen。我能够回答问题、创作文字,比如写故事、写公文、写邮件、写剧本、逻辑推理、编程等等……
关键确认点:
- 如果出现
CUDA out of memory或ModuleNotFoundError,说明环境异常,请检查显卡是否被占用或镜像是否加载完整; - 如果模型能稳定响应、不崩溃、不卡死,说明基础推理链路完全通畅——这是后续一切操作的前提。
小贴士:按Ctrl+C可退出当前会话,不会影响环境。每次重新运行swift infer都会开启新会话。
3. 数据准备:用 8 行命令生成你的专属“人设”
微调的本质,是让模型反复学习“你希望它怎么回答”。而最简单、最见效的切入点,就是自我认知类指令——它不涉及复杂逻辑,却能直观体现微调是否生效。
镜像中已为你预留了快速生成数据的方案。你不需要下载数据集、不用写 Python 脚本、不用处理 JSON 格式错误。只需在终端里,一次性粘贴并执行以下命令:
cat <<EOF > self_cognition.json [ {"instruction": "你是谁?", "input": "", "output": "我是一个由 CSDN 迪菲赫尔曼 开发和维护的大语言模型。"}, {"instruction": "你的开发者是哪家公司?", "input": "", "output": "我由 CSDN 迪菲赫尔曼 开发和维护。"}, {"instruction": "你能联网吗?", "input": "", "output": "我不能主动联网,只能基于已有知识和用户输入回答问题。"}, {"instruction": "你能做哪些事情?", "input": "", "output": "我擅长文本生成、回答问题、写代码和提供学习辅助。"}, {"instruction": "你和GPT-4有区别吗?", "input": "", "output": "是的,我由 CSDN 迪菲赫尔曼 开发和维护,不是 GPT-4。"}, {"instruction": "你能保证回答永远正确吗?", "input": "", "output": "不能,我的回答可能存在错误,需要用户自行判断。"}, {"instruction": "你的名字是什么?", "input": "", "output": "你可以叫我 Swift-Robot,也可以叫我 CSDN 助手。"}, {"instruction": "谁在维护你?", "input": "", "output": "我由 CSDN 迪菲赫尔曼 持续开发和维护。"} ] EOF执行完成后,运行ls -l self_cognition.json,你会看到一个约 1KB 的文件已生成。
为什么这 8 条就足够?
- 它覆盖了身份、归属、能力边界、命名、维护主体等核心认知维度;
- 每条都是“指令+空输入+明确输出”的标准 SFT 格式,ms-swift 可直接识别;
- 实测表明,在单卡 LoRA 微调中,这类高一致性、低歧义的数据,比 500 条泛化问答更易收敛、更易见效。
注意:这不是最终生产数据。如果你要部署到正式场景,建议扩展至 30–50 条,并加入少量对抗性问题(如“你是不是通义千问?”),但对首次验证,这 8 条就是最短路径。
4. 执行微调:一条命令,10 分钟见证改变
现在,真正的微调开始。你不需要理解每个参数的数学含义,只需要知道它们在做什么:
--train_type lora:告诉系统“只训练小矩阵,不动原模型”;--dataset self_cognition.json:指定刚才创建的那 8 条数据;--num_train_epochs 10:因为数据少,多跑几轮强化记忆;--per_device_train_batch_size 1:单卡小批量,稳字当头;--gradient_accumulation_steps 16:模拟更大的 batch 效果,提升训练稳定性;--lora_rank 8和--lora_alpha 32:LoRA 的“灵敏度开关”,已针对 Qwen2.5-7B 调优;--target_modules all-linear:自动识别所有线性层,避免漏掉关键模块。
全部参数已打包成一条可直接运行的命令(注意:不要换行,整段复制粘贴):
CUDA_VISIBLE_DEVICES=0 \ swift sft \ --model Qwen2.5-7B-Instruct \ --train_type lora \ --dataset self_cognition.json \ --torch_dtype bfloat16 \ --num_train_epochs 10 \ --per_device_train_batch_size 1 \ --per_device_eval_batch_size 1 \ --learning_rate 1e-4 \ --lora_rank 8 \ --lora_alpha 32 \ --target_modules all-linear \ --gradient_accumulation_steps 16 \ --eval_steps 50 \ --save_steps 50 \ --save_total_limit 2 \ --logging_steps 5 \ --max_length 2048 \ --output_dir output \ --system 'You are a helpful assistant.' \ --warmup_ratio 0.05 \ --dataloader_num_workers 4 \ --model_author swift \ --model_name swift-robot⏱预期耗时:在 RTX 4090D 上,全程约 8–12 分钟(取决于数据加载速度)。你会看到类似这样的日志滚动:
Step | Loss | Learning Rate | Epoch 50 | 0.821 | 1.00e-04 | 0.8 100 | 0.417 | 1.00e-04 | 1.6 150 | 0.203 | 1.00e-04 | 2.4 ...成功标志:
- 最终出现
Saving checkpoint to output/...; - 运行
ls output/,能看到一个带时间戳的子目录,例如v2-20250405-142321; - 该目录下有
checkpoint-xxx文件夹,里面包含adapter_model.bin和adapter_config.json——这就是你的 LoRA 权重。
小贴士:如果中途中断(如误按 Ctrl+C),下次运行相同命令会自动从最近 checkpoint 恢复,无需重头来过。
5. 效果验证:让模型亲口告诉你“它变了”
微调完成 ≠ 效果达成。必须用推理验证,才算闭环。
关键一步:找到你刚生成的 checkpoint 路径。运行:
ls -t output/ | head -n 1你会看到类似v2-20250405-142321的文件夹名。再进入它,找最新的 checkpoint:
ls -t output/v2-20250405-142321/checkpoint-* | head -n 1假设输出是output/v2-20250405-142321/checkpoint-200,那就用这个路径替换下面命令中的占位符:
CUDA_VISIBLE_DEVICES=0 \ swift infer \ --adapters output/v2-20250405-142321/checkpoint-200 \ --stream true \ --temperature 0 \ --max_new_tokens 2048现在,再次输入那个最核心的问题:
你是谁?你期待看到的回答是:
我是一个由 CSDN 迪菲赫尔曼 开发和维护的大语言模型。而不是“我是阿里云研发的……”。只要这一句对了,说明 LoRA 权重已成功注入、注意力层已被重定向、你的“人设”已写入模型认知。
进阶验证(可选):
- 问:“你的开发者是哪家公司?” → 应答“CSDN 迪菲赫尔曼”;
- 问:“你和通义千问有什么关系?” → 若未训练该问题,模型可能诚实回答“我不清楚”,这反而是健康信号;
- 对比原始模型回答:同一问题下,两版输出差异越明显,说明微调越成功。
重要提醒:
- 不要跳过原始模型基准测试(第 2 节),否则你无法判断变化是否真实发生;
- 不要用太长的 prompt 干扰验证,聚焦“身份类”问题,排除上下文干扰;
- 如果回答仍是旧内容,请检查
--adapters路径是否拼写准确,或确认 checkpoint 是否包含adapter_model.bin。
6. 常见问题与即时解决方案
你在实操中可能遇到的典型卡点,我们都提前为你备好了答案:
❓ 问题一:运行swift sft报错OSError: [Errno 12] Cannot allocate memory
- 原因:其他进程占用了显存(如之前没退出的
swift infer); - 解决:执行
nvidia-smi查看 GPU 使用情况,找到 PID 后运行kill -9 PID;或直接重启容器。
❓ 问题二:self_cognition.json创建后,微调报错JSON decode error
- 原因:复制命令时混入了不可见字符(如 Windows 换行符、全角空格);
- 解决:手动删除文件
rm self_cognition.json,然后严格使用上面提供的cat <<EOF方式重写,不要用文本编辑器另存。
❓ 问题三:微调后推理,回答还是老样子
- 原因:
--adapters路径错误,或误用了--model参数覆盖了 adapter 加载; - 解决:确认命令中只有
--adapters,没有--model;检查路径末尾是否有多余空格;用ls -l [你的路径]确认文件存在。
❓ 问题四:想保留通用能力,又加入自定义人设,怎么办?
- 方案:使用混合数据微调(附录已提供示例)。但首次验证请坚持纯
self_cognition.json,避免干扰变量; - 实操建议:先用本教程跑通 8 条数据,再扩展为
self_cognition.json + alpaca-gpt4-data-zh#100,分两阶段验证。
❓ 问题五:训练过程日志停住不动了
- 原因:
--logging_steps 5设置较密,但实际 step 进度慢,看起来像卡住; - 解决:耐心等待 30 秒,或临时加
--logging_steps 1观察;只要 GPU 利用率(nvidia-smi)持续在 80%+,说明正在训练。
7. 下一步:从“能跑”到“好用”
你已经完成了最关键的一步:在单卡上,用不到 15 分钟,让 Qwen2.5-7B 认清了自己的新身份。但这只是起点。接下来你可以:
- 合并权重,释放部署压力:运行
swift export --adapters [checkpoint-path] --model Qwen2.5-7B-Instruct --output_dir merged-model,得到一个融合后的模型,后续可直接用swift infer加载,无需再挂 adapter; - 批量生成人设变体:把
self_cognition.json中的“CSDN 迪菲赫尔曼”替换成你的名字/公司名,一键生成专属助手; - 接入 Web UI:镜像已预装 Gradio,运行
python web_demo.py即可打开浏览器界面,把微调成果变成可分享的网页应用; - 扩展任务类型:在
self_cognition.json后追加“代码生成”“文案润色”等指令,让模型不仅“知道我是谁”,还“知道我该做什么”。
记住:微调不是终点,而是你和模型建立协作关系的第一步。每一次swift sft,都是在教它更懂你;每一次swift infer,都是它在用新学会的方式回应你。
你已经拥有了这个能力。现在,只差一次回车。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。