大模型 LLM 微调经验与总结
前言
随着大型语言模型(LLM)技术的快速发展,开源社区涌现了大量优秀的微调项目。本文基于 ChatGLM-6B 模型的微调实践,分享 Freeze、P-Tuning 和 LoRA 三种主流方法的实战经验,并汇总了相关的开源资源。实验表明,在特定任务下采用单指令微调,模型并未出现明显的灾难性遗忘现象。
项目代码地址:https://github.com/liucongg/ChatGLM-Finetuning
ChatGLM-6B 模型微调方法
模型参数量越大,对显存的要求越高。目前主流的轻量化微调方法包括 Freeze(参数冻结)、P-Tuning(软提示)和 LoRA(低秩适配)。以下以信息抽取任务为例,介绍这三种方法的具体实现。
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 进行加速训练。主要参数包括训练路径、模型目录、训练轮数、批次大小、梯度累积步数等。
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 方法,通过在 Embedding 层或每一层前添加可训练的连续向量来引导模型。
版本区别:
- 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)
for name, param model.named_parameters():
(nd name nd []):
param.requires_grad =


