共计 1799 个字符,预计需要花费 5 分钟才能阅读完成。
背景与痛点
大模型微调是让通用 AI 适应特定任务的关键步骤,但新手常遇到三大难题:

- 数据困境 :标注数据不足时,模型容易过拟合;数据质量差会导致微调后性能下降
- 资源焦虑 :显存不足导致 batch_size 只能设为 1,训练效率低下
- 超参数迷茫 :学习率设置不当会让模型无法收敛,或收敛到次优解
技术选型对比
全参数微调(Full Fine-tuning)
- 优点:理论上能达到最佳性能
- 缺点:需要存储每个任务的完整模型副本,显存占用高
LoRA(低秩适应)
- 优点:仅训练少量新增参数,节省 70% 显存
- 缺点:需要手动设置 rank 参数,影响模型容量
Adapter
- 优点:模块化设计方便多任务切换
- 缺点:引入额外推理延迟
核心实现流程
数据预处理
- 统一文本编码格式(推荐 UTF-8)
- 构建标签映射字典
- 实现动态 padding 避免内存浪费
模型加载技巧
from transformers import AutoModelForSequenceClassification
# 推荐加载方式
model = AutoModel.from_pretrained('bert-base-uncased',
torch_dtype=torch.float16, # 半精度节省显存
device_map='auto') # 自动分配多 GPU
训练配置
- 优化器选择:AdamW 优于原始 Adam
- 学习率设置:预训练层用 1e-5,新增层用 1e-4
- 梯度裁剪:阈值设为 1.0 防止梯度爆炸
完整代码示例
# 数据加载器实现
class CustomDataset(Dataset):
def __init__(self, texts, labels, tokenizer):
self.encodings = tokenizer(texts, truncation=True, padding=True)
self.labels = labels
def __getitem__(self, idx):
return {'input_ids': torch.tensor(self.encodings['input_ids'][idx]),
'attention_mask': torch.tensor(self.encodings['attention_mask'][idx]),
'labels': torch.tensor(self.labels[idx])
}
# 训练循环核心代码
def train_epoch(model, dataloader, optimizer):
model.train()
total_loss = 0
for batch in dataloader:
optimizer.zero_grad()
outputs = model(**batch)
loss = outputs.loss
loss.backward()
torch.nn.utils.clip_grad_norm_(model.parameters(), 1.0)
optimizer.step()
total_loss += loss.item()
return total_loss / len(dataloader)
性能优化技巧
批量大小调优
- 测试不同 batch_size 下的 GPU 利用率(nvidia-smi 命令)
- 当 OOM 时尝试梯度累积:
# 每 4 个 batch 更新一次参数 optimizer.step() optimizer.zero_grad()
学习率调度
推荐使用余弦退火:
from torch.optim.lr_scheduler import CosineAnnealingLR
scheduler = CosineAnnealingLR(optimizer, T_max=100)
常见避坑指南
- Loss 震荡不收敛 :检查数据 shuffle 是否生效
- 验证集性能下降 :早停机制(patience=3)
- GPU 利用率低 :增大 dataloader 的 num_workers(建议设为 CPU 核心数 -2)
进阶方向
- 混合精度训练(AMP)可提升 30% 训练速度
- 参数高效微调(PEFT)库简化 LoRA 实现
- 知识蒸馏压缩微调后模型
实践心得
经过多个项目的验证,发现医疗文本分类任务中:
– LoRA 的 rank 设为 8 时效果接近全参数微调的 95%
– 领域适配预训练(DAPT)能进一步提升 3 - 5 个点
– 标签平滑(label smoothing)对不平衡数据特别有效
建议从小数据集开始实验,逐步增加数据量观察性能变化曲线。记得定期保存 checkpoint,意外中断时可从最近进度恢复训练。
正文完
