PaddleOCR 模型量化实战:基于 PaddleSlim 的 QAT 量化训练、导出与部署全流程指南
2026/9/18 14:37:38 网站建设 项目流程

PaddleOCR 模型量化实战:基于 PaddleSlim 的 QAT 量化训练、导出与部署全流程指南

【免费下载链接】PaddleOCR飞桨多语言OCR工具包(实用超轻量OCR系统,支持80+种语言识别,提供数据标注与合成工具,支持服务器、移动端、嵌入式及IoT设备端的训练与部署) Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80+ languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址: https://gitcode.com/paddlepaddle/PaddleOCR

本文是一份基于 PaddleOCR 开源仓库的模型量化实战指南。复杂模型在带来高性能的同时也存在参数冗余,模型量化通过将 FP32 全精度参数缩减为 INT8 定点数来削减这种冗余,从而在基本不损失精度的前提下减小模型体积、降低计算复杂度并加速推理,尤其适合轻量模型在移动端的部署场景。读完本文,你将掌握使用飞桨模型压缩库 PaddleSlim 对 PaddleOCR 检测/识别模型执行量化训练、导出量化推理模型,并配合 PaddleLite 与 TensorRT 完成 INT8 部署的完整技术方案。

一、量化能带来什么:从 FP32 到 INT8 的收益与适用场景

模型量化是一种将全精度(FP32)权重与激活值映射到低比特定点数(如 INT8)的模型压缩技术。其主要收益体现在两方面:

  • 减小模型参数大小:FP32 每个参数占 4 字节,INT8 仅占 1 字节,理论上模型体积可压缩至原来的约 1/4;
  • 加速计算:低精度乘加运算在移动端 NPU、GPU 等硬件上吞吐更高,推理时延更低。

从 deploy/slim/quantization/README.md 的定位看,量化多适用于轻量模型在移动端的部署:当模型训练完成后,若希望进一步压缩体积并加速预测,即可采用量化方法。PaddleOCR 仓库中的 PP-OCRv3 移动端检测/识别模型(MobileNetV3 骨干 + DB 检测头、SVTR 识别头)是典型的量化对象,仓库提供了配套的量化训练配置,例如 PP-OCRv3_det_cml.yml(蒸馏蒸馏蒸馏框架,Student 为两个 MobileNetV3 轻量模型、Teacher 为 ResNet_vd50 大模型)。

二、量化方案总览:在线量化(QAT)与离线量化

PaddleSlim 为模型压缩提供了剪枝、量化(量化训练与离线量化)、蒸馏、神经网络搜索等能力。针对 PaddleOCR,仓库 deploy/slim/quantization 目录下提供了两个核心量化脚本:

脚本类型作用
quant.py在线量化训练(QAT)加载 FP32 预训练模型,在网络中插入量化和反量化算子并继续训练,让模型参数适应量化误差,效果更好
quant_kl.py离线量化(KL 散度)基于少量校准数据统计激活值分布,直接对已导出的 inference 模型进行静态后量化,无需训练

在线量化训练(QAT)效果更优,是本文推荐的主路径,其完整流程包含五个步骤:

  1. 安装 PaddleSlim;
  2. 准备训练好的模型(预训练权重);
  3. 量化训练(在线 QAT);
  4. 导出量化推理模型;
  5. 量化模型预测部署。

三、步骤一:安装 PaddleSlim

量化训练依赖飞桨模型压缩库 PaddleSlim,通过 pip 安装指定版本即可:

pip3 install paddleslim==2.3.2

仓库内 quant.py 与 export_model.py 均通过from paddleslim.dygraph.quant import QAT引入量化能力,QAT即量化感知训练(Quantization-Aware Training)的动态图实现。

四、步骤二:准备训练好的模型

PaddleOCR 提供了一系列训练好的预训练模型(详见仓库 模型列表)。如果待量化的模型不在列表中,需要先按照常规训练方法得到训练好的 FP32 模型(训练入口为 tools/train.py),量化训练本质上是在该 FP32 模型的基础上继续微调。

以 PP-OCRv3 检测模型为例,下载官方蒸馏训练产出的预训练权重:

# 下载检测预训练模型 wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_distill_train.tar tar xf ch_PP-OCRv3_det_distill_train.tar

五、步骤三:量化训练(在线 QAT)

量化训练代码位于 deploy/slim/quantization/quant.py。其核心流程为:构建数据加载器与模型 → 加载 FP32 预训练权重 → 定义量化策略并调用QAT.quantize(model)在模型中插入量化算子 → 继续执行常规训练。

以 PP-OCRv3 检测模型(蒸馏框架)为例,训练指令如下:

python deploy/slim/quantization/quant.py \ -c configs/det/PP-OCRv3/PP-OCRv3_det_cml.yml \ -o Global.pretrained_model='./ch_PP-OCRv3_det_distill_train/best_accuracy' \ Global.save_model_dir=./output/quant_model_distill/

参数说明:

  • -c:指定训练配置文件,此处为 configs/det/PP-OCRv3/PP-OCRv3_det_cml.yml,其中Architecture.algorithm: Distillation表示蒸馏模型,Student/Student2 为轻量学生模型、Teacher 为大模型且freeze_params: true(教师分支冻结);
  • Global.pretrained_model:FP32 预训练权重路径,量化训练必须加载预训练模型作为起点;
  • Global.save_model_dir:量化训练产出的模型保存目录。

若要量化识别模型,修改配置文件和加载的模型参数即可(例如将配置换成configs/rec/PP-OCRv3/下对应的识别配置文件,并加载相应的识别预训练权重)。

5.1 量化策略参数详解

量化训练效果由量化策略决定,仓库在 quant.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量化后的数据类型,如uint8int8
window_size10000range_abs_max量化方式的滑窗大小
moving_rate0.9滑动平均的衰减系数
quantizable_layer_type["Conv2D", "Linear"]参与量化的层类型,仅对卷积与全连接层做量化

5.2 PACT 激活截断:进一步提升量化精度

观察 quant.py 可以发现,仓库实现了PACT(Parameterized Activation Clipping)层:为激活值引入一个可学习的截断阈值alpha(初始值为 20,带 L2 正则约束),在量化前将激活值裁剪到[-alpha, alpha]区间,从而缩小激活量化范围、减少量化误差。在量化训练主流程中,非冻结分支会以act_preprocess=PACT传入QAT,即通过量化训练同步学习最优的激活截断阈值:

act = None if freeze_params else PACT quanter = QAT(config=quant_config, act_preprocess=act) quanter.quantize(model)

freeze_params由配置中蒸馏模型的冻结标记推导(config["Architecture"]["Models"][key].get("freeze_params", False)),即教师分支冻结时不挂载 PACT。

六、步骤四:导出量化推理模型

量化训练保存的模型不能直接用于预测,需要导出为 inference_model(含inference.pdmodel结构与inference.pdiparams参数):

python deploy/slim/quantization/export_model.py \ -c configs/det/PP-OCRv3/PP-OCRv3_det_cml.yml \ -o Global.checkpoints=output/quant_model/best_accuracy \ Global.save_inference_dir=./output/quant_inference_model

参数说明:

  • Global.checkpoints:量化训练产出的模型权重(即上一步Global.save_model_dir下的best_accuracy);
  • Global.save_inference_dir:量化推理模型的输出目录。

导出脚本 export_model.py 的执行逻辑值得注意:

  • 先以与训练一致的quant_config构建QAT并对模型执行quanter.quantize(model),再加载量化权重,保证导出时算子结构与训练时一致;
  • 对蒸馏模型(algorithm == "Distillation"),会遍历model.model_name_list,将每个子模型(Student/Student2/Teacher)分别导出到save_inference_dir/<子模型名>/inference目录下;
  • 对非蒸馏模型,统一导出到save_inference_dir/inference
  • 导出前会先基于验证集执行一次program.eval评估,日志会打印量化模型的精度指标(如hmean),便于与量化前对比确认精度损失情况。

七、步骤五:量化模型部署

7.1 关键前提:为什么量化后仍需特殊部署?

需要特别强调的是:上述步骤导出的量化模型,参数精度在存储上仍然是 FP32,但数值范围已经是 INT8。这是因为量化后的模型结构之间存在量化和反量化算子,若直接用 FP32 推理引擎跑,相对不量化模型没有加速效果。因此:

  • 移动端部署:量化模型可通过 PaddleLite 的opt模型转换工具完成模型转换,真正落地为 INT8 推理。详细流程参考 移动端模型部署指南;
  • 服务端部署:建议使用 TensorRT,并将推理精度设置为precision=INT8,由 TensorRT 融合量化和反量化算子,才能发挥量化模型的加速收益。

7.2 部署流程速览

  1. 用 PaddleLite 的opt工具将导出的量化 inference 模型转换为移动端可加载的模型格式;
  2. 在移动端(ARM CPU/NPU)按 INT8 精度加载并推理;
  3. 服务端场景则通过 TensorRT INT8 精度运行,获得时延收益。

八、补充方案:离线量化(KL 散度静态量化)

如果不想重新训练,仓库还提供了离线量化脚本 quant_kl.py,基于 KL 散度对已导出的 inference 模型做静态后量化:

  • 输入为已导出的inference.pdmodel/inference.pdiparams(通过Global.inference_model指定,或由Global.pretrained_model所在目录推断);
  • 使用训练/验证数据加载器生成校准样本(sample_generator),统计各层激活值的数值分布;
  • 调用paddleslim.quant.quant_post_static完成静态量化,输出到Global.save_inference_dir

该方案无需训练,适合快速评估量化收益;在线 QAT 方案通常精度更高,适合对精度敏感的场景。

九、量化实战注意事项小结

  1. 量化对象选择:量化更适用于轻量模型(如 MobileNetV3 骨干)的移动端部署,大模型量化收益与精度表现需自行评估;
  2. 预训练权重必须加载:QAT 是基于 FP32 预训练模型的微调,跳过加载直接量化会显著影响精度;
  3. 蒸馏模型导出是逐子模型进行的:导出目录会按子模型名分层,部署时选择需要的分支(通常为 Student);
  4. 速度收益依赖 INT8 后端:FP32 推理引擎下量化模型无加速效果,移动端用 PaddleLiteopt转换,服务端用 TensorRT 并设置precision=INT8
  5. 评估量化前后精度export_model.py导出前会打印验证集指标,应对比量化前后hmean(检测)或acc(识别)等指标,确认精度损失可接受后再上线。

本文所有命令、脚本与配置文件均来自当前仓库,可在此基础上结合自有数据与模型直接复现完整的 PP-OCR 量化训练 → 导出 → 部署链路。

【免费下载链接】PaddleOCR飞桨多语言OCR工具包(实用超轻量OCR系统,支持80+种语言识别,提供数据标注与合成工具,支持服务器、移动端、嵌入式及IoT设备端的训练与部署) Awesome multilingual OCR toolkits based on PaddlePaddle (practical ultra lightweight OCR system, support 80+ languages recognition, provide data annotation and synthesis tools, support training and deployment among server, mobile, embedded and IoT devices)项目地址: https://gitcode.com/paddlepaddle/PaddleOCR

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询