- 人工智能
- 大模型
- 预训练
- 微调
- LoRA
- RLHF
- 强化学习
- 分布式训练
【免费下载链接】PaddleNLP
Easy-to-use and powerful LLM and SLM library with awesome model zoo.
导读
ChatGLM-6B 是智谱 AI 开源的 62 亿参数中英双语对话模型,基于 General Language Model(GLM)架构构建。本文以 docs/zh/llm/config/chatglm/README.md 为骨架,结合 PaddleNLP 仓库中 ChatGLM 的模型实现(paddlenlp/transformers/chatglm/)与完整的训练/量化配置文件(llm/config/chatglm/),深入讲解该模型在 PaddleNLP 中的架构细节、支持的权重版本、协议要求,以及 SFT 全量微调、LoRA 微调、P-Tuning v2(prefix tuning)与 PTQ/GPTQ 量化等完整实战配置。读完本文,你将能够直接基于仓库提供的 JSON 配置跑通 ChatGLM-6B 的微调与量化流程,并理解每个关键参数背后的实现原理。
1. 模型介绍:基于 GLM 架构的 62 亿参数中英双语对话模型
ChatGLM-6B 是一个开源的、支持中英双语问答的对话语言模型,基于 General Language Model (GLM) 架构设计,拥有约 62 亿参数。该模型与 ChatGLM 使用相同的核心技术,并针对中文问答和对话场景进行了专门优化。
从训练数据与训练方法来看,ChatGLM-6B 经过约 1T(一万亿)标识符的中英双语语料训练,并辅以以下三种关键技术:
- 监督微调(SFT):使用人工标注的高质量对话数据进行指令对齐;
- 反馈自助:通过模型自身生成与筛选来扩充对齐数据;
- 人类反馈强化学习(RLHF):使用人类偏好反馈进一步优化生成质量。
得益于上述技术加持,仅 62 亿参数的 ChatGLM-6B 已经能够生成相当符合人类偏好的回答。
1.1 支持的模型权重
PaddleNLP 官方支持以下两个 ChatGLM-6B 权重版本(见 docs/zh/llm/config/chatglm/README.md):
| Model |
|---|
| THUDM/chatglm-6b |
| THUDM/chatglm-6b-v1.1 |
其中THUDM/chatglm-6b-v1.1是对原始chatglm-6b的升级版本,在序列长度、对话质量等维度上有所改进。两个版本的权重下载地址均配置在 paddlenlp/transformers/chatglm/configuration.py 的CHATGLM_PRETRAINED_RESOURCE_FILES_MAP中,PaddleNLP 会自动从 BOS 对象存储下载对应的model_state.pdparams权重文件,无需手动下载。
1.2 模型协议
在使用 ChatGLM-6B 模型权重前,必须遵循其官方发布的 License 条款。该协议的完整文本位于仓库内 paddlenlp/transformers/chatglm/LICENSE,模型权重仅允许在满足该协议约束的前提下用于学术研究与商业使用,请在训练、部署前仔细阅读。
2. 仓库内模型实现:从配置类到建模代码
ChatGLM 的完整实现位于 paddlenlp/transformers/chatglm/,包含四个核心文件:
| 文件 | 职责 |
|---|---|
| configuration.py | ChatGLMConfig配置类,定义模型结构与超参数 |
| modeling.py | 模型主体:注意力、MLP、堆叠层、因果 LM 等 |
| tokenizer.py | 基于ice_text.model的分词器及特殊 token 定义 |
| LICENSE | 模型权重使用协议 |
2.1 ChatGLMConfig:核心超参数一览
ChatGLMConfig 的默认参数与 ChatGLM-6B 原始架构保持一致,关键配置项如下(以__init__实际默认值为准):
| 参数 | 默认值 | 含义 |
|---|---|---|
vocab_size | 130528 | 词表大小,即模型可表示的 token 数量 |
hidden_size | 4096 | 隐藏层维度 |
num_hidden_layers | 28 | Transformer 编码器层数 |
num_attention_heads | 32 | 每层注意力头数 |
inner_hidden_size | 16384 | FFN 中间层维度 |
max_sequence_length | 2048 | 最大序列长度 |
layernorm_epsilon | 1e-5 | LayerNorm 的 epsilon |
position_encoding_2d | True | 是否使用 2D 位置编码(ChatGLM 特有) |
quantization_bit | 0 | 量化位宽,0 表示不量化 |
pre_seq_len/prefix_projection | None / False | P-Tuning v2 前缀长度与前缀投影开关 |
attention_scale | True | 注意力是否缩放 |
activation | "gelu" | FFN 激活函数 |
此外还有bos_token_id=130004、eos_token_id=130005、pad_token_id=3、mask_token_id=130000、gmask_token_id=130001等特殊 token id。同时该类定义了attribute_map = {"num_layers": "num_hidden_layers"},方便与 HuggingFace 权重进行参数名对齐加载。
2.2 模型结构:2D 位置编码与 P-Tuning v2 前缀编码器
modeling.py 完整实现了 GLM 架构的各个组件:
RotaryEmbeddings:旋转位置编码模块,实现 2D 位置编码(position_encoding_2d=True时同时编码 token 位置与块内位置),这也是 ChatGLM 区别于常规 GPT 风格模型的关键特征;ChatGLMAttention:标准多头自注意力,要求hidden_size必须能被num_attention_heads整除;ChatGLMBlock/ChatGLMMLP:Transformer 层与 GELU 激活的 FFN;ChatGLMStack/ChatGLMModel/ChatGLMForCausalLM:堆叠层、基础模型与因果语言模型头;PrefixEncoder:P-Tuning v2 的前缀编码器,支持两种模式——无投影时直接使用nn.Embedding生成[batch, prefix_len, 2*num_layers*hidden_size]的 past key/value;开启prefix_projection时先经过两层 MLP(Linear + Tanh + Linear)编码前缀。这一实现正是 llm/config/chatglm/pt_argument.json 中 prefix tuning 配置的底层支撑。
2.3 分词器与特殊 token
tokenizer.py 定义了ChatGLMTokenizer,其max_model_input_sizes对THUDM/chatglm-6b与THUDM/chatglm-6b-v1.1均设置为 2048。特殊 token 包括:
eos_token:"<eop>"(end of prompt)mask_token:"[MASK]"gmask_token:"[gMASK]"(前缀掩码标记,ChatGLM 使用[gMASK]+<sop>拼接输入)pad_token:"<pad>"
3. 实战一:全量监督微调(SFT)
PaddleNLP 为 ChatGLM-6B 提供了开箱即用的 SFT 训练配置:llm/config/chatglm/sft_argument.json,使用llm/run_finetune.py入口即可启动。
3.1 SFT 配置逐项解析
{ "model_name_or_path": "THUDM/chatglm-6b", "dataset_name_or_path": "./data", "output_dir": "./checkpoints/sft_ckpts", "per_device_train_batch_size": 4, "gradient_accumulation_steps": 4, "per_device_eval_batch_size": 8, "eval_accumulation_steps": 16, "num_train_epochs": 3, "learning_rate": 3e-05, "warmup_steps": 30, "logging_steps": 1, "evaluation_strategy": "epoch", "save_strategy": "epoch", "src_length": 1024, "max_length": 2048, "fp16": true, "fp16_opt_level": "O2", "do_train": true, "do_eval": true, "disable_tqdm": true, "load_best_model_at_end": true, "eval_with_do_generation": false, "metric_for_best_model": "accuracy", "recompute": true, "save_total_limit": 1, "tensor_parallel_degree": 4, "pipeline_parallel_degree": 1, "zero_padding": false, "unified_checkpoint": true, "use_flash_attention": false }关键参数说明:
model_name_or_path:模型权重名或本地路径,这里使用仓库支持的THUDM/chatglm-6b,可替换为THUDM/chatglm-6b-v1.1;dataset_name_or_path/output_dir:训练数据目录与 checkpoint 输出目录;per_device_train_batch_size=4与gradient_accumulation_steps=4:单卡 batch 4、梯度累积 4 步,等效全局 batch 为 16(多卡时再乘以卡数);src_length=1024/max_length=2048:输入源文本最大长度与拼接后的最大序列长度,需不大于模型的max_sequence_length(2048);fp16: true+fp16_opt_level: "O2":启用混合精度训练并采用 O2 优化级别,可在 24GB 显存级别单卡(配合并行与重计算)完成训练;recompute: true:开启激活重计算以显著降低显存占用;tensor_parallel_degree=4/pipeline_parallel_degree=1:4 路张量并行、1 路流水线并行,即采用 TP=4 的分片策略,把 6B 模型参数切分到 4 张卡上;unified_checkpoint: true:启用统一混合并行 checkpoint 机制(对应 paddlenlp/trl/sft_config.py 中的unified_checkpoint参数),便于 TP/PP/DP 混合并行下的权重保存与加载;use_flash_attention: false:默认关闭 FlashAttention,如硬件支持可开启以加速注意力计算并进一步降低显存;eval_with_do_generation: false:评估时直接计算 loss(accuracy 指标),不进行自回归生成,以提升评估速度;metric_for_best_model: "accuracy":配合load_best_model_at_end在每轮评估后保存最优模型。
3.2 启动命令
python -m paddle.distributed.launch llm/run_finetune.py llm/config/chatglm/sft_argument.json4. 实战二:LoRA 参数高效微调
LoRA 仅训练低秩增量矩阵,参数量与显存开销远小于全量微调,非常适合单卡场景。llm/config/chatglm/lora_argument.json 提供了现成配置,与 SFT 配置的差异主要体现在:
learning_rate从3e-05提高到3e-04(LoRA 常用更大的学习率);tensor_parallel_degree从 4 降为 1,单卡即可运行;- 新增
"lora": true,在 llm/run_finetune.py 中会据此调用LoRAModel包装原模型,仅训练注入的 LoRA 参数(LoRA 实现位于 paddlenlp/peft/lora/)。
其余训练超参数(batch、epochs、序列长度、fp16、recompute、unified_checkpoint 等)与 SFT 一致。启动命令:
python -m paddle.distributed.launch llm/run_finetune.py llm/config/chatglm/lora_argument.json训练完成后,可通过llm/tools/merge_lora_params.py将 LoRA 权重合并回原模型,得到可直接部署的完整模型。
5. 实战三:P-Tuning v2 前缀微调
llm/config/chatglm/pt_argument.json 提供了 ChatGLM-6B 的 P-Tuning v2(prefix tuning)配置:
{ "model_name_or_path": "THUDM/chatglm-6b", "dataset_name_or_path": "./data", "output_dir": "./checkpoints/pt_ckpts", "per_device_train_batch_size": 4, "gradient_accumulation_steps": 4, "per_device_eval_batch_size": 8, "eval_accumulation_steps": 16, "num_train_epochs": 3, "learning_rate": 3e-02, "warmup_steps": 30, "logging_steps": 1, "evaluation_strategy": "epoch", "save_strategy": "epoch", "src_length": 1024, "max_length": 2048, "fp16": true, "fp16_opt_level": "O2", "do_train": true, "do_eval": true, "disable_tqdm": true, "load_best_model_at_end": true, "eval_with_do_generation": false, "metric_for_best_model": "accuracy", "recompute": true, "save_total_limit": 1, "tensor_parallel_degree": 1, "pipeline_parallel_degree": 1, "prefix_tuning": true, "zero_padding": false, "use_flash_attention": false }与 LoRA 配置的差异点:
learning_rate进一步提高到3e-02(前缀参数是随机初始化的新参数,需要较大学习率快速收敛);- 新增
"prefix_tuning": true,在 llm/run_finetune.py 中会调用get_prefix_tuning_params(model)提取模型的注意力头数、隐藏层数、hidden_size 等维度,构造PrefixConfig后用PrefixModelForCausalLM包装模型。其底层正是 2.2 节介绍的PrefixEncoder,支持prefix_projection两层 MLP 编码方案。
注意:源码中已注明 prefix tuning 目前不支持流水线并行(
pipeline_parallel_degree需保持为 1),这也是该配置中 TP/PP 均为 1 的原因。
6. 实战四:PTQ 与 GPTQ 量化
PaddleNLP 通过 llm/run_quantization.py 提供量化能力,仓库为 ChatGLM-6B 准备了两种后训练量化配置。
6.1 PTQ 静态量化(ptq_argument.json)
{ "model_name_or_path": "THUDM/chatglm-6b", "per_device_train_batch_size": 8, "per_device_eval_batch_size": 8, "eval_accumulation_steps": 16, "src_length": 1024, "max_length": 2048, "fp16": true, "fp16_opt_level": "O2", "dataset_name_or_path": "./data", "output_dir": "./checkpoints/ptq_ckpts", "do_eval": true, "eval_with_do_generation": false, "do_ptq": true, "unified_checkpoint": true, "ptq_step": 16 }PTQ 通过在校准数据上统计激活值的量化范围(ptq_step=16表示使用 16 个校准 step)来完成静态量化,do_ptq: true触发该流程。
6.2 GPTQ 量化(gptq_argument.json)
{ "model_name_or_path": "THUDM/chatglm-6b", "per_device_train_batch_size": 8, "per_device_eval_batch_size": 8, "eval_accumulation_steps": 16, "src_length": 1024, "max_length": 2048, "fp16": true, "fp16_opt_level": "O2", "dataset_name_or_path": "./data", "output_dir": "./checkpoints/gptq_ckpts", "do_eval": true, "eval_with_do_generation": false, "do_gptq": true, "unified_checkpoint": true, "gptq_step": 8 }GPTQ 是逐层基于 Hessian 信息进行权重量化的后训练量化方法,gptq_step=8表示使用 8 个校准 step。模型配置类中的quantization_bit参数(默认 0)则用于控制加载权重时的量化位宽。启动命令统一为:
python llm/run_quantization.py llm/config/chatglm/gptq_argument.json量化完成后输出的模型可配合 llm/docs/quantization.md 中的部署流程使用,显著降低显存占用与推理延迟。
7. 常用文件索引
| 用途 | 路径 |
|---|---|
| 模型官方文档 | docs/zh/llm/config/chatglm/README.md |
| SFT 配置 | llm/config/chatglm/sft_argument.json |
| LoRA 配置 | llm/config/chatglm/lora_argument.json |
| P-Tuning 配置 | llm/config/chatglm/pt_argument.json |
| PTQ 配置 | llm/config/chatglm/ptq_argument.json |
| GPTQ 配置 | llm/config/chatglm/gptq_argument.json |
| 模型配置类 | paddlenlp/transformers/chatglm/configuration.py |
| 模型实现 | paddlenlp/transformers/chatglm/modeling.py |
| 分词器 | paddlenlp/transformers/chatglm/tokenizer.py |
| 权重协议 | paddlenlp/transformers/chatglm/LICENSE |
| 微调入口 | llm/run_finetune.py |
| 量化入口 | llm/run_quantization.py |
8. 总结
ChatGLM-6B 是 PaddleNLP 中开箱即用、覆盖完整训练链路的双语对话模型:一方面,仓库在 paddlenlp/transformers/chatglm/ 中完整实现了 GLM 架构(2D 位置编码、P-Tuning v2 前缀编码器、专用分词器等),并支持THUDM/chatglm-6b与THUDM/chatglm-6b-v1.1两个权重版本;另一方面,llm/config/chatglm/ 下的五份 JSON 配置覆盖了 SFT 全量微调、LoRA、P-Tuning v2、PTQ 与 GPTQ 五种主流方案,可直接修改model_name_or_path、dataset_name_or_path、并行度与序列长度等参数后投入实际训练。需要注意的是,模型权重使用须严格遵守仓库内 LICENSE 的协议条款。
- 人工智能
- 大模型
- 预训练
- 微调
- LoRA
- RLHF
- 强化学习
- 分布式训练
【免费下载链接】PaddleNLP
Easy-to-use and powerful LLM and SLM library with awesome model zoo.
相关推荐
PaddleNLP 中 ChatGLM-6B 的微调、量化与推理全指南
PaddleNLP 中 ChatGLM 6B 的微调、量化与推理全指南 导读 ChatGLM 6B 是智谱 AI 开源的中英双语对话语言模型,基于 GLM(Ge
人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP 中的 ChatGLM-6B:模型解读、全场景微调与量化部署实践
PaddleNLP 中的 ChatGLM 6B:模型解读、全场景微调与量化部署实践 ChatGLM 6B 是 THUDM 开源的中英双语对话模型,PaddleN
人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP 中 BLOOM 大模型配置与微调量化实战指南
PaddleNLP 中 BLOOM 大模型配置与微调量化实战指南 导读 本文以 PaddleNLP 仓库中 BLOOM 模型配置文档( docs/en/llm/
人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考