一、什么是微调(Fine-tuning)
微调是在已经预训练好的大模型基础上,用特定领域或任务的数据进一步训练,使模型适应特定需求的过程。想象一个医学生完成了十几年基础教育(预训练),然后去某家医院实习(微调),专门学习这家医院的流程和规范。
二、微调的基本原理
2.1 迁移学习(Transfer Learning)
预训练模型已经学习了通用语言理解能力,微调只调整模型的部分参数,而非从头训练,大幅节省计算资源。
2.2 两种主要微调范式
| 对比项 | 全量参数微调 | 参数高效微调(PEFT) |
|---|---|---|
| 原理 | 更新所有参数 | 只更新部分参数 |
| 代表技术 | - | LoRA / QLoRA / Adapter / Prefix Tuning |
| 显存需求 | 极高(需要多卡) | 低(单卡可跑) |
| 训练速度 | 慢 | 快 |
| 效果 | 最好 | 接近全量微调 |
2.3 主流技术:LoRA(Low-Rank Adaptation)
核心思想:不直接修改原模型权重,而是在旁边加两个小矩阵(A和B)。原始权重W保持冻结,最终输出 = Wx + BAx(BA是低秩近似)。
优点:参数量极小(通常只有原来的0.1%~5%),推理零延迟。
三、如何在已训练好的模型上微调
Step 1:准备数据
对话数据格式示例:messages数组包含system/user/assistant角色。
Step 2:选择底座模型
开源模型:LLaMA(Meta)、Qwen(阿里)、DeepSeek、Mistral等。国内可用:Qwen、DeepSeek Chat、Yi等。
Step 3:选择微调框架
| 框架 | 特点 |
|---|---|
| LLaMA Factory | 图形界面,支持多种模型,国产友好 |
| Axolotl | 配置灵活,YAML驱动 |
| TRL | HuggingFace出品,与transformers无缝集成 |
| SWIFT | 阿里开源,支持Qwen等国内模型 |
Step 4-6:配置训练 → 执行训练 → 合并与推理
配置好batch_size、learning_rate、num_epochs等参数后执行训练,微调后得到adapter(增量),可合并到原模型权重中。
四、微调Qwen3-8B具体配置示例(LLaMA Factory + QLoRA)
4.1 环境准备
# 1. 安装 LLaMA Factory
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
pip install -e .
# 2. 安装额外依赖(可选)
pip install bitsandbytes peft deepseed
# 3. 确认CUDA环境
python -c "import torch; print(torch.cuda.is_available())"
4.2 数据集准备
创建数据集文件 dataset.json(示例格式):
[
{
"messages": [
{"role": "system", "content": "你是一个专业的AI助手"},
{"role": "user", "content": "什么是大模型微调?"},
{"role": "assistant", "content": "大模型微调是在预训练模型基础上..."}
]
}
]
4.3 训练配置文件(llamafactory.yaml)
### 模型配置
model_name_or_path: Qwen/Qwen2.5-7B-Instruct
method: qloar # 使用QLoRA
### 数据配置
dataset: your_dataset # 数据集名称
dataset_dir: data # 数据目录
template: qwen2 # 对应Qwen模板
cutoff_len: 2048 # 最大序列长度
max_samples: 10000 # 最大样本数
### 输出配置
output_dir: ./output/qwen_finetune
logging_dir: ./logs
export_dir: ./export
### 训练参数
stage: sft # Supervised Fine-Tuning
per_device_train_batch_size: 4
gradient_accumulation_steps: 4
eval_batch_size: 4
learning_rate: 1.0e-4
num_train_epochs: 3
lr_scheduler_type: cosine
warmup_ratio: 0.1
bf16: true # 使用BF16精度
optim: adamw_torch
### LoRA配置
lora_rank: 8
lora_alpha: 16
lora_dropout: 0.05
lora_target: all
4.4 启动训练
# 标准训练
llamafactory-cli train llamafactory.yaml
# 带监控的训练
llamafactory-cli train llamafactory.yaml --preview
# 从中断处恢复
llamafactory-cli train llamafactory.yaml --resume_from_checkpoint
4.5 合并与导出模型
# 合并LoRA权重到原模型
llamafactory-cli export llamafactory.yaml
# 或使用Python合并
from llamafactory.chat import ChatManager
manager = ChatManager()
manager.merge_lora()
4.6 硬件参考
| 配置 | 全量微调 | QLoRA微调 |
|---|---|---|
| 显卡 | A100 80GB x 8 | RTX 3090/4090 24GB x 1 |
| 显存 | 640GB+ | 约16GB |
| 训练时间 | 数小时~1天 | 约4-8小时 |
| 参数量 | 7B params | 约60M trainable params |
五、前置条件
| 类别 | 要求 |
|---|---|
| 硬件 | 全量微调需24GB+显存(8卡或A100);LoRA 7B单卡16GB即可 |
| 模型 | 支持微调的基座模型(如Qwen、LLaMA、DeepSeek等) |
| 数据 | 质量高、格式正确、量级适中(通常100条~1万条) |
| 软件 | Python + CUDA + 训练框架(llamafactory等) |
| 知识 | 基本的深度学习概念、模型结构理解 |
六、什么情况下需要微调
✅ 需要微调的场景
- 特定行业知识:医疗、法律、金融等专业领域
- 特定任务优化:客服、翻译、摘要、代码生成等
- 输出格式固定:要求按特定JSON、模板输出
- 垂直场景:企业内部知识库、专属问答机器人
- 中文任务:中文语料占比高的场景效果优于Prompt
❌ 不需要微调的场景
- 通用对话:日常问答,直接用基础模型+Prompt即可
- 数据太少:容易过拟合,效果差
七、常见误区
- 微调不是万能的:如果Prompt能搞定,就不要微调
- 数据质量 > 数量:100条高质量数据胜过10000条脏数据
- 不是越训练久越好:过拟合会导致模型"忘记"通用能力
- 中文开源模型建议:用Qwen、DeepSeek(中文能力强,生态好)