大模型微调与精调实施方案及代码实例
一、核心概念区分
- 微调 (Fine-tuning):在预训练模型基础上,用领域数据调整所有权重
- 精调 (Precise-tuning):参数高效微调技术,冻结大部分权重,仅训练少量参数
- 常用方法:LoRA、Adapter、Prefix-tuning
二、实施路径
三、代码实例(基于Hugging Face生态)
方案1:全参数微调(文本分类任务)
from transformers import BertTokenizer, BertForSequenceClassification, TrainingArguments, Trainer
from datasets import load_dataset
# 加载数据
dataset = load_dataset('imdb')
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
def tokenize_fn(examples):
return tokenizer(examples['text'], padding='max_length', truncation=True)
dataset = dataset.map(tokenize_fn, batched=True)
# 配置模型
model = BertForSequenceClassification.from_pretrained(
'bert-base-uncased',
num_labels=2,
output_attentions=False,
output_hidden_states=False
)
# 训练参数
training_args = TrainingArguments(
output_dir='./results',
num_train_epochs=3,
per_device_train_batch_size=8,
evaluation_strategy='epoch',
save_strategy='epoch',
learning_rate=2e-5,
weight_decay=0.01,
fp16=True # GPU加速
)
# 训练器
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset['train'],
eval_dataset=dataset['test']
)
# 开始训练
trainer.train()
方案2:LoRA精调(生成任务)
from peft import LoraConfig, get_peft_model
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
# 4-bit量化配置
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16
)
# 加载模型
model = AutoModelForCausalLM.from_pretrained(
"bigscience/bloom-1b7",
quantization_config=bnb_config,
device_map="auto"
)
# LoRA配置
peft_config = LoraConfig(
r=8, # 秩
lora_alpha=32,
target_modules=["query_key_value"],
lora_dropout=0.05,
task_type="CAUSAL_LM"
)
# 应用LoRA
model = get_peft_model(model, peft_config)
model.print_trainable_parameters() # 显示可训练参数比例
# 训练配置
training_args = TrainingArguments(
output_dir="./lora-results",
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=3e-4,
num_train_epochs=2,
fp16=True,
optim="paged_adamw_8bit" # 8-bit优化器
)
# 使用SFTTrainer(需安装trl库)
from trl import SFTTrainer
trainer = SFTTrainer(
model=model,
args=training_args,
train_dataset=dataset,
dataset_text_field="text",
max_seq_length=512
)
trainer.train()
四、关键技术对比
方法 | 参数量 | GPU显存 | 训练速度 | 适用场景 |
---|---|---|---|---|
全参数微调 | 100% | 极高 | 慢 | 数据充足/算力充足 |
LoRA | 0.1-1% | 低 | 快 | 资源受限/快速迭代 |
QLoRA | 0.1% | 极低 | 中等 | 超大模型(>70B) |
Adapter | 3-5% | 中等 | 中等 | 多任务学习 |
五、优化策略
-
数据优化:
# 动态填充(提升30%训练速度) tokenizer = AutoTokenizer.from_pretrained(model_name, padding_side='left') tokenizer.pad_token = tokenizer.eos_token
-
混合精度训练:
training_args = TrainingArguments(fp16=True, bf16=False) # NVIDIA GPU training_args = TrainingArguments(fp16=False, bf16=True) # A100/AMD GPU
-
梯度检查点(显存换速度):
model.gradient_checkpointing_enable()
六、部署方案
七、常见问题解决
-
显存不足:
- 启用梯度累积:
gradient_accumulation_steps=4
- 使用QLoRA:4-bit量化 + LoRA
model = get_peft_model(model, LoraConfig(..., use_dora=True)) # DoRA增强
- 启用梯度累积:
-
灾难性遗忘:
- 保留5%的原始预训练数据
- 添加KL散度正则项:
loss = task_loss + 0.2 * kl_div(original_logits, new_logits)
-
过拟合:
training_args = TrainingArguments( lr_scheduler_type='cosine', warmup_ratio=0.1, weight_decay=0.01 # L2正则化 )
最新趋势:2023年后主流方案QLoRA(4-bit量化 + LoRA)在保持95%性能的同时,使7B模型可在24GB消费级GPU运行,13B模型在40GB专业卡运行