
PaddleOCR 模型自动压缩实战基于 PaddleSlim 的量化训练与蒸馏全流程【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100 languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR本篇围绕 PaddleOCR 仓库 deploy/slim/auto_compression 目录下的自动压缩示例展开以 PP-OCRv4 检测/识别模型为对象通过 PaddleSlim 的AutoCompression接口完成量化训练QAT 知识蒸馏的自动压缩并用 Paddle Inference 的 TensorRT / MKL-DNN 引擎验证压缩前后的精度与耗时。读完本文你可以完整复现压缩流程环境准备、数据集处理、配置文件编写、单卡/多卡启动并掌握预测侧的关键参数int8/fp16、动态 shape 采集、硬件相关调优以及常见问题的定位方法。1. 自动压缩的原理与整体架构自动压缩Auto Compression下文简称 ACT是 PaddleSlim 提供的一站式模型压缩方案在量化训练Quantization-Aware Training, QAT的同时引入教师模型做知识蒸馏以较小的精度损失换取 int8 推理下的显著提速。在 PaddleOCR 的这套示例中被压缩的对象是 PP-OCRv4 系列的 DB 文本检测模型与 SVTR 文本识别模型。从源码结构看整个流程由两个核心脚本驱动run.py压缩训练入口。它通过paddleslim.auto_compression.AutoCompression接口加载静态图推理模型将 PaddleOCR 的数据加载、后处理与指标模块build_dataloader/build_post_process/build_metric作为训练数据供给与精度评估回调接入压缩过程。关键调用见 run.py#L154-L164ac AutoCompression( model_dirglobal_config[model_dir], model_filenameglobal_config[model_filename], params_filenameglobal_config[params_filename], save_dirargs.save_dir, configall_config, train_dataloaderreader_wrapper(train_dataloader, global_config[input_name]), eval_callbackeval_function if rank_id 0 else None, eval_dataloaderreader_wrapper(val_loader, global_config[input_name]), ) ac.compress()其中model_dir / model_filename / params_filename均取自配置文件Global段训练过程中eval_functionrun.py#L67-L114会周期性运行验证集并按model_type分别返回 det 的hmean或 rec 的acc因此训练日志中即可直接读到验证精度。test_ocr.py压缩前后的批量精度 耗时测试脚本基于 Paddle Inference 静态图预测支持 GPUTensorRT与 CPUMKL-DNN两种加速路径输出 min/max/avg 耗时与指标。压缩策略完全由 YAML 配置文件驱动仓库内提供了 4 份现成配置配置模型类型算法ppocrv4_det_qat_dist.yamldetmobileDBppocrv4_det_server_qat_dist.yamldetserverDBppocrv4_rec_qat_dist.yamlrecmobileSVTRppocrv4_rec_server_qat_dist.yamlrecserverSVTR2. 压缩效果 Benchmark原示例给出的 PP-OCRv4 自动压缩量化蒸馏int8效果如下。2.1 PP-OCRv4_detRTX 3090 环境模型策略Metric(hmean)GPU 耗时(ms)ARM CPU 耗时(ms)配置文件PP-OCRv4_mobile_detBaseline72.715.792.0-PP-OCRv4_mobile_det量化蒸馏71.102.394.1det_qat_dist 配置PP-OCRv4_server_detBaseline79.8232.6844.7-PP-OCRv4_server_det量化蒸馏79.2712.3635.0det_server 配置GPU 测试环境RTX 3090cuda 11.7 tensorrt 8.4.2.4 paddle 2.5CPU 测试环境Intel(R) Xeon(R) Gold 6226R12 线程注意PP-OCRv4_server_det 在不完整的数据集上测试预处理流程见 3.2 节仅用于展示自动压缩效果指标不具有严格参考性模型真实表现请以官方 PP-OCRv4 模型文档为准。2.2 PP-OCRv4_detTesla V100 环境模型策略Metric(hmean)GPU 耗时(ms)ARM CPU 耗时(ms)配置文件PP-OCRv4_mobile_detBaseline72.714.7198.4-PP-OCRv4_mobile_det量化蒸馏71.383.3205.2det_qat_dist 配置PP-OCRv4_server_detBaseline79.7750.02159.4-PP-OCRv4_server_det量化蒸馏79.8142.41834.8det_server 配置GPU 测试环境Tesla V100cuda 11.7 tensorrt 8.4.2.4 paddle 2.5.2CPU 测试环境Intel(R) Xeon(R) Gold 6271C12 线程同样存在 server 数据集不完整的前提说明同上。2.3 PP-OCRv4_recTesla V100 环境模型策略Metric(accuracy)GPU 耗时(ms)ARM CPU 耗时(ms)配置文件中文 PP-OCRv4_rec_mobileBaseline78.921.733.3-中文 PP-OCRv4_rec_mobile量化蒸馏78.411.434.0rec_qat_dist 配置中文 PP-OCRv4_rec_serverBaseline81.624.062.5-中文 PP-OCRv4_rec_server量化蒸馏81.032.064.4rec_server 配置GPU 测试环境Tesla V100cuda 11.2 tensorrt 8.0.3.4 paddle 2.5CPU 测试环境Intel(R) Xeon(R) Gold 6271C12 线程整体结论int8 量化蒸馏后GPU 上 mobile det 耗时约为原来的 1/21/3如 3090 上 5.7ms → 2.3msserver det 从 32.6ms 降至 12.3ms3090精度损失普遍在 1 个点以内rec server 甚至持平。CPU 侧提速有限主要是模型计算量本身决定的。3. 自动压缩完整流程3.1 准备环境PaddlePaddle 2.5需支持 TensorRT 编译的 GPU 版本或 CPU 版本PaddleSlim 2.5PaddleOCR本仓库对应示例为 2.7 分支代码安装命令以 Linux pip 为例# 安装 PaddlePaddle 2.5.1CPU 版 python -m pip install paddlepaddle2.5.1 # GPU 版本请根据 CUDA 版本选择对应的 paddlepaddle-gpu 2.5.x 安装以 Ubuntu CUDA 10.2 为例 python -m pip install paddlepaddle-gpu2.5.1.post102 -f paddle 官方 whl 安装页 # 安装 PaddleSlim 2.5从 PaddleSlim 官方仓库 release/2.5 分支安装 pip install paddleslim2.5 # 数据集预处理与增强依赖 pip install scikit-image imgaug获取 PaddleOCR 代码release/2.7 分支git clone -b release/2.7 https://gitcode.com/GitHub_Trending/pa/PaddleOCR.git cd PaddleOCR/ pip install -r requirements.txt适用前提本流程基于 PaddlePaddle 2.5 静态图模式脚本内部调用paddle.enable_static()与 PaddleSlim 2.5请勿混用更高版本组合以免接口不兼容。3.2 准备数据集公开 OCR 数据集可参考本仓库文档 OCR 数据集说明按程序运行提示放置到对应位置即可。3.2.1 PP-OCRv4_det_server 数据集预处理PP-OCRv4_det_server 在原始数据集推理时默认将输入图像最小边缩放到 736然而原始数据集中存在长宽比极大的图像例如 13:1缩放后长边尺寸会非常大实验中最大长边超过 10000这会导致构建 TensorRT 子图时显存不足。为顺利跑通自动压缩流程、展示压缩效果需要剔除长宽比过大的图像处理脚本见 ppocrv4_det_server_dataset_process.py。其筛选逻辑源码#L12-L33为读取datasets/v4_4_test_dataset/label.txt标注逐张读取图像仅保留宽和高均小于 2000 且长宽比小于 2的样本输出到datasets/v4_4_test_dataset_small/并同步生成新的label.txt。注意使用不同数据集时需要修改配置文件中dataset段的数据路径与数据处理transforms部分。3.3 准备预测模型自动压缩的输入是静态图推理模型格式为两个文件model.pdmodel模型结构文件与model.pdiparams权重文件。命名上__model__与__params__分别对应model.pdmodel与model.pdiparams。可从 PaddleOCR 官方模型库官方文档中的模型列表 models_list直接获取 Inference 模型。以中文 PP-OCRv4 为例下载并解压# 识别模型下载 ch_PP-OCRv4_rec_infer.tar 后 tar -xf ch_PP-OCRv4_rec_infer.tar # 检测模型下载 ch_PP-OCRv4_det_infer.tar 后 tar -xf ch_PP-OCRv4_det_infer.tar解压后按 test_ocr_det.sh 中的目录约定放置到deploy/slim/auto_compression/models/下如models/ch_PP-OCRv4_det_infer/与配置文件中model_dir保持一致。3.4 配置文件详解压缩行为由 YAML 配置完整定义以 ppocrv4_det_qat_dist.yaml 为例各段含义如下Global 段模型与任务信息Global: model_type: det model_dir: ./models/ch_PP-OCRv4_det_infer model_filename: inference.pdmodel params_filename: inference.pdiparams algorithm: DBmodel_dir / model_filename / params_filename指向上一步解压的推理模型model_type决定验证阶段使用 det 还是 rec 的后处理与指标见 run.py#L97-L113algorithm声明网络算法DB / SVTR。rec 配置额外包含character_dict_path指向 ppocr_keys_v1.txt、max_text_length: 25、use_space_char: true等字段。Distillation 段蒸馏策略Distillation: alpha: 1.0 loss: l2alpha为蒸馏 loss 权重loss为蒸馏损失类型。det 模型使用简单的l2损失而 rec mobile 配置ppocrv4_rec_qat_dist.yaml#L11-L16针对 SVTR 的两个关键节点分别蒸馏Distillation: alpha: [1.0, 1.0] loss: [skd, l2] node: - [softmax_11.tmp_0] - [linear_170.tmp_1]即对 attention 的 softmax 输出节点用 SKDSoftmax KLDiv损失、对分类层输出节点用 L2 损失分别以权重 1.0 参与总 loss。QuantAware 段量化配置四份配置一致QuantAware: use_pact: false activation_bits: 8 is_full_quantize: false onnx_format: false activation_quantize_type: moving_average_abs_max weight_quantize_type: channel_wise_abs_max not_quant_pattern: - skip_quant quantize_op_types: - conv2d weight_bits: 8激活与权重均为 8bitint8激活量化用moving_average_abs_max滑动平均绝对最大值权重用channel_wise_abs_max按通道is_full_quantize: false表示非全量化仅conv2d算子参与量化quantize_op_types名字匹配skip_quant的节点跳过not_quant_pattern。TrainConfig 段训练超参TrainConfig: epochs: 2 eval_iter: 200 learning_rate: type: CosineAnnealingDecay learning_rate: 0.000005 optimizer_builder: optimizer: type: Adam weight_decay: 5.0e-05run.py#L140-L146 中会在启动时根据len(train_dataloader) * epochs自动计算 Cosine 调度的T_max因此无需手动填写。det mobile 配置 2 个 epoch、lr 5e-6det/rec server 配置 1 个 epochrec 的 lr 为 1e-5。PostProcess / Metric 段det 使用DBPostProcessthresh 0.3、box_thresh 0.6、unclip_ratio 1.5DetMetric主指标 hmeanrec 使用CTCLabelDecodeRecMetric主指标 acc。Train / Eval 段数据集与批处理det 训练用SimpleDataSettransforms 包含IaaAugment翻转/±10° 仿射/0.5~3 倍缩放、EastRandomCropData960×960 随机裁剪、MakeBorderMap/MakeShrinkMapDB 损失所需的边界/收缩图batch_size_per_card: 4验证用DetResizeForTestlimit_side_len 960。rec 训练用MultiScaleDataSetMultiScaleSamplerscales 为 [320,32]/[320,48]/[320,64]first_bs 64并启用RecConAug概率 0.5 的上下文增强与NRTRLabelEncode。3.5 启动自动压缩配置完成后通过run.py启动内部即调用paddleslim.auto_compression.AutoCompression完成量化训练与蒸馏。单卡启动cd deploy/slim/auto_compression export CUDA_VISIBLE_DEVICES0 python run.py --save_dir./save_quant_ppocrv4_det/ \ --config_path./configs/ppocrv4/ppocrv4_det_qat_dist.yaml多卡启动训练数据量大时可用分布式训练获得接近线性的加速export CUDA_VISIBLE_DEVICES0,1,2,3 python -m paddle.distributed.launch run.py \ --save_dir./save_quant_ppocrv4_det/ \ --config_path./configs/ppocrv4/ppocrv4_det_qat_dist.yaml多卡训练将数据读取、前向与反向梯度计算拆分到多个节点梯度在参数服务器聚合更新。一轮训练实际消耗batch_size * num_gpus个样本例如单卡 batch size 32 时单轮数据量为 32四卡 batch size 32 时单轮数据量为 128。学习率与 batch size 的线性关系learning rate与batch size呈线性关系。单卡 batch size 8 对应 lr 0.00005则 batch size 增大 4 倍到 32 时lr 也要乘以 4多卡训练时 batch size 为 8 的情况下lr 还需乘以卡数。因此改变 batch size 或训练卡数时都必须同步修改 learning rate。验证精度压缩过程中run.py已通过eval_callback周期性验证日志输出 hmean/acc可直接观察训练精度曲线。若需对产出的压缩模型单独重新验证可按 test_ocr.py 的方式指定模型目录跑一遍验证集修改配置文件Global段的model_dir, model_filename, params_filename指向待验证模型即可注意model_filename/params_filename默认为inference.pdmodel/inference.pdiparams即 test_ocr.py#L253-L264 中的默认值。4. 预测部署Paddle Inference 验证性能输出的量化模型仍是静态图模型GPU 上可用 TensorRT 加速CPU 上可用 MKL-DNN 加速。TensorRT 预测的前置条件Paddle 需以WITH_TRTON编译安装3.1 节按官方 whl 安装的 2.5 GPU 版即满足另需安装 TensorRT安装方式参见 Paddle 官方文档的 TensorRT 安装说明。4.1 预测参数说明参数名含义model_pathinference 模型文件所在目录该目录下需要有 .pdmodel 和 .pdiparams 两个文件model_filename模型目录下的模型文件名test_ocr.py 默认 inference.pdmodelparams_filename模型目录下的参数文件名test_ocr.py 默认 inference.pdiparamsconfig_path压缩配置 YAML从中读取 Global/PostProcess/Metric 段test_ocr.py 中为--config_pathdataset_config数据集配置的 config由 config_path 中的 Eval 段提供image_file待测试单张图片路径若设置则 dataset_config 无效device预测设备可选CPU、GPUuse_trt是否使用 TensorRT 引擎device 为GPU时生效use_mkldnn是否启用 MKL-DNN 加速库device 为CPU时生效cpu_threadsCPU 预测线程数默认 10precision预测精度可选fp32、fp16、int8test_ocr.py的命令行参数源码#L245-L291即对应上表--model_path、--config_path、--model_filename、--params_filename、--deviceCPU/GPU默认 GPU、--precisionfp32/fp16/int8、--use_trt、--use_mkldnn、--cpu_threads默认 10。4.2 使用测试脚本进行批量测试仓库提供两个一键脚本 test_ocr_det.sh 与 test_ocr_rec.sh均接收model_type参数mobile/server会依次执行压缩训练run.py→ GPU fp32 基线测试 → GPU int8 压缩模型测试 → CPU fp32/int8 MKL-DNN 测试并在注释中标注了预期指标脚本头部要求 CUDA11.7 TensorRT8.4.2.4 Paddle2.5.2rec 脚本为 CUDA11.2 TensorRT8.0.3.4cd deploy/slim/auto_compression # 测试 mobile 模型 bash test_ocr_det.sh mobile bash test_ocr_rec.sh mobile # 测试 server 模型 bash test_ocr_det.sh server bash test_ocr_rec.sh server4.3 手动指定模型进行批量测试基于压缩模型进行 GPU 批量测试int8 TensorRTcd deploy/slim/auto_compression python test_ocr.py \ --model_path save_quant_ppocrv4_det \ --config_path configs/ppocrv4/ppocrv4_det_qat_dist.yaml \ --device GPU \ --use_trt True \ --precision int8基于压缩前模型基线进行 GPU 批量测试fp32cd deploy/slim/auto_compression python test_ocr.py \ --model_path ch_PP-OCRv4_det_infer \ --config_path configs/ppocrv4/ppocrv4_det_qat_dist.yaml \ --device GPU \ --use_trt True \ --precision fp32基于压缩模型进行 CPU 批量测试MKL-DNN int8cd deploy/slim/auto_compression python test_ocr.py \ --model_path save_quant_ppocrv4_det \ --config_path configs/ppocrv4/ppocrv4_det_qat_dist.yaml \ --device CPU \ --use_mkldnn True \ --precision int8 \ --cpu_threads 10注意基线模型应使用 fp32 对比与 test_ocr_det.sh#L16-L22 中--precision fp32的用法一致CPU 测试的 device 参数应为CPU脚本中使用 12 线程。4.4 源码级细节动态 shape 采集与硬件分支阅读 test_ocr.py 可以理解两个工程要点TensorRT 动态 shape 两阶段流程源码#L102-L145首次运行时若模型目录下不存在dynamic_shape.txt脚本先调用collect_shape_range_info采集输入形状范围并打印 Start collect dynamic shape...然后要求重跑一次此时读取该文件并enable_tuned_tensorrt_dynamic_shape才能得到正确结果。为避免整体验证集过大采集阶段会用find_images_with_bounding_size源码#L43-L74挑出最宽、最长、最窄、最短四张图组成 4 样本子集做形状收集源码#L163-L170。CPU int8 的 MKL-DNN 调优源码#L91-L100enable_mkldnn_int8({conv2d})仅对卷积开启 int8当模型为 rec 时会删除fc_mkldnn_pass与fc_act_mkldnn_fuse_pass两条融合 pass 以避免精度受损。5. PaddleLite 端侧部署压缩产出的静态图模型同样适用于移动端部署Paddle Lite 的部署方法可参考本仓库 deploy/lite/readme.md包括 Lite 转换工具使用与 C 侧推理示例。6. FAQ6.1 报错找不到模型文件或者数据集文件检查配置文件中的路径是否正确。以 det mobile 为例模型路径配置Global: model_dir: ./models/ch_PP-OCRv4_det_infer model_filename: inference.pdmodel params_filename: inference.pdiparams训练/验证数据集路径配置需与实际数据目录一致Train: dataset: name: SimpleDataSet data_dir: datasets/chinese label_file_list: - datasets/chinese/zhongce_training_fix_1.6k.txt - datasets/chinese/label_train_all_f4_part2.txt - datasets/chinese/label_train_all_f4_part3.txt - datasets/chinese/label_train_all_f4_part4.txt - datasets/chinese/label_train_all_f4_part5.txt - datasets/chinese/synth_en_my_clip.txt - datasets/chinese/synth_ch_my_clip.txt - datasets/chinese/synth_en_my_largeword_clip.txt Eval: dataset: name: SimpleDataSet data_dir: datasets/v4_4_test_dataset label_file_list: - datasets/v4_4_test_dataset/label.txt这些路径均相对于运行目录即deploy/slim/auto_compression/模型放在其models/子目录、数据放在其datasets/子目录下。6.2 软件环境一致但硬件不同导致精度差异很大这是正常现象TensorRT 针对不同硬件有不同的图优化策略同一配置在 V100 与 RTX 3090 上表现可能截然不同。以 ppocrv4_det_server 为例test_ocr.py#L113-L136 中专门做了硬件分支if args.precision int8 and ppocrv4_det_server_qat_dist.yaml in args.config_path: # Use the following settings only when the hardware is a Tesla V100. If you are using # a RTX 3090, use the settings in the else branch. pred_cfg.enable_tensorrt_engine( workspace_size1 30, max_batch_size1, min_subgraph_size30, precision_modeprecision_map[args.precision], use_staticTrue, use_calib_modeFalse, ) pred_cfg.exp_disable_tensorrt_ops([elementwise_add]) else: pred_cfg.enable_tensorrt_engine( workspace_size1 30, max_batch_size1, min_subgraph_size4, precision_modeprecision_map[args.precision], use_staticTrue, use_calib_modeFalse, )差异点V100 上使用更大的min_subgraph_size30并通过exp_disable_tensorrt_ops([elementwise_add])将elementwise_add排除在 TRT 子图之外RTX 3090 使用min_subgraph_size4。在 Tesla V100 上必须采用 if 分支的设置才能保证量化后精度不下降具体结果见第 2 节 Benchmark 对比。由此可以推断如果你更换 GPU 型号且 int8 精度明显劣化应优先调整min_subgraph_size与被排除的 TRT 算子列表。7. 相关文件导航文件说明deploy/slim/auto_compression/README.md本示例原始文档deploy/slim/auto_compression/run.py自动压缩训练入口AutoCompressiondeploy/slim/auto_compression/test_ocr.py精度 耗时批量测试TensorRT / MKL-DNNdeploy/slim/auto_compression/test_ocr_det.shdet 一键测试脚本含预期指标deploy/slim/auto_compression/test_ocr_rec.shrec 一键测试脚本含预期指标deploy/slim/auto_compression/ppocrv4_det_server_dataset_process.pydet_server 数据集长宽比过滤脚本configs/ppocrv4/四份 det/rec × mobile/server 压缩配置deploy/lite/readme.mdPaddle Lite 端侧部署参考docs/datasets/ocr_datasets.md公开 OCR 数据集说明【免费下载链接】PaddleOCRTurn any PDF or image document into structured data for your AI. A powerful, lightweight OCR toolkit that bridges the gap between images/PDFs and LLMs. Supports 100 languages.项目地址: https://gitcode.com/GitHub_Trending/pa/PaddleOCR创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考