实战指南:从 INT8 训练、敏感度分析到模型导出与验证)
人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载导读本文面向希望在推理阶段获得更小体积、更快速度 GPT 模型的开发者完整讲解如何在 PaddleNLP 仓库的 GPT 子项目中开展量化感知训练Quantization Aware TrainingQAT包括单卡/模型并行/分组切片并行三种启动方式、PaddleSlim 量化配置参数的逐项含义、基于 LAMBADA 数据集的精度验证以及量化敏感度分析与静态图模型导出。读完本文你将能够基于 GPT-345M 预训练权重 复现出文档给出的 INT8 量化模型并掌握把量化模型导出为可验证模型与可生成模型的两条路径。一、什么是量化感知训练为什么生成式模型需要 QAT量化感知训练QAT的核心思路是在训练过程中模拟量化误差——权重weight和激活activation在前向计算时被量化到低比特本项目为 INT8反向传播时则保持浮点精度更新参数。这样训练出的模型在推理阶段切换到真实 INT8 算子后精度损失远小于训练后直接量化Post Training QuantizationPTQ。对于 GPT 这类自回归生成模型量化尤其困难。文档明确指出两个原因Transformer 层权重分布差异大不同层的权重数值范围差异显著单一量化策略难以兼顾所有层。误差逐层累积GPT 从左到右逐 token 预测量化误差会随序列长度逐步累积导致精度损失被放大。为此PaddleSlim 提供了量化训练敏感度分析工具用于定位对量化损失敏感的网络层从而在量化配置中跳过skip这些敏感层保住模型整体精度。本项目给出了两组可直接对照的官方评估结果基于 LAMBADA 数据集ACC 指标模型文件数据类型ACCGPT-345MFP1644.17%GPT-345MINT844.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.shqat_gpt_345M_single_card.yamlqat_gpt_345M_mp8.shqat_gpt_345M_mp8.yamlqat_gpt_6.7B_sharding16.shqat_gpt_6.7B_sharding16.yamleval_qat_gpt_345M_single_card.sheval_qat_gpt_345M_single_card.yamlexport_qat_gpt_345M_single_card.shgeneration_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_DEVICES0 log_dirlog_hybrid rm -rf $log_dir python ./tools/train.py \ -c ./ppfleetx/configs/nlp/gpt/qat_gpt_345M_single_card.yaml \ -o Engine.max_steps100000 \ -o Model.hidden_dropout_prob0.0 \ -o Model.attention_probs_dropout_prob0.0 \ -o Optimizer.lr.decay_steps72000 \ -o Optimizer.weight_decay0.02 \ -o Optimizer.lr.max_lr5.0e-6 \ -o Optimizer.lr.min_lr1.0e-6 \ -o Compress.pretrained./PaddleFleetX_GPT_345M_2208265.2 模型并行训练8 卡 345Mbash ./projects/gpt/qat_gpt_345M_mp8.sh等价手动命令export CUDA_VISIBLE_DEVICES0,1,2,3,4,5,6,7 log_dirlog_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_steps100000 \ -o Model.hidden_dropout_prob0.0 \ -o Model.attention_probs_dropout_prob0.0 \ -o Optimizer.lr.decay_steps72000 \ -o Optimizer.weight_decay0.02 \ -o Optimizer.lr.max_lr5.0e-6 \ -o Optimizer.lr.min_lr1.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.7Bbash ./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权重/激活量化比特数本项目统一使用 8INT8quantizable_layer_type参与量化的层类型白名单此处覆盖普通Linear以及并行线性层ColumnParallelLinear、RowParallelLinear确保模型并行场景下同样量化onnx_format是否使用新量化格式便于后续转 ONNX/部署默认 Falsefreeze_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_DEVICES0 python ./tools/export.py \ -c ./ppfleetx/configs/nlp/gpt/export_qat_gpt_345M_single_card.yaml \ -o Model.hidden_dropout_prob0.0 \ -o Model.attention_probs_dropout_prob0.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_DEVICES0 python ./tools/eval.py \ -c ./ppfleetx/configs/nlp/gpt/eval_qat_gpt_345M_single_card.yaml \ -o Model.hidden_dropout_prob0.0 \ -o Model.attention_probs_dropout_prob0.0 \ -o Engine.save_load.ckpt_dir./GPT_345M_QAT_w_analysis \ -o Offline_Eval.eval_path./lambada_test.jsonl \ -o Offline_Eval.cloze_evalTrue要点说明Engine.save_load.ckpt_dir指向量化模型权重目录Offline_Eval.eval_path指定 LAMBADA 测试文件路径Offline_Eval.cloze_evalTrue开启 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_DEVICES0 python ./tools/export.py \ -c ./ppfleetx/configs/nlp/gpt/export_qat_gpt_345M_single_card.yaml \ -o Model.hidden_dropout_prob0.0 \ -o Model.attention_probs_dropout_prob0.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导出GenerationModulepython ./tools/export.py \ -c ./ppfleetx/configs/nlp/gpt/generation_qat_gpt_345M_single_card.yaml \ -o Model.hidden_dropout_prob0.0 \ -o Model.attention_probs_dropout_prob0.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 ACC44.94%可以不低于甚至超过 FP16 基线44.17%而模型推理时的体积与算力开销则大幅下降。进一步延伸阅读GPT 模型压缩配置参数总览包含量化训练、结构化稀疏、知识蒸馏的完整参数说明GPT 项目总览环境依赖、数据准备、模型结构与优化器参数释义单卡预训练指南 与 混合并行训练指南了解 QAT 所继承的预训练配置细节推理部署指南量化模型导出后的部署流程。赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐Dolly模型量化感知训练INT8精度的从头训练方案Dolly模型量化感知训练INT8精度的从头训练方案 痛点直击大模型训练的显存困境 你是否还在为训练7B参数模型需要40GB显存而苦恼当A100显卡被垄人工智能大模型微调PaddleOCR 模型量化实战指南基于 PaddleSlim 的 QAT 量化感知训练与 INT8 端侧部署PaddleOCR 模型量化实战指南基于 PaddleSlim 的 QAT 量化感知训练与 INT8 端侧部署 本篇技术指南围绕 PaddleOCR 官方文档人工智能计算机视觉OCR深度学习大模型RAG突破精度瓶颈PaddleSlim训练感知量化(QAT)实战指南突破精度瓶颈PaddleSlim训练感知量化 QAT 实战指南 引言量化技术的困境与解决方案 你是否面临这样的困境模型部署时受限于硬件资源需要压缩模型大人工智能深度学习模型量化模型优化模型蒸馏AutoML上一篇如何为grub2-themes创建自定义背景从入门到精通下一篇如何用 DBeaver 调试存储过程断点、变量与调用栈实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考