大语言模型微调中的模型冻结策略踩坑记录
最近在做LLM微调项目时,尝试了不同的模型冻结策略,踩了不少坑,分享一下经验。
背景
我们目标是微调一个7B参数的LLM,在有限资源下进行领域适应。最初采用全量微调,但显存占用过高(超过80GB),无法在单卡上运行。
冻结策略尝试
策略1:完全冻结除输出层外的所有层
# 伪代码示例
for name, param in model.named_parameters():
if 'output_layer' not in name:
param.requires_grad = False
结果:训练效果不佳,模型几乎没有学习到新任务特征。
策略2:冻结底层层,微调中层和输出层
# 冻结前10层
for i, layer in enumerate(model.layers):
if i < 10:
for param in layer.parameters():
param.requires_grad = False
结果:显存降低到40GB,但学习效果仍然不理想。
策略3:分阶段冻结(推荐)
- 第一阶段:冻结所有层
- 第二阶段:逐层解冻,每层训练10个epoch
- 第三阶段:微调所有层
实践建议
- 使用
torch.cuda.memory_summary()监控显存使用 - 采用梯度裁剪防止梯度爆炸
- 考虑使用LoRA等参数高效微调方法
显而易见,简单的冻结策略并不能解决所有问题,需要结合具体任务和资源进行调优。

讨论