大模型 Fine-tuning
1. 常见微调方法对比
| 方法 |
全量微调 |
LoRA |
QLoRA |
| 显存占用 |
极高(全量参数) |
低(仅 adapters) |
极低(4-bit量化+LoRA) |
| 训练速度 |
慢 |
快 |
快 |
| 效果 |
最好 |
接近全量 |
略有损失 |
| 适用场景 |
大厂/长训练 |
通用场景 |
个人/小团队 |
2. 训练环境准备
# 推荐:使用 Unsloth(2-5x 加速,显存减半)
pip install unsloth
# 或使用 transformers + peft
pip install transformers peft deepspeed accelerate bitsandbytes
# 检查 GPU
nvidia-smi
# 建议:A100 40G / A6000 48G / 3090 24G
3. 数据准备
3.1 格式(Alpaca / ChatML)
[
{
"instruction": "你是一个运维助手,请回答问题",
"input": "如何查看 Kubernetes Pod 的资源使用情况?",
"output": "使用 kubectl top pod -n <namespace> 查看 CPU 和内存使用"
}
]
3.2 数据增强
import random
def augment_instruction(data, multiplier=3):
templates = [
"请{instruction}",
"作为SRE,{instruction}",
"帮个忙,{instruction}",
]
augmented = []
for item in data:
for _ in range(multiplier):
new_item = item.copy()
new_item['instruction'] = random.choice(templates).format(
instruction=item['instruction']
)
augmented.append(new_item)
return augmented
4. LoRA 微调实战
from unsloth import FastLanguageModel
import torch
# 加载模型(4bit 量化,省显存)
model, tokenizer = FastLanguageModel.from_pretrained(
model_name="unsloth/Llama-3.2-3B-Instruct",
max_seq_length=2048,
load_in_4bit=True,
)
# 添加 LoRA adapters
model = FastLanguageModel.get_peft_model(
model,
r=16,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj",
"gate_proj", "up_proj", "down_proj"],
lora_alpha=16,
lora_dropout=0.05,
bias="none",
)
# 训练
from trl import SFTTrainer
trainer = SFTTrainer(
model=model,
tokenizer=tokenizer,
train_dataset=dataset,
dataset_text_field="text",
max_seq_length=2048,
packing=True,
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
warmup_ratio=0.1,
num_train_epochs=3,
learning_rate=2e-4,
fp16=not torch.cuda.is_bf16_supported(),
bf16=torch.cuda.is_bf16_supported(),
logging_steps=10,
save_steps=100,
output_dir="outputs",
)
trainer.train()
5. 模型合并与导出
# 合并 LoRA 权重到原模型
python -m unsloth.merge_lora model_dir/
# 导出为 GGUF(量化版,适合本地部署)
python -c "from unsloth import FastLanguageModel
model, tokenizer = FastLanguageModel.from_pretrained('outputs')
model.save_pretrained_gguf('model-q4', tokenizer)"
# 导出为 HuggingFace 格式
model.save_pretrained("final_model")
tokenizer.save_pretrained("final_model")
6. 下一步