[大模型LoRA微调]学习笔记
目录
- 第一章:一句话理解微调
- 第二章:LoRA 到 QLoRA 的进化逻辑
- 第三章:数据准备
- 第四章:微调工具对比
- 第五章:微调新方法一览
- 第六章:评估比训练更重要
- 第七章:用 LLaMA-Factory 实操指南
第一章:一句话理解微调
微调不是让模型变聪明
大模型在预训练阶段已经"什么都知道了"。但问题是——它不知道你要它做什么。
微调 = 让模型学会做你给它的那类题
举例:
微调前:
用户:"写一首关于春天的诗"
模型:"巴黎是法国的首都。"
→ 模型理解力没问题,但它不知道你期望输出什么格式
微调后:
用户:"写一首关于春天的诗"
模型:"春风拂面柳如烟,碧水清波映蓝天……"
→ 它学会了"你要的是诗,不是百科问答"
一个形象的类比
全参微调:重新培养一个专家(贵,周期长)
↓
LoRA:保留原专家,旁边加个小本子记录"这个领域的特点"
↓
QLoRA:把专家"压缩存放"(4-bit),小本子照记——更省地方
核心思想:利用模型已有的能力,用很少的数据教会它"你想要的输出格式和行为模式"。
第二章:LoRA 到 QLoRA 的进化逻辑
为什么全参微调太贵
一个 65B 参数的模型:
| 内容 | 占用显存 |
|---|---|
| 模型权重 (FP16) | 130 GB |
| 梯度 | 130 GB |
| 优化器状态 | 260 GB |
| 总计 | 约 520 GB |
一张 A100 只有 80GB,根本放不下。
LoRA:只训练"插件"
LoRA 的核心思路:
原模型参数 W(冻结,不动)
+ 插入两个小矩阵 A × B(可训练)
= 效果接近全参微调
类比:不需要换发动机,加个涡轮增压器就行
可训练参数从 d×k 降到 r×(d+k),通常减少 10000 倍。
但注意:原模型参数 W 仍然占着显存,只是不计算梯度了。
QLoRA:再压缩原模型
QLoRA 在 LoRA 的基础上加了三刀:
第一刀:原模型压缩到 4-bit (NF4 量化)
效果:130GB → ~16GB,省 87%
第二刀:双重量化——对压缩的参数表再做一次压缩
效果:平均每参数从 0.5 bit 降到 0.127 bit
第三刀:Paged Optimizers——优化器状态换到 CPU 内存
效果:显存不够时用 CPU 兜底
最终效果:一张 48GB 显存的卡就能微调 65B 的模型。
三个关键技术的通俗解释
| 技术 | 一句话 | 类比 |
|---|---|---|
| NF4 量化 | 把 16bit 权重压缩到 4bit,选择最合适的"分桶"方式保留精度 | 把一本书缩写成关键词,保留最重要的信息 |
| 双重量化 | 对量化规则本身再做一层量化 | 写"备注"的备注,省纸 |
| Paged Optimizers | 优化器状态存到 CPU,用的时候再读 | 桌面放不下,用到啥文件再从柜子里拿 |
第三章:数据准备
数据质量 > 数据数量
这是微调中最容易被忽视的规律:
| 数据 | 100 条高质量 | 10000 条低质量 |
|---|---|---|
| 效果 | 好 ✅ | 差 ❌ |
| 原因 | 每条都是人工精心设计的例子 | 有重复、有噪声、格式不统一 |
想要好的微调效果,花 80% 的时间准备数据,20% 的时间训练。
Alpaca 格式
LLaMA-Factory 最常用的格式(推荐入门用):
{
"instruction": "什么是 LangChain 的 Chain?",
"input": "",
"output": "Chain 是 LangChain 中用于串联多个处理步骤的核心抽象。它可以将多个组件组合成一个完整的处理流程,支持顺序执行、条件分支和并行处理等模式。"
}
多轮对话版:
{
"instruction": "什么是 Agent?",
"input": "",
"output": "Agent 是能自主决定调用哪些工具来完成任务的组件。",
"history": [
["什么是 RAG", "RAG 是检索增强生成,从外部知识库检索信息辅助回答。"],
["和传统 Prompt 有什么区别", "传统 Prompt 靠模型记忆,RAG 从外部文档实时检索。"]
]
}
多个这样的对象放在一个 JSON 数组里,就是一个数据集
效果示例:
问题:什么是 Output Parser
答案:Output Parser 是 LangChain 中用于将大模型自由文本输出
转换为结构化数据的工具。大模型输出是自由文本(如"好
的,我给你返回一个JSON..."),但程序需要 dict、list
等结构化数据。Output Parser 就像一个"翻译器"。
提升数据质量的技巧
| 常见问题 | 处理方法 |
|---|---|
| 标题太短(如"目录"、“概述”) | 直接删掉,或者扩展成完整问题 |
| 答案有重复 | 手动去重,只保留最完整的版本 |
| 答案带代码 | 保留,这正是微调的价值——让模型学会你的代码风格 |
| 问题不够具体 | 改写:"Chain" → "LangChain 中的 Chain 是什么?有什么用?" |
第四章:微调工具对比
LLaMA-Factory ⭐ (推荐入门)
| 方面 | 说明 |
|---|---|
| 定位 | 一站式微调工具,从数据到训练到推理 |
| 支持方法 | LoRA / QLoRA / DoRA / 全参 / DPO / GRPO |
| 模型池 | 600+ 模型直接支持(Qwen、DeepSeek、LLaMA 等) |
| 界面 | Web UI、命令行两种方式 |
| 适合人群 | 初学者、实验对比 |
| 门槛 | 最低,点几下就能跑 |
优势:Web UI 直观,不需要写代码即可完成一次完整微调。 不足:黑盒感较强,报错有时不友好,生产部署还需额外工具。
Unsloth(进阶)
| 方面 | 说明 |
|---|---|
| 定位 | 底层优化训练速度的内存效率库 |
| 相比 LLaMA-Factory | 训练速度 2x 快,显存再省 50% |
| 代码量 | 10 行 Python 即可跑通 |
| 适合人群 | 已经理解微调流程,想提高效率的人 |
代码示例:
from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained(
"unsloth/Qwen2.5-7B",
load_in_4bit=True
)
model = FastLanguageModel.get_peft_model(model, r=16)
注意:没有 Web UI,需要自己写训练脚本。
Axolotl(实验研究)
| 方面 | 说明 |
|---|---|
| 定位 | 配置驱动的微调框架 |
| 特点 | YAML 配置文件定义一切,实验可复现 |
| 适合人群 | 需要对比多种方案效果的研究者 |
不足:配置项比 LLaMA-Factory 还多,学习曲线较陡。
选择建议
学习阶段 → LLaMA-Factory(自动挡)
熟悉后 → Unsloth(手动挡,性能更好)
做实验 → Axolotl(可复现性最强)
第五章:微调新方法一览(了解即可)
DoRA(2024)
- 思路:把权重分解为"幅度 + 方向",LoRA 只调方向,DoRA 两者都调
- 效果:低秩场景下比 LoRA 好 2-3%
- 使用:在 LLaMA-Factory 里加一行参数
use_dora: true
LoRA-XS(2025)
- 思路:参数更少的 LoRA 变体
- 适合场景:极端资源受限(手机端、边缘设备)
ReFT(2025)
- 思路:不调整权重,而是调整模型的"内部表征"
- 状态:非常新,效果有争议,尚在验证阶段
GRPO(2025)
- 来源:DeepSeek-R1 使用的方法
- 定位:强化学习而非纯微调
- 区别:SFT 是"给答案让它学",GRPO 是"给奖励让它自己探索"
一句话总结
LLaMA-Factory 基本都收录了这些新方法,学会它之后改一行配置就能试用。
第六章:评估比训练更重要
正确循环
很多新手花 1 天训练,0 分钟评估。这是完全错误的顺序:
准备数据 ─→ 训练模型 ─→ 评估效果 ─→ 分析问题
↑ │
└──────── 修改数据 ←──────────┘
一般需要循环 3-5 轮才能得到满意的模型。
最简单的评估方法
方法一:对比问答(推荐)
准备 10 个测试问题,分别问:
- 原始模型(未微调)
- 微调后的模型
对比输出差异:
- 微调后的回答是否更符合你期望的格式?
- 是否包含你准备的专属知识?
- 有没有遗忘原有的能力?(灾难性遗忘)
方法二:Loss 曲线
- 训练 loss 持续下降 → 模型在学习 ✅
- 训练 loss 下降但验证 loss 上升 → 过拟合 ⚠️
- loss 一开始就震荡不下降 → 数据或参数有问题 ❌
方法三:测试集准确率
最适合"有标准答案"的任务(分类、提取、翻译等)。
关键原则
| 原则 | 说明 |
|---|---|
| 先评估,再迭代 | 每次改数据或参数后都要做一次评估 |
| 基座对比 | 永远和未微调的基座模型比较,才知道微调是否有效 |
| 人工看 > 指标看 | 花半小时读几条回答,比看一个数字有用得多 |
第七章:用 LLaMA-Factory 实操指南
本章是一份 实操路线图,告诉你如果有天想上手跑一次完整的微调,该怎么走。
7.1 准备工作
你需要什么:
| 方案 | 优点 | 缺点 |
|---|---|---|
| Google Colab 免费版 | 零配置、免费 T4 GPU | 需要 Google 账号、有使用时长限制 |
| 阿里云/腾讯云 GPU 实例 | 可长期使用 | 收费(约 5-10 元/小时) |
| 本地 Nvidia 显卡 | 不限时间 | 需要 8GB+ 显存 |
| 本地 CPU | 免费 | 慢(0.5B 模型约 10-20 分钟) |
7.2 安装 LLaMA-Factory
# 一行命令安装
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e ".[torch,metrics]"
7.3 数据准备
LLaMA-Factory/data/
├── dataset_info.json ← 数据集注册文件(已存在)
└── my_langchain_data.json ← 你准备的数据集(新建)
在 dataset_info.json 中注册你的数据集:
{
"my_langchain": {
"file_name": "my_langchain_data.json",
"formatting": "alpaca",
"columns": {
"prompt": "instruction",
"query": "input",
"response": "output"
}
}
}
7.4 开始训练
命令行方式(推荐学习用):
llamafactory-cli train \
--model_name_or_path Qwen/Qwen2.5-1.5B \
--dataset my_langchain \
--lora_target q_proj,v_proj \
--lora_rank 8 \
--learning_rate 2e-4 \
--num_train_epochs 3.0 \
--per_device_train_batch_size 4 \
--output_dir ./output/my_langchain_model
关键参数解释:
| 参数 | 含义 | 建议初学值 |
|---|---|---|
lora_rank |
LoRA 秩,越大学得越好但也越贵 | 8 或 16 |
learning_rate |
学习率,太大不稳定,太小学不动 | 2e-4 |
num_train_epochs |
训练轮数,3-5 轮通常就够了 | 3 |
batch_size |
每次处理几条数据,越大越快但越费显存 | 4(按显存调) |
7.5 可视化的 Web UI 方式
llamafactory-cli webui
打开浏览器后:
- 选择模型(如 Qwen2.5-1.5B)
- 选择数据集(你注册的 my_langchain)
- 选择微调方法(LoRA 或 QLoRA)
- 点击"开始训练"
- 观察实时 Loss 曲线 ↓
7.6 训练完成后
训练结束后你会得到输出目录:
output/my_langchain_model/
├── adapter_config.json (LoRA 配置)
├── adapter_model.safetensors (训练好的适配器权重,约 5-30MB)
└── training_log.json (训练日志)
注意:你得到的只是一个很小的适配器文件(5-30MB),不是完整的模型。使用时要和基座模型配合。
7.7 用微调后的模型推理
llamafactory-cli chat \
--model_name_or_path Qwen/Qwen2.5-1.5B \
--adapter_name_or_path ./output/my_langchain_model
然后你就可以像聊天一样和微调后的模型对话了。
7.8 完整实操流程图
┌─────────────────────────────────────────────────────────┐
│ LLaMA-Factory 实操流程 │
├─────────────────────────────────────────────────────────┤
│ │
│ 1. 准备环境:Colab / 云GPU / 本地 │
│ ↓ │
│ 2. 安装 LLaMA-Factory(一行命令) │
│ ↓ │
│ 3. 准备数据(Alpaca 格式 JSON) │
│ ↓ │
│ 4. 注册到 dataset_info.json │
│ ↓ │
│ 5. 运行训练命令(或打开 Web UI 点点点) │
│ ↓ │
│ 6. 观察 Loss 曲线下降 │
│ ↓ │
│ 7. 完成 → 得到适配器权重(仅几 MB) │
│ ↓ │
│ 8. 加载适配器 + 基座模型,开始问答测试 │
│ ↓ │
│ 9. 不满意?返回第 3 步改数据 → 再训练 │
│ │
└─────────────────────────────────────────────────────────┘
总结一句
微调 = 好基座 + 好数据 + QLoRA + 迭代评估
不需要理解梯度下降、反向传播,也能做出有效的微调模型。
更多推荐




所有评论(0)