[ PROMPT_NODE_22426 ]
peft-fine-tuning
[ SKILL_DOCUMENTATION ]
# PEFT (参数高效微调)
通过使用 LoRA、QLoRA 和 25 种以上的适配器方法,仅训练 <1% 的参数来微调大语言模型。
## 何时使用 PEFT
**在以下情况使用 PEFT/LoRA:**
- 在消费级 GPU(RTX 4090, A100)上微调 7B-70B 模型
- 需要训练 <1% 的参数(6MB 适配器 vs 14GB 完整模型)
- 希望通过多个特定任务适配器进行快速迭代
- 从一个基础模型部署多个微调变体
**在以下情况使用 QLoRA (PEFT + 量化):**
- 在单张 24GB GPU 上微调 70B 模型
- 显存是主要限制因素
- 可以接受相比全参数微调约 5% 的质量折损
**在以下情况使用全参数微调:**
- 训练小型模型(<1B 参数)
- 需要最高质量且有充足计算预算
- 显著的领域偏移需要更新所有权重
## 快速开始
### 安装
bash
# 基础安装
pip install peft
# 支持量化(推荐)
pip install peft bitsandbytes
# 全栈安装
pip install peft transformers accelerate bitsandbytes datasets
### LoRA 微调(标准)
python
from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer
from peft import get_peft_model, LoraConfig, TaskType
from datasets import load_dataset
# 加载基础模型
model_name = "meta-llama/Llama-3.1-8B"
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype="auto", device_map="auto")
tokenizer = AutoTokenizer.from_pretrained(model_name)
tokenizer.pad_token = tokenizer.eos_token
# LoRA 配置
lora_config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
r=16, # 秩 (8-64, 更高 = 容量更大)
lora_alpha=32, # 缩放因子 (通常为 2*r)
lora_dropout=0.05, # 正则化丢弃率
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"], # 注意力层
bias="none" # 不训练偏置
)
# 应用 LoRA
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# 输出: trainable params: 13,631,488 || all params: 8,043,307,008 || trainable%: 0.17%
# 准备数据集
dataset = load_dataset("databricks/databricks-dolly-15k", split="train")
def tokenize(example):
text = f"### Instruction:n{example['instruction']}nn### Response:n{example['response']}"
return tokenizer(text, truncation=True, max_length=512, padding="max_length")
tokenized = dataset.map(tokenize, remove_columns=dataset.column_names)
# 训练
training_args = Traini