ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

PaddleSeg 模型量化(QAT)实战:从 FP32 训练到 INT8 量化模型产出与部署

PaddleSeg 模型量化(QAT)实战:从 FP32 训练到 INT8 量化模型产出与部署 人工智能计算机视觉预训练【免费下载链接】PaddleSegEasy-to-use image segmentation library with awesome pre-trained model zoo, supporting wide-range of practical tasks in Semantic Segmentation, Interactive Segmentation, Panoptic Segmentation, Image Matting, 3D Segmentation, etc.项目地址https://gitcode.com/gh_mirrors/pa/PaddleSeg点击查看免费下载本教程以 PaddleSeg 官方量化文档为主体结合仓库内deploy/slim/quant/的实际实现系统讲解如何在 PaddleSeg 中使用量化训练QAT方法压缩语义分割模型从量化原理、精度/性能收益到 FP32 模型训练、量化训练、精度验证、预测模型导出与多端部署的完整链路。读完本文你将掌握一套可复现的 INT8 分割模型产出与部署方案并理解其底层实现机制。1 量化概述原理、收益与适用场景1.1 什么是模型量化模型量化是一种常见的模型压缩方法核心思路是使用整数替代浮点数进行存储和计算。以最常见的 8bit 量化为例将 32bit 浮点数转换为 8bit 整数后存储空间可减少约 4 倍32bit ÷ 8bit 4整数运算替换浮点数运算可以加快模型推理速度、降低计算内存在嵌入式设备、移动端等算力和带宽受限场景中量化几乎是分割模型落地的必经之路。1.2 PaddleSeg 的量化方案量化训练QATPaddleSeg 基于 PaddleSlim 集成了**量化训练Quantization Aware TrainingQAT**方法其特点如下维度说明概述使用训练数据在训练过程中模拟量化误差并更新权重从而减小量化损失优点量化模型的精度高使用量化模型预测可以减少计算量、降低计算内存、减小模型大小缺点易用性稍差需要一定时间产出量化模型需要说明的是QAT 需要重新执行一段训练过程来让网络适应量化噪声因此产出周期比直接转换更长但换来的是精度损失通常远小于朴素的后训练量化。此外从仓库实现看PaddleSeg 的量化目录deploy/slim/quant/同时提供了两条路径QAT 路径qat_train.py、qat_val.py、qat_export.py即本文主线静态离线量化PTQ路径ptq.py基于 PaddleSlim 的quant_post_static直接对已导出的 FP32 推理模型做 KL 校准无需重新训练。两条路径的配置细节都集中在 qat_config.py 的quant_config字典中下文会深入解读。2 量化模型的精度与性能表现2.1 测试环境与测试方法文档中给出的官方测试环境如下项目配置GPUV100 32GCPUIntel(R) Xeon(R) Gold 6148 CPU 2.40GHzCUDA10.1cuDNN7.6TensorRT6.0.1.5Paddle2.1.1测试方法要点在 GPU 上使用 TensorRT 分别测试原始 FP32 模型和量化后的 INT8 模型使用 Cityscapes 全量验证数据集1024x2048进行测试单 GPU、Batchsize 为 1运行耗时为纯模型预测时间使用 Paddle Inference 的 Python API 测试通过use_trt参数设置是否使用 TensorRT通过precision参数设置预测类型FP32/INT8。2.2 量化前后精度与性能对照模型类型mIoU耗时(s/img)量化加速比ANN_ResNet50_OS8FP320.79090.281-ANN_ResNet50_OS8INT80.79060.19530.6%DANet_ResNet50_OS8FP320.80270.330-DANet_ResNet50_OS8INT80.80390.26619.4%DeepLabV3P_ResNet50_OS8FP320.80360.206-DeepLabV3P_ResNet50_OS8INT80.80440.08359.7%DNLNet_ResNet50_OS8FP320.79950.360-DNLNet_ResNet50_OS8INT80.79890.23652.5%EMANet_ResNet50_OS8FP320.79050.186-EMANet_ResNet50_OS8INT80.79390.10643.0%GCNet_ResNet50_OS8FP320.79500.228-GCNet_ResNet50_OS8INT80.79590.14436.8%PSPNet_ResNet50_OS8FP320.78830.324-PSPNet_ResNet50_OS8INT80.79150.22332.1%结果解读在 Cityscapes 全量验证集上各模型的 INT8 mIoU 与 FP32 基本持平部分模型如 DANet、DeepLabV3P、EMANet、GCNet、PSPNet甚至略有提升说明 QAT 能在保持精度的前提下完成压缩推理耗时普遍缩短 20% ~ 60%其中DeepLabV3P_ResNet50_OS8 加速比最高达 59.7%DNLNet 也达到 52.5%加速收益与模型结构、算子构成强相关实际部署时应以自己模型在目标硬件上的基准测试为准。3 端到端示例产出并部署一个量化分割模型本节以视盘分割数据集 PP-LiteSeg 模型为例走通训练 FP32 → 量化训练 → 精度验证 → 导出 → 部署的完整流程。3.1 环境准备首先参考 安装文档 准备好 PaddleSeg 的基础环境。注意量化功能要求 PaddlePaddle 版本 2.2。随后安装 PaddleSlim仓库配套的量化训练依赖 PaddleSlim 的QATAPI 和paddleslim.quant模块git clone https://github.com/PaddlePaddle/PaddleSlim.git # 切换到特定 commit id git reset --hard 15ef0c7dcee5a622787b7445f21ad9d1dea0a933 # 安装 python setup.py install说明文档中固定了 PaddleSlim 的 commit id是为了保证与当前 PaddleSeg 版本接口兼容自行安装时如遇 API 变化建议保持与文档一致的版本。3.2 产出量化模型3.2.1 第一步训练 FP32 模型在产出量化模型之前需要提前准备训练或 finetune 好的FP32 模型。此处使用视盘分割数据集和 PP-LiteSeg 模型用 tools/train.py 从头开始训练。train.py输入参数的详细介绍请参考 训练文档。在 PaddleSeg 目录下执行如下脚本会自动下载数据集进行训练# 设置1张可用的GPU卡 export CUDA_VISIBLE_DEVICES0 # windows下请执行以下命令 # set CUDA_VISIBLE_DEVICES0 python tools/train.py \ --config configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml \ --do_eval \ --use_vdl \ --save_interval 250 \ --save_dir output_fp32训练结束后精度最高的权重会保存到output_fp32/best_model目录下。这里所用的示例配置文件 configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml 结构如下量化训练阶段会复用同一份配置数据Dataset类型数据集根目录data/optic_disc_seg训练/验证各 2 类视盘背景输入经ResizeStepScaling、RandomPaddingCrop(512x512)、RandomHorizontalFlip、RandomDistort、Normalize等增强优化器SGDmomentum 0.9weight_decay 4.0e-5学习率调度PolynomialDecay初始学习率 0.01end_lr 0power 0.9损失CrossEntropyLosscoef[1, 1, 1]模型PPLiteSegbackbone 为STDC2带预训练权重。3.2.2 第二步使用量化训练QAT产出量化模型基于训练好的 FP32 权重使用 deploy/slim/quant/qat_train.py 进行量化训练。qat_train.py与train.py的输入参数基本相似关键区别在于量化训练的学习率需要调小示例中由 0.01 降至 0.001使用--model_path参数指定 FP32 模型的权重作为初始化。完整参数说明如下参数名用途是否必选项默认值configFP32 模型的配置文件是-model_pathFP32 模型的预训练权重是-iters训练迭代次数否配置文件中指定值batch_size单卡 batch size否配置文件中指定值learning_rate初始学习率否配置文件中指定值save_dir模型和 visualdl 日志文件的保存根路径否outputnum_workers用于异步读取数据的进程数量大于等于 1 时开启子进程读取数据否0use_vdl是否开启 visualdl 记录训练数据否否save_interval_iters模型保存的间隔步数否1000do_eval是否在保存模型时启动评估启动时将会根据 mIoU 保存最佳模型至 best_model否否log_iters打印日志的间隔步数否10resume_model恢复训练模型路径如output/iter_1000否None执行如下命令进行量化训练。量化训练结束后精度最高的量化模型权重保存在output_quant/best_model目录下python deploy/slim/quant/qat_train.py \ --config configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml \ --model_path output_fp32/best_model/model.pdparams \ --learning_rate 0.001 \ --do_eval \ --use_vdl \ --save_interval 250 \ --save_dir output_quant源码级原理从 qat_train.py 的实现可以看到完整调用链ConfigSegBuilder读取配置并构建模型、数据集、损失与优化器来自paddleseg.cvlibsutils.load_entire_model(model, args.model_path)加载 FP32 预训练权重skip_quant(model)决定哪些层参与量化见下文QAT(configquant_config).quantize(model)对模型做量化改造quant_config来自 qat_config.py最后复用paddleseg.core.train完成带量化的训练循环。skip_quant的逻辑值得注意脚本顶部注释也明确说明Only conv2d and linear in backbone are quantized如果模型具备backbone属性则遍历所有子层将不属于 backbone 的Conv2D和Linear层打上skip_quant True标记即只量化骨干网络而解码头head保持浮点精度——这是为了在压缩收益与分割边界细节精度之间取得平衡若模型没有 backbone如单阶段结构则量化全部目标算子。3.2.3 第三步测试量化模型精度可选如果需要单独验证量化模型的精度可执行如下命令使用 deploy/slim/quant/qat_val.py 加载量化模型权重并评估python deploy/slim/quant/qat_val.py \ --config configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml \ --model_path output_quant/best_model/model.pdparams从 qat_val.py 的源码可以看出它与qat_train.py共享skip_quant与quant_config先对模型做同样的量化改造再加载权重随后调用paddleseg.core.evaluate进行评估脚本还额外支持--aug_eval多尺度翻转增强评估、--is_slide滑窗评估需配合--crop_size与--stride、--data_format NHWC当前仅DeepLabV3P模型支持 NHWC 布局等评估选项。3.2.4 第四步导出量化预测模型基于训练好的量化模型权重使用 deploy/slim/quant/qat_export.py 导出预测量化模型脚本参数如下参数名用途是否必选项默认值config模型配置文件是-model_path量化模型的权重否-save_dir预测量化模型保存的文件夹否./output/inference_modeloutput_op设置在模型末端添加的输出算子支持[argmax, softmax, none]。PaddleSeg 模型默认返回 logitsN*C*H*W添加argmax算子可以得到每个像素的分割类别结果维度是N*H*W、数据类型是int32添加softmax算子可以得到每个像素每类的概率结果维度是N*C*H*W、数据类型是float32否argmaxwith_softmax即将废弃的输入参数建议使用--output_op。在网络末端添加 softmax 算子。由于 PaddleSeg 组网默认返回 logits如果想要部署模型获取概率值可以置为 True否Falsewithout_argmax即将废弃的输入参数建议使用--output_op。由于 PaddleSeg 组网默认返回 logits为部署模型可以直接获取预测结果默认在网络末端添加 argmax 算子。如果设置--without_argmax则不会添加 argmax 算子否False执行如下命令导出预测量化模型并保存到output_quant_infer目录python deploy/slim/quant/qat_export.py \ --config configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml \ --model_path output_quant/best_model/model.pdparams \ --save_dir output_quant_infer导出细节源码级脚本同样执行skip_quantQAT.quantize再通过utils.load_entire_model加载量化权重--without_argmax/--with_softmax为旧参数设置后会输出废弃警告并被映射到--output_op分别对应none/softmax除none外模型末端会包一层WrappedModel来自 paddleseg/deploy/export.py以追加输出算子最终调用quantizer.save_quantized_model生成model.pdmodel推理模型结构与model.pdiparams量化权重默认输入 shape 为[None, 3, None, None]的 float32 张量支持通过--input_shape固定尺寸导出同时会依据验证集 transforms默认Normalize生成deploy.yaml部署配置文件若加--for_fd则生成 FastDeploy 兼容格式inferenceinference.yml。3.3 部署量化模型得到量化预测模型后即可进入部署环节。PaddleSeg 官方针对不同部署形态提供了对应教程Paddle Inference Python 部署Paddle Inference C 部署PaddleLite 部署以 Python 部署为例Paddle Inference 中通过use_trt开关启用 TensorRT、以precision指定 FP32/INT8 预测类型配合导出时生成的deploy.yaml含预处理 transforms 与模型路径即可在服务端或端侧完成 INT8 分割推理。4 量化训练的核心配置与调参要点量化训练的所有超参数集中在 deploy/slim/quant/qat_config.py 的quant_config字典中训练、验证、导出三个脚本统一引用保证量化口径一致配置项默认值含义weight_preprocess_typeNone权重预处理方式默认不做预处理activation_preprocess_typeNone激活预处理方式默认不做预处理weight_quantize_typechannel_wise_abs_max权重量化方式按通道取绝对值最大值做对称量化activation_quantize_typemoving_average_abs_max激活量化方式用滑动平均统计激活绝对值最大值weight_bits8权重量化位数activation_bits8激活量化位数dtypeint8量化后的数据类型如 uint8、int8window_size10000range_abs_max 量化方式使用的窗口大小moving_rate0.9滑动平均衰减系数quantizable_layer_type[Conv2D, Linear]动态图量化时参与量化的层类型调参要点weight_quantize_type采用channel_wise_abs_max而非全局abs_max逐通道统计能显著降低权重量化误差是分割模型精度保持的关键之一激活侧使用moving_average_abs_max在训练过程中以 0.9 的衰减系数持续更新激活值范围估计这就是训练中模拟量化、减小量化损失的具体机制量化训练务必调小学习率官方示例中从 0.01 降到 0.001因为此时权重已在最优邻域附近过大的学习率会破坏已学到的分布如追求更激进的压缩可尝试将weight_bits/activation_bits调至 4 等低位宽但需要自行在精度与收益间权衡官方默认 8bit 方案已由上文表格验证精度无损。5 参考资料PaddleSlim 官方仓库安装命令见 3.1 节请以其中对应版本的接口为准PaddleSlim 文档本文引用的仓库实现qat_train.py、qat_val.py、qat_export.py、qat_config.py、ptq.py示例配置 configs/quick_start/pp_liteseg_optic_disc_512x512_1k.yml一句话总结在 PaddleSeg 中做 INT8 量化标准路径是先训 FP32 → 用qat_train.py低学习率量化训练 →qat_val.py验证 →qat_export.py导出 → 接入 Paddle Inference / PaddleLite 部署官方数据表明该方法可在 Cityscapes 上基本无损地将推理提速 20% ~ 60%。赞分享人工智能计算机视觉预训练【免费下载链接】PaddleSegEasy-to-use image segmentation library with awesome pre-trained model zoo, supporting wide-range of practical tasks in Semantic Segmentation, Interactive Segmentation, Panoptic Segmentation, Image Matting, 3D Segmentation, etc.项目地址https://gitcode.com/gh_mirrors/pa/PaddleSeg点击查看免费下载相关推荐PaddleSeg 模型量化QAT实战基于 PaddleSlim 的语义分割模型 INT8 量化训练与部署指南PaddleSeg 模型量化QAT实战基于 PaddleSlim 的语义分割模型 INT8 量化训练与部署指南 量化感知训练Quantization A人工智能计算机视觉预训练PaddleOCR 模型量化实战指南基于 PaddleSlim 的 QAT 量化感知训练与 INT8 端侧部署PaddleOCR 模型量化实战指南基于 PaddleSlim 的 QAT 量化感知训练与 INT8 端侧部署 本篇技术指南围绕 PaddleOCR 官方文档人工智能计算机视觉OCR深度学习大模型RAGAnomalib 模型部署与压缩实战使用 NNCF 量化训练并导出 OpenVINO INT8 模型Anomalib 模型部署与压缩实战使用 NNCF 量化训练并导出 OpenVINO INT8 模型 导读 本篇文章聚焦 Anomalib https://l人工智能计算机视觉深度学习模型评测上一篇如何 10 分钟调好 ThinkPad 双风扇TPFanCtrl2 风扇控制完整指南下一篇YouTube.js 解析器深入MusicLargeCardItemCarousel 大卡片轮播节点的结构、源码与实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表