拓冰建站拓冰建站
首页 / 资讯中心 / 正文

PaddleNLP 大模型量化实战指南:从 GPTQ 到 PTQ/AWQ 的完整上手教程

人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载本篇技术指南以 PaddleNLP 大模型套件的量化教程为核心系统讲解大模型量化的基本原理并通过 C-Eval 校准数据集从零开始带领读者完成 GPTQ 后训练量化PTQ的完整实操流程随后进一步介绍 PaddleSlim 自研的 PSSPiecewiseSearchSmoothPTQ 量化、AWQ、W8A8C8 与 W8A8FP8等多种量化方案的配置与启动方式。读完本文你将掌握 PaddleNLP 中run_quantization.py的配置编写、命令运行、日志解读与常见报错排查并能根据显存与硬件条件选择合适的量化算法。1. 量化是什么为什么大模型需要量化在 PaddleNLP 大模型预训练与微调指南中遇到显存不足OOM时常常会提到一个解决方案——模型量化Quantization。量化是一种重要的模型压缩技术其核心思路是把模型中的参数从高精度如 FP32浮点数转换为低精度如 INT8 或 FP16从而减小模型体积、降低显存占用、加快推理速度同时尽量保持模型性能不下降。量化的目标可以概括为一句话在尽量不损失精度的前提下让模型尽量更小、更快。围绕量化什么这个维度常见的量化类型分为两类权重量化Weight Quantization对模型参数本身进行压缩例如将参数值由 FP32 转为 INT8或更激进的 INT4。权重在推理时是静态的因此权重量化相对容易实现GPTQ、AWQ 都属于这一类。激活量化Activation Quantization对推理过程中产生的中间激活值activation进行量化。激活值随输入动态变化量化难度更高但能带来更大的显存与带宽收益W8A8权重与激活均为 8 位即属于此类。从 PaddleNLP 的量化文档看飞桨大模型量化算法同时覆盖了上述两类既对权重做 INT8/INT4 压缩也对激活以及部分方案中的 KV Cache做 INT8/FP8 量化具体算法族包括 PTQ、GPTQ、AWQ 等详见 量化教程。2. 环境准备安装 PaddlePaddle、PaddleNLP 与 PaddleSlim在开始量化之前需要先安装三件套PaddlePaddle、PaddleNLP 与 PaddleSlim。量化链路中PaddleSlim 提供底层量化策略实现Shift、SmoothQuant、GPTQ 等算法核心PaddleNLP 提供训练器与入口脚本PaddlePaddle 提供计算后端。安装最新版本的 paddlepaddle 与 paddlenlppython -m pip install --pre paddlepaddle-gpu -i https://www.paddlepaddle.org.cn/packages/nightly/cu118/ pip install --pre --upgrade paddlenlp -f https://www.paddlepaddle.org.cn/whl/paddlenlp.html安装 develop 版本的 PaddleSlim量化算法依赖其最新实现务必使用 develop 分支源码安装git clone https://github.com/PaddlePaddle/PaddleSlim.git cd PaddleSlim python setup.py install安装完成后将 PaddleNLP 代码克隆到本地并进入运行目录量化教程 中同样要求 PaddleSlim / PaddlePaddle / PaddleNLP 三个仓库均使用 develop 版本git clone https://github.com/PaddlePaddle/PaddleNLP.git cd PaddleNLP/llm3. 校准数据集准备用 C-Eval 构造量化校准集量化的前置依赖是校准数据Calibration Dataset。量化算法需要通过少量真实数据观察模型各层的激活分布从而确定最优量化参数。PaddleNLP 量化流程中训练集 / quant 文件作为校正Calibration数据集开发集dev作为量化后的评估数据集若数据目录下没有quant.json则会自动回退使用train.json作为校准集对应逻辑可见 run_quantization.py 中 Set train dataset as PTQ calibration dataset 的分支。官方教程推荐使用C-Eval中文选择题数据集作为校准数据样例如下id: 1 question: 25 °C时将pH2的强酸溶液与pH13的强碱溶液混合所得混合液的pH11则强酸溶液与强碱溶液 的体积比是(忽略混合后溶液的体积变化)____ A: 11:1 B: 9:1 C: 1:11 D: 1:9 answer: B explanation: 1. pH13的强碱溶液中c(OH-)0.1mol/L, pH2的强酸溶液中c(H)0.01mol/L酸碱混合后pH11即c(OH-)0.001mol/L。 2. 设强酸和强碱溶液的体积分别为x和y则c(OH-)(0.1y-0.01x)/(xy)0.001解得x:y9:1。下载并解压数据集cd ~/PaddleNLP/ mkdir dataset wget https://modelscope.oss-cn-beijing.aliyuncs.com/open_data/c-eval/ceval-exam.zip unzip ceval-exam.zip -d dataset/ceval抽取 C-Eval 样本作为校准数据集cd llm/experimental/ceval/default python prepare_data_for_ptq.py从 prepare_data_for_ptq.py 源码可以看出该脚本的抽样逻辑它读取dataset/ceval/dev下的各科目 CSV 文件每个科目按序抽取题目结合 3-shot 示例构造src指令题目选项与tgt答案解释共抽取 128 条样本最终写入dataset/ceval_ptq_test/quant.json与dataset/ceval_ptq_test/dev.json。教程中使用的绝对路径/home/aistudio/PaddleNLP/dataset/ceval_ptq_test即对应此脚本生成的目录。数据格式补充说明除了 C-Eval你也可以使用其他数据作为校准集。PaddleNLP 支持的数据格式为每行一个字典包含两个字段对应 量化教程 的数据说明srcstr, List(str)模型的输入指令instruction、提示prompt即模型应执行的任务tgtstr, List(str)模型的输出。样例{src: 类型#裙*颜色#蓝色*风格#清新*图案#蝴蝶结, tgt: 裙身处采用立体蝴蝶结装饰辅以蓝色条带点缀令衣身造型饱满富有层次的同时为其注入一丝甜美气息。将女孩清新娇俏的一面衬托而出。}4. GPTQ 量化实战从配置编写到结果验证4.1 GPTQ 算法原理与流程GPTQ 是一种**后训练量化PTQ**方法基本思想是直接对训练好的模型进行量化压缩再通过校准数据验证压缩对模型输出的影响是否可控。GPTQ 的整体流程如下初始状态准备未量化的模型与一个校准数据集前向采集输入校准数据获得每一层的激活值逐层量化对每一层进行量化误差补偿选择对输出误差影响最小的量化值从而在 INT4 的极端压缩下依然保持精度。由于 GPTQ 在逐层量化时会以最小化输出误差为目标做补偿它比普通的直接量化精度更高代价是量化过程需要多次前向时间较长。PaddleNLP 中 GPTQ 的实现位于 utils/quant.py 的apply_gptq函数由run_quantization.py在do_gptq为 True 时调用见 run_quantization.py。4.2 编写 GPTQ 配置文件参照仓库中的示例配置 gptq_argument.json默认模型为 LLaMa3-8B教程给出了一份针对小模型的改造版配置。在本地新建gptq_argument.json将下面的内容粘贴进去{ model_name_or_path: Qwen/Qwen2.5-0.5B-Instruct, per_device_train_batch_size: 8, per_device_eval_batch_size: 8, eval_accumulation_steps:16, src_length: 512, max_length: 1024, fp16: false, fp16_opt_level: O0, dataset_name_or_path: /home/aistudio/PaddleNLP/dataset/ceval_ptq_test, output_dir: ./checkpoints/gptq_ckpts, do_eval: true, eval_with_do_generation: false, do_gptq: true, unified_checkpoint: true, gptq_step: 4 }对比 gptq_argument.json 原版上述配置做了三个关键改动各有其原因将模型由 LLaMa3-7B 更换为更小的 Qwen2.5-0.5B-Instruct避免在单卡显存有限的情况下超出显存限制将数据集地址改为绝对路径防止相对路径触发如下报错——huggingface_hub.errors.HFValidationError: Repo id must use alphanumeric chars or -, _, ., -- and .. are forbidden, - and . cannot start or end the name, max length is 96: ./data.禁用 bf16 与 fp16fp16: false、fp16_opt_level: O0V100 及之前的显卡无法使用 bf16而使用 fp16 也会导致量化过程出现 NaN典型现象如下[ INFO] - GPTQ layer: 6, qwen2.layers.0.mlp.up_proj [ INFO] - Num examples 128 [ INFO] - Total GPTQ steps 4 [ INFO] - Pre device batch size 8 [ INFO] - Total Batch size 8 quant linear_5 time 0.54 error nan注意最后一行error nan这正是精度类型选择不当导致量化失败的标志。4.3 执行 GPTQ 量化在llm目录下运行量化入口脚本run_quantization.py脚本内部通过PdArgumentParser同时解析 Generate、Quant、Model、Data、SFT 五组参数支持 JSON/YAML/命令行三种传参方式cd ~/PaddleNLP/llm/ python run_quantization.py gptq_argument.json运行过程中会逐层打印量化进度每层输出该层的样本数、总步数、批大小、量化耗时与重建误差error。看到如下提示、且没有出现 NaN即表示量化正常运行[ INFO] - GPTQ layer: 118, qwen2.layers.16.mlp.up_proj [ INFO] - Num examples 128 [ INFO] - Total GPTQ steps 4 [ INFO] - Pre device batch size 8 [ INFO] - Total Batch size 8 quant linear_117 time 0.56 error 27387.02734375error数值表示该层量化重建损失非 NaN 即为正常量级gptq_step控制了总前向步数本配置为 4对应示例数据 128 条、每设备 batch size 8 的规模增大该值通常能提升量化精度但会线性增加耗时。4.4 解读量化后的评估结果量化完成后脚本会对开发集执行评估输出类似如下的指标[ INFO] - ***** eval metrics ***** [ INFO] - eval_accuracy 0.8314 [ INFO] - eval_loss 0.9088 [ INFO] - eval_ppl 2.4813 [ INFO] - eval_runtime 0:00:14.00 [ INFO] - eval_samples_per_second 9.1368 [ INFO] - eval_steps_per_second 1.1421其中eval_accuracy准确率C-Eval 类选择题评估场景、eval_loss交叉熵损失与eval_ppl困惑度是判断量化后模型性能是否可接受的关键指标。若与未量化模型基线相比这些指标未出现明显劣化即可认为量化成功模型权重会按output_dir指定的路径本配置为./checkpoints/gptq_ckpts保存。5. 其他量化方法PTQ / AWQ / W8A8C8 / W8A8(FP8)除了 GPTQ飞桨大模型套件还支持多种量化方法包括 PaddleSlim 团队自研的自适应 PiecewiseSearchSmoothPSS量化算法的 PTQ以及业界主流的 AWQ还有面向不同硬件位宽的 W8A8C8 与 FP8 方案。在 量化教程 的算法介绍中各方法定位如下PTQPaddleSlim 自研的自适应 PiecewiseSearchSmoothPSS量化算法在 SmoothQuant 与 Outlier Suppression 基础上新增 PieceWiseSearch 参数搜索算法并将算法扩展到所有线性层通过对模型权重和激活分布进行调整减少后续 A8W8 PTQ 量化的损失。GPTQ / AWQ业界主流的权重量化算法可将大模型权重进行 4 位整数INT4量化在提升推理速度的同时尽量保持精度。5.1 PTQ 量化PTQ 量化启动命令python run_quantization.py ./config/llama/ptq_argument.json参考配置 ptq_argument.json 展示了 PTQ 的核心用法do_ptq: true开启 PTQsmooth: true开启 Smooth 前置策略smooth_all_linears: true对全部 Linear 层应用 Smoothsmooth_piecewise_search: true启用分段搜索smooth_k_piece: 3设置分段数。从 run_quantization.py 可以看到 PTQ 的完整执行顺序先做 Shift可选→ 再做 Smooth可选→ AutoClip 截断可选→ 最终执行apply_ptq完成量化并保存模型。5.2 AWQ 量化AWQ 量化启动命令python run_quantization.py ./config/llama/awq_argument.json参考配置 awq_argument.json 说明 AWQ 本质是quant_type: weight_only_int4do_awq: true的组合权重按 INT4 groupwise 量化配合smooth: true与auto_clip: true自动搜索截断值并截断权重有利于量化精度但搜索较慢。在 utils/quant.py 的apply_smooth中当do_awq为 True 时会走 AWQ 分支日志输出 Running AWQ。5.3 W8A8C8INT量化W8A8C8INT量化启动命令python run_quantization.py ./config/llama/ptq_c8_argument.json参考配置 ptq_c8_argument.json 的关键在于quant_type: a8w8c8对激活、权重、KV Cache三者均做 INT8 量化并显式指定act_quant_method: avg与cachekv_quant_method: avg_headwise。KV Cache 量化尤其适合长上下文场景可显著降低解码阶段的显存与带宽压力。5.4 W8A8FP8量化W8A8FP8量化启动命令python run_quantization.py ./config/llama/fp8_ptq_argument.json参考配置 fp8_ptq_argument.json 的关键在于quant_type: a8w8_fp8对激活与权重使用 FP88 位浮点量化并通过weight_quant_method: abs_max、act_quant_method: abs_max、cachekv_quant_method: abs_max指定各分量的量化方式。FP8 方案更适合支持 FP8 计算的新一代 GPU 硬件。6. 量化参数总览以下参数定义整理自 量化教程 的 QuantArgument 说明并按类别整理以便查阅。6.1 量化类型与开关参数说明默认值quant_type量化类型不区分大小写a8w8激活 INT8权重 INT8、a8w8c8激活/权重/KV Cache 均 INT8、a8w8_fp8激活/权重 FP8、wint4/weight_only_int4仅权重 INT4WeightOnly 推理、wint8/weight_only_int8仅权重 INT8WeightOnly 推理a8w8fp8_typeFP8 量化类型指定 activation、weight 的 FP8 格式[e4m3,e4m3]do_ptq是否进行 PTQ 量化Falsedo_gptq是否进行 GPTQ 量化WINT4精度较高但耗时较长Falsedo_awq是否进行 AWQ 量化WINT4精度较高Falseload_quant_model是否从output_dir加载量化模型用于验证需do_ptq为 False仅支持 pdparams 格式需设unified_checkpoint: falseFalse需要注意do_ptq、do_gptq、do_qat三者不能同时开启。从 run_quantization.py 源码可见脚本会检查三者同时开启的数量超过 1 个会直接抛出ValueError。6.2 量化方法细分参数参数说明默认值weight_quant_method权重量化方式INT8 可选groupwise或abs_max_channel_wiseFP8 可选abs_max或avg—act_quant_method激活量化方式INT8 可选avg或abs_maxFP8 可选abs_max或avg—cachekv_quant_methodKV Cache 量化方式可选abs_max_headwise、avg_headwise—ptq_stepPTQ 量化步数即模型前向次数32gptq_stepGPTQ 量化步数即模型前向次数8skip_list_names需要量化跳过的层名称列表支持部分字符串匹配如[down_proj]表示跳过所有 FFN2 层空列表6.3 Shift / Smooth 前置策略参数PTQ 量化的精度很大程度上取决于前置的分布调整策略对应 run_quantization.py 中apply_shift/apply_smooth的调用顺序相关参数如下参数说明默认值shift是否在 PTQ 前使用 Shift 策略需do_ptq: trueFalseshift_all_linear是否对所有 Linear 层应用 Shift对非 LayerNorm-Linear 组合的 Linear 也会处理并添加两个 opFalseshift_samplerShift 采样器noneMinMax 计算零点或ema指数平均计算零点noneshift_stepShift 采样步数即模型前向次数32smooth是否在 PTQ 前使用 SmoothQuant 策略需do_ptq: trueFalsesmooth_all_linears是否对所有 Linear 层应用 SmoothFalsesmooth_samplerSmooth 采样器none或multi_step多轮前向需更大显存nonesmooth_stepSmooth 采样步数即模型前向次数32smooth_piecewise_searchSmooth 是否进行分段搜索按数值大小将激活分为 K 段逐段搜索 alpha 与 scaleFalsesmooth_k_piece分段数量经验建议10B 模型设 3100B 模型设 63smooth_search_piece是否搜索分段数量建议配合smooth_k_piece: 6使用搜索耗时较长Falsesearch_alpha_min/search_alpha_max分段搜索时 alpha 的搜索区间0.2 / 0.8search_scale_min/search_scale_max分段搜索时 scale 的搜索区间1.0 / 5.06.4 AWQ 截断参数参数说明默认值auto_clipAWQ 时是否自动搜索截断值并截断权重利于精度但搜索较慢Falseautoclip_stepAutoClip 步数即模型前向次数采样时默认 concat 每轮数据搜索截断值86.5 通用运行参数参数说明默认值per_device_train_batch_size量化前向批大小量化过程只有前向相比普通训练显存占用更少8更多通用参数如src_length、max_length、do_eval、eval_with_do_generation、unified_checkpoint等可参考 精调文档 中的参数介绍。7. 常见问题与调试建议结合教程中的排障记录与 run_quantization.py 的源码逻辑总结如下实践建议显存不足优先换用更小的模型如教程中的 Qwen2.5-0.5B-Instruct或调小per_device_train_batch_size、max_length。量化过程仅含模型前向显存需求本就低于训练但仍受批大小与序列长度约束。出现 NaN优先检查精度配置。V100 及更早的显卡不支持 bf16fp16 在量化时同样容易产生 NaN。此类硬件应设置fp16: false、fp16_opt_level: O0或改为 bf16 可用的新硬件再运行。数据集路径报HFValidationError把dataset_name_or_path改为绝对路径避免./data这类相对路径被 HuggingFace Hub 解析器误判为 repo id。校准数据集缺失量化要求数据目录下存在quant.json或train.json或对应的quant/train子目录否则脚本会报Quant strategy requires quant.json or train.json见 run_quantization.py。LoRA 模型限制PTQ 与 GPTQ 当前不支持 LoRA 模型需先合并 LoRA 参数到基座模型再量化run_quantization.py 中会直接抛出NotImplementedError。8. 进一步阅读本文是 PaddleNLP 大模型量化的入门教程更多技术细节如 PSS 分段搜索的数学原理、各量化算法在 PaddleSlim 中的实现方式、量化后模型的推理部署与 WeightOnly 用法可继续阅读仓库中的 量化文档并结合以下仓库资源深入研究量化入口脚本run_quantization.py量化算法实现Shift / Smooth / AutoClip / PTQ / GPTQ / 量化模型加载utils/quant.py量化参数定义QuantConfigutils/argument.py各量化方案参考配置gptq_argument.json、ptq_argument.json、awq_argument.json、ptq_c8_argument.json、fp8_ptq_argument.jsonC-Eval 校准集抽取脚本prepare_data_for_ptq.py赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐PaddleNLP 大模型量化实战指南GPTQ、PSS-PTQ、AWQ 与 FP8 完整上手教程PaddleNLP 大模型量化实战指南GPTQ、PSS PTQ、AWQ 与 FP8 完整上手教程 导读 本文以 PaddleNLP 官方量化入门教程为核心人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP 大模型量化实战教程PTQ / GPTQ / AWQ 与 W8A8(INT8/FP8) 全流程指南PaddleNLP 大模型量化实战教程PTQ / GPTQ / AWQ 与 W8A8 INT8/FP8 全流程指南 导读 本文以 PaddleNLP 开源仓库人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP 大模型量化实战PTQ / GPTQ / AWQ 与 INT8、FP8 全流程详解PaddleNLP 大模型量化实战PTQ / GPTQ / AWQ 与 INT8、FP8 全流程详解 大模型量化将 16 位、32 位浮点数的模型参数或激活量人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP上一篇GoHBase最佳实践从开发到部署的完整工作流下一篇永久保存微信聊天记录开源工具WeChatMsg完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门