大模型 LLM 微调经验总结
导读
随着大型语言模型(LLM)的快速发展,对显卡显存的要求日益提高。目前主流的大模型微调方法主要包括 Freeze(参数冻结)、P-Tuning(软提示微调)和 LoRA(低秩适配)。本文基于 ChatGLM-6B 模型的微调实践,总结了三种方法的实现细节、实验结果及开源资源汇总。
写在前面
大型语言模型应用广泛,许多开发者在微调过程中面临显存不足或灾难性遗忘的问题。笔者通过实际项目验证了 ChatGLM-6B 模型在不同微调策略下的表现。值得注意的是,在采用单指令进行微调时,并未观察到明显的灾难性遗忘现象,这为垂直领域模型的快速部署提供了信心。
相关代码仓库:https://github.com/liucongg/ChatGLM-Finetuning
ChatGLM-6B 模型微调方案
1. Freeze 方法(参数冻结)
Freeze 方法即参数冻结技术。通过对原始模型的部分参数进行冻结操作,仅训练剩余部分参数,从而实现在单卡或不进行张量并行(TP)的情况下完成大模型训练。
核心逻辑:
for name, param in model.named_parameters():
if not any(nd in name for nd in ["layers.27", "layers.26", "layers.25", "layers.24", "layers.23"]):
param.requires_grad = False
针对模型不同层进行修改,可根据任务需求调整冻结层级。训练代码均采用 DeepSpeed 进行加速,可配置参数包括 train_path、model_dir、num_train_epochs、train_batch_size、gradient_accumulation_steps、output_dir 等。
启动命令示例:
CUDA_VISIBLE_DEVICES=0 deepspeed finetuning_freeze.py --num_train_epochs 5 --train_batch_size 2
推理代码见 predict_freeze.py,其他任务可根据评价标准自行编写推理脚本。
2. P-Tuning 方法(软提示微调)
P-Tuning 是一种针对大模型的 soft-prompt 方法,参考 ChatGLM 官方实现。它不更新模型主体参数,而是引入额外的可训练向量。
- P-Tuning: 仅对大模型的 Embedding 层加入新的参数。
- P-Tuning-V2: 将大模型的 Embedding 和每一层前都加上新的参数,效果通常优于基础版。
核心配置:
config = ChatGLMConfig.from_pretrained(args.model_dir)
config.pre_seq_len = args.pre_seq_len
config.prefix_projection = args.prefix_projection
model = ChatGLMForConditionalGeneration.from_pretrained(args.model_dir, config=config)
name, param model.named_parameters():
(nd name nd []):
param.requires_grad =


