模型训练指南四:SFT训练指南
SFT(有监督微调) 的本质是 “指令对齐” ,即让模型学会:当用户这么问时,模型应该以什么样的格式和语气来回答。
渲染中...
在掌握了 PT(增量预训练)这种“灌输知识”的手段后,**SFT(有监督微调)** 就是实操中最重要的环节。它的本质是 **“指令对齐”**,即让模型学会:当用户这么问时,模型应该以什么样的格式和语气来回答。
## SFT 的核心准备
### 1. 准备什么样的数据?
SFT 需要的是 **QA 问答对**(或称 Instruction 数据)。
**格式:** 通常为 `JSONL`。
**内容结构:**
- `instruction`: 用户的指令/问题(如:“我今天很难过”)。
- `input`: 可选的背景信息(如:“用户刚失业”)。
- `output`: 模型的标准回答(如:“抱抱你,我知道现在的感觉很糟糕...”)。
**数据量:** 陪伴式业务通常需要 **500 - 5,000 条** 高质量、符合特定人设的多轮对话数据。
### 2. 需要什么软件和框架?
**硬件:** 显存 24G 以上的显卡(如 3090/4090/A100)。
**系统:** Linux (Ubuntu 20.04+) 效果最好,Windows 下需 WSL2。
**核心框架:**
- `PyTorch`: 深度学习底座。
- `Transformers`: HuggingFace 出品,模型加载与训练核心库。
- `PEFT`: 用于 LoRA 等轻量化微调的库。
- `DeepSpeed`: 处理多显卡并行和显存优化。
## 两种方案的操作步骤
### 1. LLaMA-Factory
这是目前最推荐的**实操方案**,平衡了灵活性和易用性。
1. **数据注册:** 把你的 `sft_data.json` 放到 `data/` 文件夹。修改 `data/dataset_info.json`,添加你的数据集描述。
2. **启动训练(命令行模式):** 编写一个 `sft.yaml` 配置文件:
```YAML
stage: sft # 设置为 SFT 阶段
model_name_or_path: qwen/Qwen2.5-7B
preprocessing_num_workers: 8
finetuning_type: lora # 采用 LoRA 提升效率
template: qwen # 关键!必须与底座模型一致
dataset: my_sft_data # 你注册的数据集名字
output_dir: ./sft_output # 模型权重保存位置
per_device_train_batch_size: 4
gradient_accumulation_steps: 4
learning_rate: 5e-5 # SFT 学习率通常比 PT 高
num_train_epochs: 3.0
plot_loss: true # 生成 Loss 曲线图
```
3. **运行命令:**
```Bash
llamafactory-cli train sft.yaml
```
4. **模型合并:** 训练完得到的是 LoRA 权重,执行 `llamafactory-cli export` 配置文件将其与原模型合并。
### 2. 自己写代码
这是最硬核的,基于 `Transformers` 库的 `SFTTrainer`。
1. **加载模型与分词器:**
```Python
from trl import SFTTrainer
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments
from peft import LoraConfig
model_id = "qwen/Qwen2.5-7B"
tokenizer = AutoTokenizer.from_pretrained(model_id)
tokenizer.pad_token = tokenizer.eos_token # 设置填充字符
```
2. **配置 LoRA 参数:**
```Python
peft_config = LoraConfig(
r=16, lora_alpha=32, target_modules="all-linear", task_type="CAUSAL_LM"
)
```
3. **定义训练器:**
```Python
args = TrainingArguments(
output_dir="./my_sft_model",
per_device_train_batch_size=4,
max_steps=1000,
learning_rate=5e-5,
fp16=True # 开启半精度训练,省显存
)
trainer = SFTTrainer(
model=model_id,
args=args,
train_dataset=my_dataset, # 之前处理好的 Dataset 对象
dataset_text_field="text", # 指定数据集中对应的字段
peft_config=peft_config,
max_seq_length=1024,
)
```
4. **开始训练:**
```Python
trainer.train()
trainer.save_model()
```
## 总结与建议
- **如果你追求效率:** 请直接使用 **LLaMA-Factory**。它帮你处理了对话模板(Chat Template)的问题。*注意:SFT 训练中,如果对话模板(如 `<|im_start|>` 等标签)弄错,模型会直接变傻。*
- **如果你只有 CPU 或想零代码:** 选 **阿里百炼**。
- **如果你在写论文或做学术研究:** 自己写代码(方案 3),方便你魔改 Loss 函数。END
评论
登录后查看和发表评论
前往登录