大模型微调实战:ChatGLM-6B 微调经验与开源项目汇总
本文总结了作者在 ChatGLM-6B 模型微调的经验,并汇总了目前开源项目及数据。在大型语言模型(LLM)迅速发展的背景下,如何高效地对模型进行领域适配成为关键问题。笔者通过实践对比了多种微调方法,发现采用单指令进行模型微调时,模型并未出现灾难性遗忘现象。本文旨在分享技术细节、实验结果及资源汇总,供开发者参考。
写在前面
大型语言模型正在改变开发模式,从最初的焦虑到全面拥抱,开源社区提供了丰富的微调工具。笔者进行了多轮 ChatGLM-6B 模型的微调实践,重点对比了不同参数高效微调(PEFT)方案的效果。本次实践的核心结论是:在特定任务下,合理选择微调策略可以在保持模型原有能力的同时,显著提升下游任务表现。
项目地址:https://github.com/liucongg/ChatGLM-Finetuning
ChatGLM-6B 模型微调概述
模型参数量越大,对显存和算力的要求越高。目前主流的大模型微调方法主要分为三类:Freeze 方法、P-Tuning 方法和 LoRA 方法。为了验证这些方法的有效性,笔者在信息抽取任务上对 ChatGLM-6B 进行了微调。为了防止数据泄露,采用了领域比赛数据集——汽车工业故障模式关系抽取(https://www.datafountain.cn/competitions/584),随机抽取 50 条作为测试集。
详细代码见上述 GitHub 链接,该仓库已被 ChatGLM 官方收录。
Freeze 方法
Freeze 方法即参数冻结。其核心思想是对原始模型的大部分参数进行冻结操作,仅训练部分参数(通常是最后几层或特定模块)。这种方法的优势在于显存占用低,可以在单卡或不进行张量并行(TP)或流水线并行(PP)的情况下对大模型进行训练。
微调代码见 finetuning_freeze.py,核心逻辑如下:
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、prompt_text 等,用户可根据自己的任务场景灵活配置。
启动命令示例:
CUDA_VISIBLE_DEVICES=0 deepspeed finetuning_freeze.py --num_train_epochs 5 --train_batch_size 2
三元组抽取的推理代码见 predict_freeze.py,其他任务的评价标准可根据实际需求进行修改。


