LLM Fine-tuning 大模型微调

让通用大模型学习特定领域知识的核心技术

模型训练 高效微调 必备技能

📖 定义

Fine-tuning(微调)是指在预训练大模型的基础上,使用特定领域的数据进行进一步训练,使模型能够:

  • 📚 学习特定知识 - 掌握特定领域的专业术语和概念
  • 🎯 优化输出格式 - 按指定格式生成回答
  • 💬 改善对话风格 - 适配特定的人设或语气
  • 提升任务表现 - 在特定任务上获得更好的效果
vs RAG:微调是"让模型本身学会知识",RAG是"让模型能查到知识"。两者可以结合使用。

📊 微调 vs 预训练 vs RAG

对比项 预训练 Fine-tuning RAG
数据需求 TB级海量数据 千条~万条高质量数据 文档/知识库
计算成本 极高(百万美元) 中等(数百~数千美元)
知识更新 需重新训练 需重新训练 直接更新文档
适用场景 从零构建基础模型 特定任务/风格优化 知识密集型问答

🛠️ 主流微调技术

1. LoRA (Low-Rank Adaptation)

通过在模型的注意力权重矩阵旁边添加低秩矩阵来实现微调,训练参数减少90%+

核心思想:冻结原模型,训练少量参数

2. QLoRA (Quantized LoRA)

结合4-bit量化+LoRA,可在单张消费级GPU上微调65B参数模型

优势:显存需求大幅降低

3. RLHF (Reinforcement Learning from Human Feedback)

使用人类反馈的强化学习,让模型学习人类偏好的回答

代表:InstructGPT, ChatGPT

4. P-tuning / Prompt-tuning

仅微调"虚拟token"嵌入,不改变模型参数

优势:参数量极小

5. Full Fine-tuning

微调模型全部参数,效果最好但资源消耗最大

适用:有充足GPU资源

💻 代码示例

使用 PEFT (LoRA) 微调 LLaMA

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model, TaskType
import torch

# 1. 加载基础模型
model_name = "meta-llama/Llama-2-7b-hf"
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.float16,
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)

# 2. 配置LoRA
lora_config = LoraConfig(
    r=8,                    # LoRA rank
    lora_alpha=16,           # LoRA scaling
    target_modules=["q_proj", "v_proj"],  # 目标模块
    lora_dropout=0.05,
    bias="none",
    task_type=TaskType.CAUSAL_LM
)

# 3. 应用LoRA
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
# 输出: trainable params: 4,194,304 || all params: 6,742,609,920 || trainable%: 0.06%

# 4. 训练
from transformers import Trainer, TrainingArguments

training_args = TrainingArguments(
    output_dir="./lora-llama",
    num_train_epochs=3,
    per_device_train_batch_size=4,
    gradient_accumulation_steps=4,
    learning_rate=2e-4,
    fp16=True,
    save_strategy="epoch",
    save_total_limit=3,
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    tokenizer=tokenizer,
)

trainer.train()

# 5. 保存
model.save_pretrained("./lora-llama-adapter")

使用 QLoRA 微调

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model
from bitsandbytes import BitsAndBytesConfig
import torch

# 1. 4-bit量化配置
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.float16,
    bnb_4bit_use_double_quant=True,
)

# 2. 加载量化模型
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    quantization_config=bnb_config,
    device_map="auto",
)

# 3. 后续步骤与LoRA相同...
lora_config = LoraConfig(r=16, lora_alpha=32, target_modules=["q_proj", "v_proj"])
model = get_peft_model(model, lora_config)

📋 微调步骤全流程

1

数据准备

收集/构建高质量训练数据,格式化为Instruction数据集

2

数据格式化

转换为模型适用的格式 (如Alpaca格式)

3

模型选择

选择合适的基础模型 (LLaMA, Qwen, ChatGLM等)

4

配置微调

设置超参数、LoRA配置等

5

训练执行

开始训练,监控loss曲线

6

模型评估

使用测试集评估模型效果

7

模型部署

合并Adapter并导出,部署推理服务

🛠️ 常用工具

PEFT HuggingFace高效微调库
DeepSpeed 微软分布式训练框架
Unsloth 加速微调工具 (2x更快)
Axolotl 一键微调工具
MLX Apple芯片微调框架
Fireworks.ai 托管微调服务

⚠️ 常见问题

Q: 微调需要多少数据?

A: 通常100-1000条高质量数据即可见效果,数据质量比数量更重要

Q: 会丢失原有能力吗?

A: 可能发生"灾难性遗忘",可用混合训练或RAG缓解

Q: 如何选择LoRA的rank?

A: 常用8-64,越大越接近全参数微调效果,但也需要更多显存