Skip to content

KerroKapple/Pture_ChatGLM

Repository files navigation

ChatGLM-6B 指令微调(LoRA / QLoRA / P-Tuning v2)

对 ChatGLM-6B 做指令微调,完成中文 SPO 三元组抽取。手写训练循环,支持三种微调模式与真正的断点续训。

📁 项目结构

Pture_ChatGLM/
├── data/                      # 数据目录
│   ├── mixed_train_dataset.jsonl
│   └── mixed_dev_dataset.jsonl
├── data_handle/               # 数据处理模块
│   ├── data_loader.py         # DataLoader 构建
│   └── data_preprocess.py     # 分词、label mask(prompt 段填 -100)
├── utils/
│   └── common_utils.py        # 检查点、模型保存、merge 导出、RNG 工具
├── docs/
│   └── 微调复习笔记.md         # 微调知识复习文档
├── glm_config.py              # 配置
├── train.py                   # 训练入口
├── merge_lora.py              # LoRA 合并导出(部署用)
├── inference.py               # 推理
└── requirements.txt

🚀 使用方法

1. 安装依赖

uv add -r requirements.txt

2. 配置模型与数据路径

修改 glm_config.py,或使用环境变量:

export CHATGLM_MODEL_PATH=/path/to/chatglm-6b
export TRAIN_DATA_PATH=/path/to/train.jsonl
export DEV_DATA_PATH=/path/to/dev.jsonl

3. 训练(三种模式)

# LoRA(默认):fp16 底座 + LoRA adapter
uv run python train.py

# QLoRA:4bit NF4 量化底座 + 双重量化 + bf16 计算 + 分页优化器(需 bitsandbytes、Ampere+ GPU)
uv run python train.py --qlora

# P-Tuning v2:每层拼接可训练 prefix
uv run python train.py --ptuning

4. 断点续训

检查点每 save_freq 步和每个 epoch 末各存一次,包含可训练权重、优化器、调度器、训练进度与随机状态,恢复后真正接着训:

uv run python train.py --resume save_model/checkpoint-200
# QLoRA 训练的检查点续训时同样带上 --qlora
uv run python train.py --qlora --resume save_model/checkpoint-200

5. 合并导出(部署)

训练中只保存 adapter,永不原地 merge。部署需要完整模型时另行导出(重载底座副本合并,不影响训练产物):

uv run python merge_lora.py --adapter save_model/model_best --output save_model/model_merged

6. 推理

自动识别目录类型:含 adapter_config.json 则按 底座+adapter 加载,否则按完整模型加载。

uv run python inference.py --model_path save_model/model_best      # adapter
uv run python inference.py --model_path save_model/model_merged    # 合并后的完整模型

📦 训练产物说明

路径 内容 用途
save_model/checkpoint-N/training_state.pt 可训练权重 + optimizer + scheduler + epoch/step + best_eval_loss + RNG 状态 断点续训
save_model/model_best/ LoRA adapter(几 MB)+ tokenizer 续训挂载 / 推理挂载
save_model/model_merged/ merge 后完整模型(约 12GB,merge_lora.py 生成) 部署,零额外推理开销

📊 显存对比(6B,单卡量级估算)

模式 底座权重 梯度+优化器状态 训练显存量级
全参微调(混合精度 AdamW) fp16 12GB 约 60GB+(梯度 12GB + Adam 状态 48GB) ≈96GB+,需多卡
LoRA(本仓默认) fp16 12GB 仅 adapter 约几十 MB ≈14~18GB
QLoRA(--qlora 4bit ≈3.5GB 仅 adapter 约几十 MB ≈6~8GB

细节推导见 docs/微调复习笔记.md 第五节。

⚙️ 配置说明

参数 默认值 说明
use_lora True LoRA 微调
use_qlora False QLoRA(命令行 --qlora 开启)
use_ptuning False P-Tuning(命令行 --ptuning 开启)
lora_rank 8 LoRA 秩
lora_alpha 32 LoRA 缩放系数(有效缩放 = alpha/r)
lora_dropout 0.1 LoRA 分支 dropout
seed 42 随机种子
batch_size 4 批次大小
epochs 2 训练轮数
learning_rate 3e-5 学习率
max_source_seq_len 100 输入最大长度
max_target_seq_len 100 输出最大长度
save_freq 200 每多少步保存检查点

📄 数据格式

JSONL,每行一个 JSON 对象:

{"context": "Instruction: ...\nInput: ...\nAnswer: ", "target": "..."}

prompt 段(context)的 label 填 -100 不计损失,只对答案段(target)计算交叉熵。

🐛 常见问题

Q: 显存不足?

  • 优先换 --qlora
  • 减小 batch_sizemax_source_seq_len / max_target_seq_len

Q: 训练中断如何恢复?

  • --resume save_model/checkpoint-N,权重/优化器/进度/随机状态全部恢复

Q: 为什么 model_best 只有几 MB?

  • 那是 adapter 权重,推理时自动挂到底座上;需要独立完整模型用 merge_lora.py 导出

📚 复习文档

微调方法全景、LoRA/QLoRA 原理、label mask、显存分析、面试题:docs/微调复习笔记.md

About

ChatGLM-6B 微调项目:支持 LoRA / P-Tuning,含断点续训、显存优化、数据加载优化与日志系统。

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors

Languages