共计 1796 个字符,预计需要花费 5 分钟才能阅读完成。
背景痛点:新手常犯的微调错误
刚接触模型微调时,最容易在参数设置上踩坑。以下是几个典型问题:

- 学习率选择不当 :过大导致震荡不收敛,过小则训练缓慢。很多新手直接照搬论文中的学习率,但忽略了数据规模和硬件差异
- batch size 不合理 :盲目追求大 batch 导致显存溢出,或太小影响训练效率
- 优化器选择单一 :过度依赖 Adam 优化器,不了解不同任务场景下的优化器特性
- 忽略学习率调度 :全程固定学习率,错过模型收敛后期的精细调参机会
技术对比:主流优化器性能实测
在 AutoDL 的 RTX 3090 环境(CUDA 11.1)下测试 ResNet18 在 CIFAR-10 的表现:
| 优化器 | 最终准确率 | 训练时间 | 显存占用 |
|---|---|---|---|
| SGD | 92.3% | 45min | 5.2GB |
| Adam | 93.1% | 38min | 6.8GB |
| AdamW | 93.4% | 40min | 6.9GB |
关键发现:
- Adam 系列收敛更快但显存消耗更大
- AdamW 在小数据集表现更稳定
- SGD 配合适当学习率调度仍具竞争力
核心实现:PyTorch 微调完整示例
基础代码结构
# 数据加载
train_loader = DataLoader(datasets.CIFAR10(..., transform=train_transform),
batch_size=256, shuffle=True
)
# 模型定义
model = resnet18(pretrained=True)
model.fc = nn.Linear(512, 10) # 替换最后一层
# 优化器配置
optimizer = AdamW(model.parameters(), lr=2e-4, weight_decay=0.01)
学习率调度实现
# 余弦退火 +warmup
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=100, eta_min=1e-6)
warmup = torch.optim.lr_scheduler.LinearLR(optimizer, start_factor=0.01, total_iters=5)
combined_scheduler = torch.optim.lr_scheduler.SequentialLR(optimizer, [warmup, scheduler], milestones=[5]
)
性能优化实战技巧
GPU 资源配置建议
| GPU 型号 | 推荐 batch size | 混合精度收益 |
|---|---|---|
| RTX 3090 | 256-512 | 约 40% 提速 |
| A100 40GB | 1024-2048 | 约 30% 提速 |
启用混合精度训练:
scaler = torch.cuda.amp.GradScaler()
with torch.amp.autocast(device_type='cuda'):
outputs = model(inputs)
loss = criterion(outputs, targets)
scaler.scale(loss).backward()
scaler.step(optimizer)
scaler.update()
避坑指南
OOM 错误解决方案
- 梯度累积:每 4 个 batch 更新一次参数
if (i+1) % 4 == 0: optimizer.step() optimizer.zero_grad() - 减少验证集 batch size
- 使用 –gradient-checkpointing
Checkpoint 最佳实践
- 每 10 个 epoch 保存一次完整模型
- 每 epoch 保存最优模型权重
torch.save({ 'epoch': epoch, 'state_dict': model.state_dict(), 'optimizer': optimizer.state_dict(),}, f'checkpoint_{epoch}.pth')
实践任务:CIFAR-10 调参挑战
- 基础任务:
- 使用 AdamW 优化器完成基础训练
-
记录最终测试准确率
-
进阶挑战:
- 尝试 SGD+ 余弦退火组合
- 对比有无 warmup 的训练曲线差异
-
在 RTX 3090 上测试最大稳定 batch size
-
提交要求:
- 训练日志截图
- 验证集准确率变化曲线
- 显存占用情况记录
写在最后
经过两周的 AutoDL 平台实测,发现几个有趣现象:当学习率设为 3e- 4 时,AdamW 在 CIFAR-10 上的表现总是比默认 2e- 4 高出约 0.8 个百分点;而梯度累积次数超过 8 次后,训练时间开始呈指数增长。建议大家在正式训练前,先用小规模数据跑几个快速实验确定参数范围。
正文完
