InstructGLM 微调教程:基于Alpaca 52k英文指令数据的LoRA微调全流程
【免费下载链接】InstructGLMChatGLM-6B 指令学习|指令数据|Instruct项目地址: https://gitcode.com/gh_mirrors/ins/InstructGLM
InstructGLM 微调教程来了!这是一篇面向新手的完整指南,手把手带你使用开源的 InstructGLM 项目,基于斯坦福 Alpaca 52k 英文指令数据,对 ChatGLM-6B 大模型进行 LoRA 微调。InstructGLM 是一个 ChatGLM-6B 指令学习(Instruction Tuning)开源项目,通过低秩适配(LoRA)技术,把原本需要多卡集群才能完成的大模型微调,压缩到单卡也能轻松运行的规模。本教程将带你走完「数据预处理 → Tokenize → 模型训练 → 推理验证」的完整 LoRA 微调全流程,帮你快速上手。
本文所有脚本均来自 InstructGLM 项目,克隆仓库后即可直接使用:
git clone https://gitcode.com/gh_mirrors/ins/InstructGLM
什么是 InstructGLM:ChatGLM-6B 指令微调入门
InstructGLM 是一个基于 ChatGLM-6B + LoRA 的指令微调开源项目。指令微调的核心目标,是让大模型学会「听懂指令、按格式作答」,而 InstructGLM 借助斯坦福 Alpaca 52k 英文指令数据、BELLE 中文指令数据等开源数据集,让 ChatGLM-6B 具备更强的指令遵循能力。
LoRA(Low-Rank Adaptation,低秩适配)是一种参数高效的微调方法:冻结原始模型参数,只训练少量低秩矩阵。它的优势非常明显——显存占用小、训练速度快,训练完成后只需保存一个小体积的权重文件,例如本项目产出的 output/alpaca/chatglm-lora.pt。
为什么选择 Alpaca 52k 英文指令数据进行微调
Alpaca 52k 数据集是斯坦福大学发布的英文指令数据集,包含 52,000 条由 text-davinci-003 生成的独特指令,每条数据由三个字段组成:
| 字段 | 含义 | 示例 |
|---|---|---|
| instruction | 指令 | Evaluate this sentence for spelling and grammar mistakes |
| input | 可选输入 | He finnished his meal and left the resturant |
| output | 标准答案 | He finished his meal and left the restaurant. |
这套数据覆盖面极广,包含写作、推理、分类、翻译等多种任务类型,非常适合用来验证 ChatGLM-6B 的 LoRA 微调效果,也是初学者入门的首选指令数据集。
InstructGLM 微调环境准备:软硬件配置方法
官方实验环境为 2 张 A100 80G 显卡,但对普通玩家来说,LoRA + 8bit 量化加载(load_in_8bit=True)可以大幅降低显存门槛。环境准备只需两步:
- 安装依赖:执行
pip install -r requirements.txt(依赖清单见 requirements.txt,建议使用清华镜像源加速); - 准备模型权重:下载 ChatGLM-6B 官方权重,并按项目要求放置到指定目录。
第一步:Alpaca 数据预处理方法(json 转 jsonl)
原始 Alpaca 数据是 JSON 格式,需要先转换为统一的 jsonl 训练格式(Instruction: xxx / Input: xxx / Answer: xxx),这一步由 cover_alpaca2jsonl.py 完成:
python cover_alpaca2jsonl.py \ --data_path data/alpaca_data.json \ --save_path data/alpaca_data.jsonl第二步:指令数据 Tokenize 加速训练技巧
如果直接训练原始文本,训练过程中会反复调用分词器,非常耗时。InstructGLM 提供了 tokenize_dataset_rows.py,将全部文本一次性切分为 token 并缓存为磁盘数据集,训练速度大幅提升。序列长度可根据显存自行调整:
python tokenize_dataset_rows.py \ --jsonl_path data/alpaca_data.jsonl \ --save_path data/alpaca \ --max_seq_length 320第三步:启动 LoRA 微调训练(核心参数详解)
核心训练脚本是 train_lora.py,基于 Hugging Face Trainer + PEFT(LoRA)框架实现,关键配置如下:
| 参数 | 推荐值 | 作用说明 |
|---|---|---|
| lora_rank | 8 | LoRA 低秩矩阵维度,越大拟合能力越强 |
| per_device_train_batch_size | 2 | 单卡批大小,显存紧张时调低 |
| learning_rate | 2e-5 | 学习率 |
| max_steps | 52000 | 最大训练步数 |
| fp16 | true | 半精度训练,节省显存 |
| output_dir | output | 权重保存目录 |
启动训练:
python train_lora.py \ --dataset_path data/alpaca \ --lora_rank 8 \ --per_device_train_batch_size 2 \ --max_steps 52000 \ --learning_rate 2e-5 \ --fp16 \ --output_dir output训练完成后,LoRA 权重会保存为chatglm-lora.pt。下图是基于 Alpaca 52k 微调后的 InstructGLM 对话效果,可以看到模型已经学会了结构清晰、条理分明的指令式回答:
第四步:验证微调效果与推理部署方法
训练结束后,使用 infer.py 加载 LoRA 权重即可快速验证效果,也可以直接运行 web_demo.py 启动基于 Gradio 的流式对话界面,体验多轮问答与参数调节:
如果你对代码细节感兴趣,还可以对比「修改 modeling_chatglm 源码」与「官方 modeling_chatglm」在指令生成上的效果差异(例如生成指定数量的四字词语),直观理解 LoRA 适配对模型输出的影响:
进阶玩法:DeepSpeed 多卡微调与 BELLE 中文数据
InstructGLM 的能力不止于单卡微调:
- DeepSpeed 多卡加速:使用 train_deepspeed.py 配合 config/default_config.yaml,支持多卡 + ZeRO 方案,训练速度相比单卡可提升 8~9 倍;
- 中文指令微调:项目同样支持基于 BELLE 50 万条中文指令数据进行微调,也可以基于 Alpaca 微调好的 LoRA 权重继续训练(
--is_resume True --resume_path output/alpaca/chatglm-lora.pt),实现英文到中文的迁移学习。
InstructGLM 微调常见问题与解决技巧
- 报 gcc 版本过低:升级 gcc 到 9 以上版本即可解决(Linux 下可使用 devtoolset-9);
- 显存不足(OOM):调低
per_device_train_batch_size与max_seq_length,并保持开启fp16; - 推理效果不理想:确认已正确加载
chatglm-lora.pt权重,并在推理时按需关闭缓存(use_cache)。
总结
通过这篇 InstructGLM 微调教程,你已经掌握了基于 Alpaca 52k 英文指令数据完成 ChatGLM-6B LoRA 微调的全流程:数据预处理 → Tokenize → 模型训练 → 推理验证。LoRA 微调技术大大降低了大模型指令微调的硬件门槛,现在就用 InstructGLM 打造一个属于你自己的指令跟随模型吧!🚀
【免费下载链接】InstructGLMChatGLM-6B 指令学习|指令数据|Instruct项目地址: https://gitcode.com/gh_mirrors/ins/InstructGLM
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考