基于 LLaMA-Factory 微调 ChatGLM3 模型实战
使用 LLaMA-Factory 框架对 ChatGLM3 模型进行微调的完整流程。内容涵盖 Conda 环境搭建、项目依赖安装、Web 界面参数配置、训练命令解析、自定义数据集格式规范及模型合并导出步骤。同时提供了显存优化策略、Loss 异常排查及 Tokenizer 加载错误等常见问题的解决方案,旨在帮助开发者高效实现垂直领域模型的定制化训练与部署。

使用 LLaMA-Factory 框架对 ChatGLM3 模型进行微调的完整流程。内容涵盖 Conda 环境搭建、项目依赖安装、Web 界面参数配置、训练命令解析、自定义数据集格式规范及模型合并导出步骤。同时提供了显存优化策略、Loss 异常排查及 Tokenizer 加载错误等常见问题的解决方案,旨在帮助开发者高效实现垂直领域模型的定制化训练与部署。

本文详细介绍如何使用 LLaMA-Factory 框架对智谱 AI 的 ChatGLM3 模型进行监督微调(SFT),包括环境配置、Web 界面操作、命令行参数详解、自定义数据集准备及常见问题处理。
建议使用 Conda 创建独立的 Python 环境,避免依赖冲突。
conda create -n chatglm3 python=3.10 -y
conda activate chatglm3
注意:ChatGLM3 推荐在 Python 3.10 环境下运行,CUDA 版本需与显卡驱动匹配。
从 GitHub 获取最新代码:
git clone https://github.com/hiyouga/LLaMA-Factory.git
cd LLaMA-Factory
根据系统环境安装必要的库。推荐使用 requirements.txt 快速安装:
pip install -r requirements.txt
若遇到特定包版本冲突,可尝试指定版本安装,例如:
pip install transformers==4.37.0
pip install peft==0.8.0
使用以下命令启动训练管理界面:
CUDA_VISIBLE_DEVICES=0 python src/train_web.py
启动成功后,浏览器访问 http://localhost:7860 即可看到控制面板。

在 Web 界面中,选择 ChatGLM3 作为基座模型,并配置以下关键参数:
sft (Supervised Fine-Tuning)。lora,显存占用更低且训练速度快。
点击'预览命令'可查看底层执行的 Python 脚本,便于调试和复现。
CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \
--stage sft \
--do_train \
--model_name_or_path /root/LLaMA-Factory-main/chatglm3 \
--dataset alpaca_gpt4_zh \
--template default \
--finetuning_type lora \
--lora_target q_proj,v_proj \
--output_dir path_to_sft_checkpoint \
--overwrite_cache \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 4 \
--lr_scheduler_type cosine \
--logging_steps 10 \
--save_steps 1000 \
--learning_rate 5e-5 \
--num_train_epochs 3.0 \
--plot_loss \
--fp16
--model_name_or_path: 基座模型目录。--lora_target: LoRA 适配层目标,ChatGLM3 通常包含 q_proj, v_proj 等。--per_device_train_batch_size: 单卡批次大小,显存不足时可调小。--gradient_accumulation_steps: 梯度累积步数,用于模拟大 Batch Size。--fp16: 启用半精度训练以节省显存。训练过程中,Web 页面和后台终端会同步显示 Loss 曲线及日志信息。

微调完成后,可在 Web 界面进入'推理'模块进行测试。

输入微调数据中的问题,观察模型回答是否贴合预期。如果回答质量显著提升,说明微调成功。
LoRA 权重通常需要与基座模型合并才能独立部署。
在 Web 界面选择'模型合并',设置输出路径。执行完成后,合并后的模型将保存在指定目录下(如 /root/LLaMA-Factory-main/merge)。

合并后的模型可直接通过官方 HuggingFace 加载方式调用,无需额外适配器。
合并后,可使用原始 ChatGLM3 的推理脚本加载新模型,验证效果。
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained("/path/to/merged_model", trust_remote_code=True)
model = AutoModel.from_pretrained("/path/to/merged_model", trust_remote_code=True)
response, history = model.chat(tokenizer, "你好", history=[])
print(response)
若需使用自有数据,需遵循 LLaMA-Factory 支持的格式。目前主要支持 Alpaca 和 ShareGPT 格式。
Alpaca 格式示例:
[
{
"instruction": "用户指令(必填)",
"input": "用户输入(选填)",
"output": "模型回答(必填)",
"system": "系统提示词(选填)",
"history": [
["第一轮指令", "第一轮回答"],
["第二轮指令", "第二轮回答"]
]
}
]
将整理好的 JSON 文件上传至 data 目录下。
修改 data/dataset_info.json 文件,添加新数据集的配置信息:
{
"chatglm3_custom": {
"file_name": "chatglm3_train.json",
"columns": {
"prompt": "instruction",
"query": "input",
"response": "output",
"system": "system",
"history": "history"
}
}
}
确保 columns 映射关系与你的 JSON 字段一致。保存后即可在 Web 界面选择该数据集进行训练。
报错信息:
AttributeError: property 'eos_token' of 'ChatGLMTokenizer' object has no setter
解决方法:
ChatGLM3 的 Tokenizer 较为特殊。请确保将源模型文件夹中除了 .bin 和 .index.json 以外的所有文件(如 config.json, tokenizer.json 等)复制到导出目录中覆盖原有文件。
若训练时 OOM(Out Of Memory),可尝试以下优化:
--per_device_train_batch_size 至 1 或 2。--gradient_accumulation_steps 保持总 Batch Size。--bf16 替代 --fp16(需 Ampere 架构以上显卡)。--flash_attn 启用 Flash Attention 加速。检查以下几点:
1e-5 或 5e-6。--template 参数与模型类型匹配(ChatGLM3 通常用 default 或 glm3)。通过 LLaMA-Factory,用户可以低门槛地完成 ChatGLM3 的微调工作。结合 Web 界面与命令行工具,既能快速验证效果,又能灵活调整参数。对于企业级应用,建议完成微调后进行多轮对话测试及自动化评估,确保模型在实际场景中的表现符合预期。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 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