大模型 LLM 微调经验总结:ChatGLM-6B Freeze、P-Tuning 与 LoRA 方法对比
总结了 ChatGLM-6B 大模型的三种主流微调方法:Freeze、P-Tuning 和 LoRA。文章详细介绍了各方法的原理、代码实现及 DeepSpeed 配置,并通过汽车工业故障模式关系抽取任务进行了实验对比。结果显示 PT 方法效果最佳,LoRA 效率最高。同时梳理了中文开源大模型、指令数据集及热门项目资源,为大模型微调提供实践参考。

总结了 ChatGLM-6B 大模型的三种主流微调方法:Freeze、P-Tuning 和 LoRA。文章详细介绍了各方法的原理、代码实现及 DeepSpeed 配置,并通过汽车工业故障模式关系抽取任务进行了实验对比。结果显示 PT 方法效果最佳,LoRA 效率最高。同时梳理了中文开源大模型、指令数据集及热门项目资源,为大模型微调提供实践参考。

随着大型语言模型(LLM)的快速发展,对显卡显存的要求日益提高。目前主流的大模型微调方法主要包括 Freeze(参数冻结)、P-Tuning(软提示微调)和 LoRA(低秩适配)。本文基于 ChatGLM-6B 模型的微调实践,总结了三种方法的实现细节、实验结果及开源资源汇总。
大型语言模型应用广泛,许多开发者在微调过程中面临显存不足或灾难性遗忘的问题。笔者通过实际项目验证了 ChatGLM-6B 模型在不同微调策略下的表现。值得注意的是,在采用单指令进行微调时,并未观察到明显的灾难性遗忘现象,这为垂直领域模型的快速部署提供了信心。
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,其他任务可根据评价标准自行编写推理脚本。
P-Tuning 是一种针对大模型的 soft-prompt 方法,参考 ChatGLM 官方实现。它不更新模型主体参数,而是引入额外的可训练向量。
核心配置:
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 in model.named_parameters():
if not any(nd in name for nd in ["prefix_encoder"]):
param.requires_grad = False
当 prefix_projection 为 True 时,启用 P-Tuning-V2;为 False 时,使用基础 P-Tuning。
启动命令示例:
CUDA_VISIBLE_DEVICES=0 deepspeed finetuning_pt.py --num_train_epochs 5 --train_batch_size 2 --pre_seq_len 16
LoRA (Low-Rank Adaptation) 通过在大型语言模型上对指定参数增加额外的低秩矩阵,并在训练过程中仅训练新增的参数。当'秩值'远小于原始参数维度时,新增参数量很小,能以极低的计算成本获取较好的效果。
核心配置:
model = ChatGLMForConditionalGeneration.from_pretrained(args.model_dir)
config = LoraConfig(r=args.lora_r,
lora_alpha=32,
target_modules=["query_key_value"],
lora_dropout=0.1,
bias="none",
task_type="CAUSAL_LM",
inference_mode=False,
)
model = get_peft_model(model, config)
注意事项:
对于需要保持结果一致性的任务(如关掉 dropout,解码关掉 do_sample),需保存模型的 adapter_config.json 文件中,将 inference_mode 参数修改成 false,并执行 model.eval() 操作。这是因为 ChatGLM 模型代码中未采用 Conv1D 函数,推理模式设置不当可能导致输出不稳定。
| 微调方法 | PT-Only-Embedding | PT (V2) | Freeze | LoRA |
|---|---|---|---|---|
| 显卡占用 | 37G | 56G | 24G | 39G |
| 总参数 | 6.259B | 7.211B | 6.255B | 6.259B |
| 可训练参数占比 | 0.0586% | 13.26% | 16.10% | 0.0586% |
| 训练耗时 | 20min | 52min | 46min | 25min |
| 测试结果 F1 | 0.0 | 0.6283 | 0.5675 | 0.5359 |
推理 Prompt 示例:
prompt_text:你现在是一个信息抽取模型,请你帮我抽取出关系内容为"性能故障", "部件故障", "组成"和 "检测工具"的相关三元组,三元组内部用"_"连接,三元组之间用\n分割。文本:
输入:故障现象:发动机水温高,风扇始终是低速转动,高速档不工作,开空调尤其如此。
输出:发动机_部件故障_水温高
风扇_部件故障_低速转动
硬件建议:
若遇到 OOM(显存溢出),可开启 gradient_checkpointing_enable 以时间换空间。但为了达到最优效果或快速实验,建议使用 A100 等高性能算力卡。多卡并行可减少模型操作复杂度,效果更可控。
虽然市面上大模型众多,但 Open 且中文可直接使用的并不多。以下是对中文开源大模型、数据集和项目的整理。
直接可微调,无需指令增量训练:
原始模型多语言 or 英文,需要中文指令数据集增量训练:
大多数中文指令集从 Alpaca 翻译而来。利用 ChatGPT 或 GPT-4 作为廉价标注工为自己的数据进行数据标注是一个不错的思路。
通过上述方法,开发者可以在有限的资源下高效地对大模型进行垂直领域微调,构建符合业务需求的智能系统。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online