- 人工智能
- 大模型
- 预训练
- 微调
- LoRA
- RLHF
- 强化学习
- 分布式训练
【免费下载链接】PaddleNLP
Easy-to-use and powerful LLM and SLM library with awesome model zoo.
导读
本文面向希望在推理阶段获得更小体积、更快速度 GPT 模型的开发者,完整讲解如何在 PaddleNLP 仓库的 GPT 子项目中开展量化感知训练(Quantization Aware Training,QAT):包括单卡/模型并行/分组切片并行三种启动方式、PaddleSlim 量化配置参数的逐项含义、基于 LAMBADA 数据集的精度验证,以及量化敏感度分析与静态图模型导出。读完本文,你将能够基于 GPT-345M 预训练权重 复现出文档给出的 INT8 量化模型,并掌握把量化模型导出为可验证模型与可生成模型的两条路径。
一、什么是量化感知训练:为什么生成式模型需要 QAT
量化感知训练(QAT)的核心思路是:在训练过程中模拟量化误差——权重(weight)和激活(activation)在前向计算时被量化到低比特(本项目为 INT8),反向传播时则保持浮点精度更新参数。这样训练出的模型在推理阶段切换到真实 INT8 算子后,精度损失远小于训练后直接量化(Post Training Quantization,PTQ)。
对于 GPT 这类自回归生成模型,量化尤其困难。文档明确指出两个原因:
- Transformer 层权重分布差异大:不同层的权重数值范围差异显著,单一量化策略难以兼顾所有层。
- 误差逐层累积:GPT 从左到右逐 token 预测,量化误差会随序列长度逐步累积,导致精度损失被放大。
为此,PaddleSlim 提供了量化训练敏感度分析工具,用于定位对量化损失敏感的网络层,从而在量化配置中跳过(skip)这些敏感层,保住模型整体精度。
本项目给出了两组可直接对照的官方评估结果(基于 LAMBADA 数据集,ACC 指标):
| 模型文件 | 数据类型 | ACC |
|---|---|---|
| GPT-345M | FP16 | 44.17% |
| GPT-345M | INT8 | 44.94% |
也就是说,经过敏感度分析并跳过敏感层后,INT8 量化模型的 LAMBADA 准确率(44.94%)甚至略高于 FP16 基线(44.17%),说明合理的 QAT 配置可以在压缩模型的同时不牺牲、甚至提升精度。
二、相关脚本与配置文件一览
量化训练相关的全部入口脚本位于slm/model_zoo/gpt-3/projects/gpt/目录:
. ├── qat_gpt_345M_single_card.sh # 单卡345M模型量化训练入口 ├── qat_gpt_345M_mp8.sh # 8卡345M模型模型并行量化训练入口 ├── qat_gpt_6.7B_sharding16.sh # 16卡6.7B模型分组切片并行量化训练入口 ├── eval_qat_gpt_345M_single_card.sh # 单卡345M量化模型验证入口 ├── export_qat_gpt_345M_single_card.sh # 单卡345M量化模型导出入口与之对应的量化训练/评估/导出配置位于slm/model_zoo/gpt-3/ppfleetx/configs/nlp/gpt/:
| 脚本 | 对应配置文件 |
|---|---|
qat_gpt_345M_single_card.sh | qat_gpt_345M_single_card.yaml |
qat_gpt_345M_mp8.sh | qat_gpt_345M_mp8.yaml |
qat_gpt_6.7B_sharding16.sh | qat_gpt_6.7B_sharding16.yaml |
eval_qat_gpt_345M_single_card.sh | eval_qat_gpt_345M_single_card.yaml |
export_qat_gpt_345M_single_card.sh | generation_qat_gpt_345M_single_card.yaml |
三个训练配置文件都通过_base_: ./pretrain_gpt_base.yaml继承基础预训练配置,仅在Compress段叠加量化开关,实现了"普通预训练配置 + 量化插件"的复用设计。
三、环境依赖与数据准备
量化训练本身的环境依赖与 GPT 预训练完全一致,请先参考 GPT 项目文档 完成环境安装、依赖安装与训练数据准备,核心步骤包括:
python -m pip install -r requirements.txt # 准备 300M 样例训练数据 mkdir data && cd data wget -O gpt_en_dataset_300m_ids.npy https://bj.bcebos.com/paddlenlp/models/transformers/gpt/data/gpt_en_dataset_300m_ids.npy wget -O gpt_en_dataset_300m_idx.npz https://bj.bcebos.com/paddlenlp/models/transformers/gpt/data/gpt_en_dataset_300m_idx.npz cd ..额外注意:模型导出环节还依赖ppfleetx-ops(量化相关融合算子)的安装,在slm/model_zoo/gpt-3/目录下执行:
cd PaddleNLP/model_zoo/gpt-3/ # 如果已在此目录下,则忽略 cd ppfleetx/ops && python setup_cuda.py install && cd ../..从源码结构看,slm/model_zoo/gpt-3/ppfleetx/ops/提供setup_cuda.py用于编译安装 CUDA 算子(如topp_sampling.cu),导出阶段需要这些算子支撑静态图推理。
四、预训练模型准备
量化训练需要在已有浮点模型基础上继续进行,因此必须先加载 GPT-345M 预训练权重:
wget https://paddlefleetx.bj.bcebos.com/model/nlp/gpt/GPT_345M.tar.gz tar xf GPT_345M.tar.gz解压后得到类似PaddleFleetX_GPT_345M_220826的目录,该路径将作为训练命令中-o Compress.pretrained='./PaddleFleetX_GPT_345M_220826'的参数传入,用于在量化开始前加载浮点权重。
五、量化训练:三种并行启动方式
5.1 单卡训练(345M)
直接运行入口脚本:
bash ./projects/gpt/qat_gpt_345M_single_card.sh等价的手动启动命令如下。其中-o参数用于覆盖 YAML 配置中的具体字段,命令行优先级高于配置文件:
export CUDA_VISIBLE_DEVICES=0 log_dir=log_hybrid rm -rf $log_dir python ./tools/train.py \ -c ./ppfleetx/configs/nlp/gpt/qat_gpt_345M_single_card.yaml \ -o Engine.max_steps=100000 \ -o Model.hidden_dropout_prob=0.0 \ -o Model.attention_probs_dropout_prob=0.0 \ -o Optimizer.lr.decay_steps=72000 \ -o Optimizer.weight_decay=0.02 \ -o Optimizer.lr.max_lr=5.0e-6 \ -o Optimizer.lr.min_lr=1.0e-6 \ -o Compress.pretrained='./PaddleFleetX_GPT_345M_220826'5.2 模型并行训练(8 卡 345M)
bash ./projects/gpt/qat_gpt_345M_mp8.sh等价手动命令:
export CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 log_dir=log_hybrid rm -rf $log_dir python -m paddle.distributed.launch --log_dir $log_dir --devices "0,1,2,3,4,5,6,7" \ ./tools/train.py \ -c ./ppfleetx/configs/nlp/gpt/qat_gpt_345M_mp8.yaml \ -o Engine.max_steps=100000 \ -o Model.hidden_dropout_prob=0.0 \ -o Model.attention_probs_dropout_prob=0.0 \ -o Optimizer.lr.decay_steps=72000 \ -o Optimizer.weight_decay=0.02 \ -o Optimizer.lr.max_lr=5.0e-6 \ -o Optimizer.lr.min_lr=1.0e-6 \ -o Compress.pretrained='./PaddleFleetX_GPT_345M_220826'与单卡配置相比,qat_gpt_345M_mp8.yaml将Distributed.mp_degree设为 8、micro_batch_size设为 1,即张量模型并行切分注意力头与 FFN 参数,单卡显存压力显著降低。
5.3 分组切片并行训练(16 卡 6.7B)
bash ./projects/gpt/qat_gpt_6.7B_sharding16.sh该脚本使用-c ./ppfleetx/configs/nlp/gpt/qat_gpt_6.7B_sharding16.yaml,其Distributed段配置了sharding_degree: 16、sharding_stage: 2,并开启reduce_overlap与broadcast_overlap来重叠通信与计算;模型结构扩到hidden_size: 4096、num_layers: 32、num_attention_heads: 32,同时开启use_recompute: True与Optimizer.tensor_fusion: True。这类大规模模型适合在 16 卡环境上以分组切片并行方式做 QAT。
Tips:尽管三个脚本都将最大训练步数设为 100000,但项目文档给出的实验经验是——量化训练约 4000 步即可达到最优效果,无需跑满 100000 步。
六、量化配置参数深度解析
以下 YAML 来自qat_gpt_345M_single_card.yaml的Compress段,是 QAT 的核心配置:
Compress: pretrained: Quantization: enable: True weight_quantize_type: 'abs_max' activation_quantize_type: 'moving_average_abs_max' activation_preprocess_type: 'PACT' weight_bits: 8 activation_bits: 8 quantizable_layer_type: ['Linear', 'ColumnParallelLinear', 'RowParallelLinear'] onnx_format: True freeze_embedding: True skip_tensor_map: block_3: ['linear2'] block_5: ['linear1'] block_6: ['linear2'] block_7: ['linear2'] block_10: ['linear2'] block_20: ['linear2'] block_21: ['linear2']各参数含义(与slm/model_zoo/gpt-3/docs/compression.md及配置文件交叉印证):
| 参数名 | 参数释义 |
|---|---|
pretrained | 预训练模型加载目录;设置后会在量化前加载浮点模型;若已有量化权重,则将其置空、改由Engine.save_load.ckpt_dir加载 |
enable | 是否开启量化训练 |
weight_quantize_type | 权重量化方法,abs_max按全局绝对值最大值缩放;文档同时提到channel_wise_abs_max(按通道)为 PaddleSlim 另一常用选项 |
activation_quantize_type | 激活量化方法,moving_average_abs_max通过滑动平均跟踪激活范围 |
activation_preprocess_type | 激活预处理方法,PACT(与 weight 侧PACT配合)可在量化点引入可学习截断参数,缓解激活分布不均匀问题 |
weight_bits/activation_bits | 权重/激活量化比特数,本项目统一使用 8(INT8) |
quantizable_layer_type | 参与量化的层类型白名单;此处覆盖普通Linear以及并行线性层ColumnParallelLinear、RowParallelLinear,确保模型并行场景下同样量化 |
onnx_format | 是否使用新量化格式(便于后续转 ONNX/部署),默认 False |
freeze_embedding | 是否冻结 embedding 层不参与量化 |
skip_tensor_map | 敏感度分析的产物:以block_N: ['linear1'/'linear2']形式列出跳过量化的敏感层,如第 3 块的linear2、第 5 块的linear1等 |
值得注意的细节:
qat_gpt_345M_mp8.yaml的Quantization段没有配置activation_preprocess_type和skip_tensor_map,说明 8 卡脚本对应的是未做敏感度分析的基线版本;qat_gpt_6.7B_sharding16.yaml保留了activation_preprocess_type: 'PACT'但同样未带skip_tensor_map;- 单卡 345M 配置中的
skip_tensor_map正是前文所述敏感度分析的直接落地形式——把分析定位出的敏感层从量化范围中剔除,换来 INT8 模型 44.94% 的 ACC。
从代码层面看,Compress配置由slm/model_zoo/gpt-3/ppfleetx/utils/compression_helper.py解析并接入 PaddleSlim 量化器,量化训练在tools/train.py中随普通训练流程一起执行。
七、量化训练精度调优:敏感度分析
生成式预训练语言模型的压缩是公认难点。除了前文提到的权重分布差异与误差累积外,实际中不同 Transformer 层对量化的耐受度差别很大。PaddleSlim 提供的量化训练敏感度分析工具可以在验证集上逐层评估"该层量化带来的损失",从而:
- 定位量化损失较大的敏感层;
- 在
skip_tensor_map中跳过这些层(保持浮点计算); - 用调整后的配置重新训练量化模型。
该工具目前仅支持静态图模型,因此需要先将量化模型导出为静态图。导出命令(导出的是可用于验证的GPTModule,而非GenerationModule):
# 下载未经过敏感度分析的量化模型 wget https://paddlefleetx.bj.bcebos.com/model/nlp/gpt/GPT_345M_QAT_wo_analysis.tar tar xf GPT_345M_QAT_wo_analysis.tar export CUDA_VISIBLE_DEVICES=0 python ./tools/export.py \ -c ./ppfleetx/configs/nlp/gpt/export_qat_gpt_345M_single_card.yaml \ -o Model.hidden_dropout_prob=0.0 \ -o Model.attention_probs_dropout_prob=0.0 \ -o Engine.save_load.ckpt_dir='./GPT_345M_QAT_wo_analysis/'这里使用的export_qat_gpt_345M_single_card.yaml与训练配置一致,仅在Compress段缺少activation_preprocess_type与skip_tensor_map,对应"未分析"的量化权重。导出成功后,即可按照 PaddleSlim 的 GPT 敏感度分析示例流程逐层量化、评估并生成skip_tensor_map,最后将结果写回训练配置重新训练。
八、模型验证:LAMBADA 精度评测
训练完成后,用 LAMBADA 数据集验证量化模型的 ACC:
# 下载验证数据 wget https://raw.githubusercontent.com/cybertronai/bflm/master/lambada_test.jsonl # 下载已经训练好的量化模型(含敏感度分析) wget https://paddlefleetx.bj.bcebos.com/model/nlp/gpt/GPT_345M_QAT_w_analysis.tar tar xf GPT_345M_QAT_w_analysis.tar export CUDA_VISIBLE_DEVICES=0 python ./tools/eval.py \ -c ./ppfleetx/configs/nlp/gpt/eval_qat_gpt_345M_single_card.yaml \ -o Model.hidden_dropout_prob=0.0 \ -o Model.attention_probs_dropout_prob=0.0 \ -o Engine.save_load.ckpt_dir='./GPT_345M_QAT_w_analysis' \ -o Offline_Eval.eval_path=./lambada_test.jsonl \ -o Offline_Eval.cloze_eval=True要点说明:
Engine.save_load.ckpt_dir指向量化模型权重目录;Offline_Eval.eval_path指定 LAMBADA 测试文件路径;Offline_Eval.cloze_eval=True开启 cloze(完形填空)式评估,即根据前文预测句中最后一个词是否正确,这正是 LAMBADA 任务的标准评测方式;- 入口脚本
eval_qat_gpt_345M_single_card.sh封装了同样的命令,可直接bash运行。
九、模型导出:可验证模型与可生成模型
9.1 导出可验证模型(供敏感度分析)
对应第 7 节,使用export_qat_gpt_345M_single_card.yaml导出GPTModule,用于静态图敏感度分析:
# 下载已经训练好的量化模型,若已有量化模型,不需要下载 wget https://paddlefleetx.bj.bcebos.com/model/nlp/gpt/GPT_345M_QAT_wo_analysis.tar tar xf GPT_345M_QAT_wo_analysis.tar export CUDA_VISIBLE_DEVICES=0 python ./tools/export.py \ -c ./ppfleetx/configs/nlp/gpt/export_qat_gpt_345M_single_card.yaml \ -o Model.hidden_dropout_prob=0.0 \ -o Model.attention_probs_dropout_prob=0.0 \ -o Engine.save_load.ckpt_dir='./GPT_345M_QAT_wo_analysis/'9.2 导出可生成模型(用于文本生成/部署)
export_qat_gpt_345M_single_card.sh脚本同时注释了两种导出方式。需要生成句子时,改用generation_qat_gpt_345M_single_card.yaml导出GenerationModule:
python ./tools/export.py \ -c ./ppfleetx/configs/nlp/gpt/generation_qat_gpt_345M_single_card.yaml \ -o Model.hidden_dropout_prob=0.0 \ -o Model.attention_probs_dropout_prob=0.0 \ -o Engine.save_load.ckpt_dir='./GPT_345M_QAT_wo_analysis/'两条导出路径的差异在于配置文件指定的模块类型:export_qat_*.yaml导出GPTModule(仅用于验证与敏感度分析),generation_qat_*.yaml导出GenerationModule(带自回归生成逻辑,用于推理部署)。两个配置文件同样基于pretrain_gpt_base.yaml,模型结构一致,因此同一份权重可以分别走两条导出流程。
十、总结与进一步阅读
本文完整覆盖了 GPT 量化感知训练的闭环:加载预训练浮点权重 → 以 INT8 模拟量化进行训练(单卡/模型并行/分组切片并行)→ 敏感度分析定位敏感层并写入skip_tensor_map→ LAMBADA 验证 → 导出静态图模型。文档与仓库脚本给出的经验表明:配合 PACT 预处理与敏感层跳过,INT8 量化模型的 LAMBADA ACC(44.94%)可以不低于甚至超过 FP16 基线(44.17%),而模型推理时的体积与算力开销则大幅下降。
进一步延伸阅读:
- GPT 模型压缩配置参数总览:包含量化训练、结构化稀疏、知识蒸馏的完整参数说明;
- GPT 项目总览:环境依赖、数据准备、模型结构与优化器参数释义;
- 单卡预训练指南 与 混合并行训练指南:了解 QAT 所继承的预训练配置细节;
- 推理部署指南:量化模型导出后的部署流程。
- 人工智能
- 大模型
- 预训练
- 微调
- LoRA
- RLHF
- 强化学习
- 分布式训练
【免费下载链接】PaddleNLP
Easy-to-use and powerful LLM and SLM library with awesome model zoo.
相关推荐
Dolly模型量化感知训练:INT8精度的从头训练方案
Dolly模型量化感知训练:INT8精度的从头训练方案 痛点直击:大模型训练的显存困境 你是否还在为训练7B参数模型需要40GB+显存而苦恼?当A100显卡被垄
人工智能大模型微调PaddleOCR 模型量化实战指南:基于 PaddleSlim 的 QAT 量化感知训练与 INT8 端侧部署
PaddleOCR 模型量化实战指南:基于 PaddleSlim 的 QAT 量化感知训练与 INT8 端侧部署 本篇技术指南围绕 PaddleOCR 官方文档
人工智能计算机视觉OCR深度学习大模型RAG突破精度瓶颈:PaddleSlim训练感知量化(QAT)实战指南
突破精度瓶颈:PaddleSlim训练感知量化 QAT 实战指南 引言:量化技术的困境与解决方案 你是否面临这样的困境:模型部署时受限于硬件资源,需要压缩模型大
人工智能深度学习模型量化模型优化模型蒸馏AutoML
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考