ChatGLM-Efficient-Tuning
基于 PEFT 技术的高效 ChatGLM 微调框架,支持 LoRA/QLoRA/全量微调,提供 S
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
基于 PEFT 技术的高效 ChatGLM 微调框架,支持 LoRA/QLoRA/全量微调,提供 S
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
2023年初,当 ChatGLM-6B 以开源姿态引爆中文 AI 社区时,一个甜蜜的烦恼随之而来:模型效果不够好,但微调一次的成本令人望而却步。6B 参数的模型全量微调,意味着你需要一块显存充裕的 GPU,以及漫长的等待。
hiyouga(杨浩)正是在这个背景下启动了 ChatGLM-Efficient-Tuning 项目。他给出的解题思路很朴素:与其花大钱全量微调,不如用 PEFT(参数高效微调)技术,只更新模型中极少数的关键参数,却能达到接近全量微调的效果。 这个项目在 GitHub 上迅速积累超过 3700 颗星,成为 ChatGLM 生态中最受欢迎的工具之一。
值得注意的是,项目已于 2023 年 10 月被作者归档为只读状态,但代码依然具有参考价值,其设计理念和技术路线在今天的 LoRA/QLoRA 实践中依然广泛沿用。
ChatGLM-Efficient-Tuning 提供了完整的人类反馈强化学习(RLHF)训练管线,分为三个递进阶段:
第一阶段:监督微调(SFT)
这是整个流程的起点。团队使用alpaca_gpt4_zh、oaast_sft_zh 等中文指令数据集,通过 LoRA 或 QLoRA 方式对 ChatGLM-6B 进行指令微调。训练脚本 train_sft.sh 展示了标准配置:per_device_train_batch_size=4,learning_rate=5e-5,num_train_epochs=3.0,配合 gradient_accumulation_steps=4 来模拟更大批次。启用 fp16 混合精度进一步降低显存占用。
SFT 的核心价值在于让模型"学会按照指令行事"——原始 ChatGLM-6B 是通用语言模型,SFT 之后才真正成为"听话"的指令执行者。
第二阶段:奖励模型训练(RM)
RM 阶段使用成对比较数据(comparison_gpt4_data_zh),训练一个奖励模型来学习"什么是更好的回答"。该奖励模型在后续 PPO 阶段提供强化学习信号。项目中内置了多个 RM 数据集,包括 Belle_MultiTurn 和 hh_rlhf_en 等,涵盖多轮对话和安全性场景。
第三阶段:PPO 强化学习
有了 RM 的奖励信号,PPO(Proximal Policy Optimization)阶段让 SFT 模型进一步优化输出质量,使其生成的回复既符合指令又具有更高的"reward"。整个 RLHF 链路从数据准备到训练脚本均有完整实现,开发者无需自行搭建。
项目的核心价值在于封装了多种 PEFT 技术,并统一了接口层。glmtuner/tuner/ 模块中可以看到:
代码库通过 finetuning_type 参数统一切换这些模式,在 glmtuner/tuner/ 的 core/sft.py、core/rm.py、core/ppo.py 中实现了对应的训练逻辑。这种设计让开发者在不修改训练代码的情况下实验不同的 PEFT 方法。
训练完成后,export_model.py 提供了模型导出功能,将 LoRA 权重合并回基础模型,输出一个可直接加载的完整模型文件。这解决了"LoRA 权重不能独立推理"的问题——合并后的模型无需额外的 adapter 配置,直接用 standard transformers 接口加载。
推理阶段,项目提供了三种界面:
此外,项目还开发了 train_web.py,提供在浏览器中直接进行训练的 Web 界面——用户上传数据、配置参数、启动训练,全部在浏览器内完成,进一步降低了使用门槛。
从 requirements.txt 可以看出项目选择依赖版本时的谨慎态度:
值得注意的是,项目锁定了 pydantic==1.10.11 和 fastapi==0.95.1,这两个版本较旧,可能是为了避免依赖冲突的保守选择。
data/ 目录下汇集了丰富的中英文微调数据集:
| 数据集 | 语言 | 规模 | 特点 |
|---|---|---|---|
| alpaca_data_zh_51k.json | 中文 | 51k | Stanford Alpaca 中文翻译版 |
| alpaca_gpt4_data_zh.json | 中文 | GPT-4标注 | 使用 GPT-4 重新标注的指令数据 |
| hh_rlhf_en | 英文 | RLHF | 用于奖励模型训练 |
| oaast_sft_zh / oaast_rm_zh | 中文 | RLHF | 蚂蚁开源的 RLHF 数据 |
| sharegpt_zh_27k.json | 中文 | 多轮 | ShareGPT 中文版对话数据 |
数据集的多样性(英文/中文、单轮/多轮、SFT/RM)使得项目不仅仅适用于 ChatGLM,也能为其他中文 LLM 的微调提供参考。
项目已归档:作者于 2023 年 10 月将仓库设为只读,后续更新停止。这意味着项目基于的 ChatGLM-6B 版本较旧,后续的 ChatGLM3/ChatGLM4 模型需要寻找其他工具。
无容器化支持:项目缺少 Dockerfile 和 docker-compose,无法实现一键部署。在团队协作或生产环境部署时,需要手动配置 Python 环境和依赖。
GPU 门槛:尽管使用 QLoRA 大幅降低了显存需求,但 >= 7GB 的显存要求(QLoRA 模式)仍限制了其在低显存设备上的使用。CPU 推理理论上可行,但速度极慢。
对今天的借鉴意义:尽管项目已归档,其架构设计和代码组织方式(模块化 tuner、统一的 PEFT 接口、完整 RLHF 链路)对今天依然有很高的参考价值。LoRA、QLoRA、RLHF 这些核心概念和技术已在开源社区广泛普及,hiyouga 的工作为这一波中文 LLM 微调工具链的成熟奠定了基础。