大模型 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. 下一步