PaddleOCR 模型自动压缩实战:基于 PaddleSlim 量化训练与蒸馏的检测/识别模型压缩与部署指南
【免费下载链接】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 仓库中的 deploy/slim/auto_compression 示例,系统讲解如何对 PP-OCRv4 检测(det)与识别(rec)Inference 模型执行自动压缩。你将掌握从环境准备、数据集处理、压缩配置解读、单卡/多卡启动压缩,到 TensorRT / MKLDNN 性能验证与 PaddleLite 端侧部署的完整流程,并理解量化训练(QAT)与蒸馏两类策略在 OCR 模型上的工程落地细节。
1. 自动压缩的背景与原理
模型自动压缩是指在不显著损失精度的前提下,通过一系列自动化策略缩小模型体积、提升推理速度的过程。本示例使用的自动压缩策略为量化训练(Quantization Aware Training,QAT)与蒸馏(Distillation):
- 量化训练:在训练过程中对权重和激活进行 8 bit 量化感知训练,让模型参数逐步适应低比特表示,从而在部署时获得 INT8 推理加速能力;
- 蒸馏:以压缩前的原始模型(Baseline)作为教师网络,将知识迁移给学生网络(量化模型),用于弥补量化带来的精度损失。
从 run.py 的源码可以看到,整个压缩流程最终由 PaddleSlim 的paddleslim.auto_compression.AutoCompression接口统一驱动:
ac = AutoCompression( model_dir=global_config["model_dir"], model_filename=global_config["model_filename"], params_filename=global_config["params_filename"], save_dir=args.save_dir, config=all_config, train_dataloader=reader_wrapper(train_dataloader, global_config["input_name"]), eval_callback=eval_function if rank_id == 0 else None, eval_dataloader=reader_wrapper(val_loader, global_config["input_name"]), ) ac.compress()其中训练/验证数据加载复用 PaddleOCR 的ppocr.data.build_dataloader,后处理与评估指标复用ppocr.postprocess.build_post_process与ppocr.metrics.build_metric(见 run.py),因此压缩流程与 PaddleOCR 训练体系完全打通:检测模型以hmean为指标,识别模型以acc为指标(见 run.py)。
从源码结构看,整个自动压缩示例是一个"PaddleSlim 压缩引擎 + PaddleOCR 数据/后处理/评估生态"的组合,你只需提供 Inference 模型、数据集和一份压缩策略配置,即可一键完成压缩。
2. 压缩效果 Benchmark
以下为仓库示例中 PP-OCRv4 检测与识别模型在自动压缩前后的精度与耗时对比(数据均来自 README.md)。
2.1 PP-OCRv4_det
RTX 3090 测试环境(CUDA 11.7 + TensorRT 8.4.2.4 + Paddle 2.5;CPU:Intel Xeon Gold 6226R,12 线程):
| 模型 | 策略 | Metric(hmean) | GPU 耗时(ms) | ARM CPU 耗时(ms) | 配置文件 |
|---|---|---|---|---|---|
| PP-OCRv4_mobile_det | Baseline | 72.71 | 5.7 | 92.0 | - |
| PP-OCRv4_mobile_det | 量化+蒸馏 | 71.10 | 2.3 | 94.1 | ppocrv4_det_qat_dist.yaml |
| PP-OCRv4_server_det | Baseline | 79.82 | 32.6 | 844.7 | - |
| PP-OCRv4_server_det | 量化+蒸馏 | 79.27 | 12.3 | 635.0 | ppocrv4_det_server_qat_dist.yaml |
Tesla V100 测试环境(CUDA 11.7 + TensorRT 8.4.2.4 + Paddle 2.5.2;CPU:Intel Xeon Gold 6271C,12 线程):
| 模型 | 策略 | Metric(hmean) | GPU 耗时(ms) | ARM CPU 耗时(ms) | 配置文件 |
|---|---|---|---|---|---|
| PP-OCRv4_mobile_det | Baseline | 72.71 | 4.7 | 198.4 | - |
| PP-OCRv4_mobile_det | 量化+蒸馏 | 71.38 | 3.3 | 205.2 | ppocrv4_det_qat_dist.yaml |
| PP-OCRv4_server_det | Baseline | 79.77 | 50.0 | 2159.4 | - |
| PP-OCRv4_server_det | 量化+蒸馏 | 79.81 | 42.4 | 1834.8 | ppocrv4_det_server_qat_dist.yaml |
说明:PP-OCRv4_server_det 在不完整的数据集上测试(数据处理流程见下文 3.2 节),仅用于展示自动压缩效果,指标不具备参考性,模型真实表现请以 PaddleOCR 官方模型评测为准。
2.2 PP-OCRv4_rec
Tesla V100 测试环境(CUDA 11.2 + TensorRT 8.0.3.4 + Paddle 2.5;CPU:Intel Xeon Gold 6271C,12 线程):
| 模型 | 策略 | Metric(accuracy) | GPU 耗时(ms) | ARM CPU 耗时(ms) | 配置文件 |
|---|---|---|---|---|---|
| 中文 PP-OCRv4-rec_mobile | Baseline | 78.92 | 1.7 | 33.3 | - |
| 中文 PP-OCRv4-rec_mobile | 量化+蒸馏 | 78.41 | 1.4 | 34.0 | ppocrv4_rec_qat_dist.yaml |
| 中文 PP-OCRv4-rec_server | Baseline | 81.62 | 4.0 | 62.5 | - |
| 中文 PP-OCRv4-rec_server | 量化+蒸馏 | 81.03 | 2.0 | 64.4 | ppocrv4_rec_server_qat_dist.yaml |
从上述数据可以看出:INT8 量化在 GPU 上通常能带来约 1.5~2.6 倍的推理加速(如 det_server 在 RTX 3090 上由 32.6ms 降至 12.3ms),精度损失大多控制在 1 个百分点以内;CPU(MKLDNN)端加速幅度相对有限,但精度基本保持。
3. 自动压缩流程
整体流程分为四步:准备环境 → 准备数据集 → 准备预测模型 → 配置并启动压缩。
3.1 准备环境
版本要求:
- PaddlePaddle == 2.5(需开启 TensorRT 编译选项的版本才能使用 TensorRT 预测)
- PaddleSlim == 2.5
- PaddleOCR == develop
安装 PaddlePaddle(以 2.5.1 为例):
# CPU 版本 python -m pip install paddlepaddle==2.5.1 -i https://pypi.tuna.tsinghua.edu.cn/simple # GPU 版本,以 Ubuntu、CUDA 10.2 为例 python -m pip install paddlepaddle-gpu==2.5.1.post102 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html安装 PaddleSlim 2.5(从 PaddleSlim 仓库的release/2.5分支安装):
pip install paddleslim@git+https://gitee.com/paddlepaddle/PaddleSlim.git@release/2.5安装其他依赖:
pip install scikit-image imgaug获取 PaddleOCR 代码并安装依赖:
git clone -b release/2.7 https://github.com/PaddlePaddle/PaddleOCR.git cd PaddleOCR/ pip install -r requirements.txt3.2 准备数据集
公开 OCR 数据集可参考仓库 docs/datasets 下的说明(如 ocr_datasets.md),随后按照程序运行时的提示,将数据放置到配置文件中对应的位置。
注意:使用不同的数据集时,需要同步修改配置文件中
dataset部分的数据路径(data_dir)和数据处理(transforms)部分。
3.2.1 PP-OCRv4_det_server 数据集预处理
PP-OCRv4_det_server 推理时默认将输入图像的最小边缩放到 736,但原始数据集中存在大量长宽比极大的图像(如 13:1)。此时按最小边缩放后,长边会被放大到极大尺寸——实测中发现最大长边可达 10000+,会在构建 TensorRT 子图时导致显存不足。
为解决这一问题,仓库提供了预处理脚本 ppocrv4_det_server_dataset_process.py,其核心逻辑是剔除长宽比过大的图像:仅保留高度和宽度都小于 2000、且长宽比小于 2 的图像,并将这些图像连同标注拷贝到新的数据集目录(datasets/v4_4_test_dataset_small):
if height < 2000 and width < 2000: if max(height, width) / min(height, width) < 2: small_image_path = os.path.join(small_images_path, image_name) cv2.imwrite(small_image_path, image) with open(new_annotation_file, "a") as f: f.write(f"{line}")处理完成后,将 ppocrv4_det_server_qat_dist.yaml 中Eval.dataset的data_dir与label_file_list指向新目录即可。
3.3 准备预测模型
自动压缩的输入是 PaddleOCR 的Inference 预测模型,格式要求为两个文件:
model.pdmodel:模型结构文件(__model__与其等价);model.pdiparams:权重参数文件(__params__与其等价)。
可在 PaddleOCR 模型库中直接获取 Inference 模型,以中文 PP-OCRv4 为例:
# 下载识别模型 wget https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_rec_infer.tar tar -xf ch_PP-OCRv4_rec_infer.tar # 下载检测模型 wget https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_det_infer.tar tar -xf ch_PP-OCRv4_det_infer.tar解压后得到inference.pdmodel与inference.pdiparams,将目录放置到配置文件Global.model_dir指定的位置(示例默认放在./models/下)。
4. 压缩策略配置详解
自动压缩由 run.py 启动,通过--config_path传入 YAML 配置。配置包含Global、Distillation、QuantAware、TrainConfig、PostProcess、Metric、Train、Eval等区块,仓库提供了 4 份可直接使用的配置:
| 配置 | 适用模型 |
|---|---|
| ppocrv4_det_qat_dist.yaml | PP-OCRv4 mobile 检测模型 |
| ppocrv4_det_server_qat_dist.yaml | PP-OCRv4 server 检测模型 |
| ppocrv4_rec_qat_dist.yaml | PP-OCRv4 mobile 识别模型 |
| ppocrv4_rec_server_qat_dist.yaml | PP-OCRv4 server 识别模型 |
4.1 Global:模型与任务信息
Global: model_type: det # 任务类型:det 或 rec model_dir: ./models/ch_PP-OCRv4_det_infer # Inference 模型目录 model_filename: inference.pdmodel # 模型文件名 params_filename: inference.pdiparams # 参数文件名 algorithm: DB # 检测算法(DB)识别模型还会额外指定字符字典与文本长度:
Global: model_dir: ./models/ch_PP-OCRv4_rec_infer model_filename: inference.pdmodel params_filename: inference.pdiparams model_type: rec algorithm: SVTR character_dict_path: ./ppocr_keys_v1.txt # 字符字典(仓库提供 ppocr_keys_v1.txt) max_text_length: &max_text_length 25 # 最大文本长度(YAML 锚点,供 transforms 复用) use_space_char: truemodel_type同时决定了run.py中评估指标的选择与后处理方式(见 run.py)。
4.2 Distillation:蒸馏配置
检测模型使用简单的 L2 特征蒸馏:
Distillation: alpha: 1.0 # 蒸馏损失权重 loss: l2 # L2 距离损失识别 mobile 模型则同时使用两类蒸馏损失(soft label 蒸馏 + L2 特征蒸馏),并指定蒸馏的中间节点:
Distillation: alpha: [1.0, 1.0] # 两种损失各自的权重 loss: ['skd', 'l2'] # skd: soft label 蒸馏;l2: 特征蒸馏 node: - ['softmax_11.tmp_0'] # 教师/学生网络的输出节点 - ['linear_170.tmp_1']识别 server 模型同样使用 L2 蒸馏。可见识别任务对蒸馏策略更精细,这与其精度指标(acc)更敏感于量化误差有关。
4.3 QuantAware:量化参数
QuantAware: use_pact: false # 是否使用 PACT 量化方法 activation_bits: 8 # 激活量化比特数 is_full_quantize: false # 是否全量化(false 时部分算子保持浮点) onnx_format: false # 是否使用 ONNX 量化格式 activation_quantize_type: moving_average_abs_max # 激活量化方式(滑动平均绝对值最大) weight_quantize_type: channel_wise_abs_max # 权重量化方式(逐通道绝对值最大) not_quant_pattern: - skip_quant # 包含该模式名的算子不参与量化 quantize_op_types: - conv2d # 仅量化 conv2d 算子 weight_bits: 8 # 权重量化比特数这套参数在检测与识别四个配置中保持一致:8 bit 量化、仅量化卷积算子、moving_average_abs_max激活量化与channel_wise_abs_max权重量化是 OCR 模型精度保持较好的常见组合。
4.4 TrainConfig:压缩训练超参
TrainConfig: epochs: 2 # 压缩训练轮数(server 配置为 1) eval_iter: 200 # 每训练 200 个 iter 评估一次 learning_rate: type: CosineAnnealingDecay # 余弦退火学习率 learning_rate: 0.000005 optimizer_builder: optimizer: type: Adam weight_decay: 5.0e-05从 run.py 可以看到,当学习率调度器为CosineAnnealingDecay时,脚本会自动根据len(train_dataloader) * epochs计算并注入T_max(总训练步数):
if all_config["TrainConfig"]["learning_rate"]["type"] == "CosineAnnealingDecay": steps = len(train_dataloader) * all_config["TrainConfig"]["epochs"] all_config["TrainConfig"]["learning_rate"]["T_max"] = steps因此你无需手动设置T_max。
4.5 PostProcess 与 Metric:评估管线
# 检测模型 PostProcess: name: DBPostProcess thresh: 0.3 # DB 二值化阈值 box_thresh: 0.6 # 文本框置信度阈值 max_candidates: 1000 unclip_ratio: 1.5 # 文本框扩张比例 Metric: name: DetMetric main_indicator: hmean # 检测主指标:hmean # 识别模型 PostProcess: name: CTCLabelDecode # CTC 解码 Metric: name: RecMetric main_indicator: acc # 识别主指标:acc ignore_space: False在 run.py 的eval_function中,build_post_process与build_metric分别按上述配置构建后处理与评估器,det类型将预测输出包装为{"maps": preds}后送入DBPostProcess,rec类型则直接送入CTCLabelDecode。
4.6 Train / Eval:数据管线
检测模型的训练集使用SimpleDataSet,包含 7 个标注文件并按ratio_list配比采样,数据增强链为:
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 # ... 其余标注文件 ratio_list: [0.3, 0.2, 0.1, 0.2, 0.2, 0.1, 0.2] # 各标注文件采样比例 transforms: - DecodeImage: { img_mode: BGR, channel_first: false } - DetLabelEncode: null - IaaAugment: # 随机水平翻转 / 仿射旋转(-10~10度) / 缩放(0.5~3) - EastRandomCropData: # 960x960 随机裁剪 - MakeBorderMap: # DB 边界图生成 - MakeShrinkMap: # 文本收缩图生成 - NormalizeImage: { scale: 1./255., mean: [0.485,0.456,0.406], std: [0.229,0.224,0.225] } - ToCHWImage: null - KeepKeys: { keep_keys: [image, threshold_map, threshold_mask, shrink_map, shrink_mask] } loader: shuffle: true batch_size_per_card: 4 # mobile 配置;server 配置为 2 num_workers: 4 # server 配置为 8验证集使用DetResizeForTest(limit_side_len: 960,limit_type: max),与检测推理预处理保持一致。
识别模型的训练集使用MultiScaleDataSet+MultiScaleSampler多尺度采样:
Train: dataset: name: MultiScaleDataSet data_dir: datasets/real_data/ label_file_list: - datasets/real_data/train_list.txt transforms: - DecodeImage: { img_mode: BGR, channel_first: false } - RecConAug: { prob: 0.5, ext_data_num: 2, image_shape: [48, 320, 3], max_text_length: 25 } - RecAug: null - MultiLabelEncode: { gtc_encode: NRTRLabelEncode } # 同时生成 CTC 与 GTC 标签 - KeepKeys: { keep_keys: [image, label_ctc, label_gtc, length, valid_ratio] } sampler: name: MultiScaleSampler scales: [[320, 32], [320, 48], [320, 64]] # 多种宽高尺度 first_bs: &bs 64 fix_bs: false divided_factor: [8, 16] is_training: True loader: shuffle: true batch_size_per_card: *bs drop_last: true num_workers: 8验证集使用RecResizeImg(image_shape: [3, 48, 320])将识别图像统一缩放到 48×320。
5. 启动自动压缩
配置好模型路径与数据集路径后即可启动压缩。
单卡启动:
export CUDA_VISIBLE_DEVICES=0 python run.py --save_dir='./save_quant_ppocrv4_det/' --config_path='./configs/ppocrv4/ppocrv4_det_qat_dist.yaml'run.py支持--save_dir(压缩模型输出目录,默认output)、--config_path(压缩策略配置,必填)、--devices(默认gpu)三个参数,具体见 run.py。
多卡启动:
若训练数据量很大,单卡训练耗时较长,可使用分布式训练获得近似线性的加速比:
export CUDA_VISIBLE_DEVICES=0,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 的联动关系:学习率与 batch size 近似线性相关。示例中单卡 batch size 为 8 时学习率为 0.00005;若 batch size 扩大 4 倍至 32,学习率也应乘以 4;多卡时 batch size 为 8,学习率需乘以卡数。因此改变 batch size 或训练卡数时,必须同步调整学习率。
验证精度:
压缩过程中可通过训练日志观察验证精度。若需在压缩完成后再次验证,可修改配置文件中model_dir、model_filename、params_filename指向所需验证的模型,然后执行:
export CUDA_VISIBLE_DEVICES=0 python eval.py --config_path='./configs/ppocrv3_det_qat_dist.yaml'注:示例目录当前并未包含独立的
eval.py文件,压缩过程中的精度评估由run.py内置的eval_function完成(见 run.py),评估逻辑与上述命令一致,也可参考 test_ocr.py 进行推理验证。
6. 预测部署与性能验证
压缩输出的量化模型同样是静态图模型:在 GPU 上可使用 TensorRT 加速,在 CPU 上可使用 MKLDNN 加速。
TensorRT 预测环境要求:
- 使用 TensorRT 预测引擎需安装
WITH_TRT=ON编译的 Paddle,上述 Paddle 2.5 版本已满足要求; - 需额外安装 TensorRT,具体安装方式可参考仓库中 docs/version3.x/inference_deployment 下的部署文档。
6.1 Paddle Inference 参数说明
test_ocr.py 用于基于 Paddle Inference 的批量性能与精度测试,关键参数如下:
| 参数名 | 含义 |
|---|---|
| model_path | inference 模型文件所在目录,目录下需包含.pdmodel和.pdiparams两个文件 |
| model_filename | 模型文件名称,默认inference.pdmodel |
| params_filename | 参数文件名称,默认inference.pdiparams |
| dataset_config / config_path | 数据集配置的 config 路径 |
| image_file | 待测试单张图片路径(若设置 image_file,则 dataset_config 失效) |
| device | 预测设备,可选CPU、GPU |
| use_trt | 是否使用 TensorRT 预测引擎,device为GPU时生效 |
| use_mkldnn | 是否启用 MKLDNN 加速库,device为CPU时生效 |
| cpu_threads | CPU 预测线程数,默认 10 |
| precision | 预测精度,可选fp32、fp16、int8 |
从源码可以看到,load_predictor(test_ocr.py)在开启 TensorRT 时会先检查dynamic_shape.txt是否存在:
- 若不存在,则调用
collect_shape_range_info收集输入动态 shape 范围并写入该文件,随后提示"Please rerun the program"(程序仅跑 3 个 batch 即退出); - 若已存在,则调用
enable_tuned_tensorrt_dynamic_shape加载 shape 信息并正常执行完整评估。
因此首次在 GPU + TensorRT 模式下运行 test_ocr.py 时通常需要执行两次:第一次收集动态 shape,第二次得到正确结果。另外,识别模型在 CPU + MKLDNN 下会删除fc_mkldnn_pass与fc_act_mkldnn_fuse_pass两个 pass 以保证精度(见 test_ocr.py)。
6.2 使用测试脚本进行批量测试
仓库提供了两个一键测试脚本,分别测试检测与识别模型,均接收一个model_type参数(mobile或server):
# 测试 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 server以 test_ocr_det.sh 为例,脚本会依次完成:启动自动压缩训练(run.py)→ GPU 精度/耗时测试(test_ocr.py,fp32 与 int8)→ CPU 测试(--device CPU --use_mkldnn True)→ 使用tools/infer/predict_det.py做端到端推理验证。脚本头部同时注明了运行环境要求:det 系列需CUDA 11.7 + TensorRT 8.4.2.4 + Paddle 2.5.2(见 test_ocr_rec.sh 首行注释),请务必先核对环境。
6.3 基于压缩模型进行 GPU 批量测试
cd 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 int86.4 基于压缩前模型进行 GPU 批量测试
cd 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 int86.5 基于压缩模型进行 CPU 批量测试(MKLDNN)
cd 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提示:MKLDNN 仅在
--device CPU时生效;若device为GPU,use_mkldnn与cpu_threads不会产生作用。CPU 测试前请先将模型与数据集路径配置正确。
6.6 PaddleLite 端侧部署
自动压缩产出的 INT8 模型同样可用于移动端/嵌入式端部署,PaddleLite 端侧部署流程可参考仓库 deploy/lite 目录下的说明文档(含db_post_process.cc、crnn_process.cc等端侧前后处理实现与ocr_db_crnn.cc主程序)。
7. FAQ
7.1 报错找不到模型文件或数据集文件
若在推理或自动压缩(ACT)时报错找不到模型/数据集文件,请检查配置文件中的路径是否正确。以 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注意所有路径均相对于运行命令时的工作目录(仓库根目录)解析,请确保model_dir下同时存在inference.pdmodel与inference.pdiparams,且标注文件中的图片路径与data_dir拼接后真实存在。
7.2 软件环境一致但硬件不同,为什么精度差异很大?
这是正常现象:TensorRT 针对不同硬件设备有不同优化方法,同一种优化策略在不同硬件上可能表现截然不同。以 ppocrv4_det_server 为例,test_ocr.py 中的相关代码如下:
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_size=1 << 30, max_batch_size=1, min_subgraph_size=30, precision_mode=precision_map[args.precision], use_static=True, use_calib_mode=False, ) pred_cfg.exp_disable_tensorrt_ops(["elementwise_add"]) else: pred_cfg.enable_tensorrt_engine( workspace_size=1 << 30, max_batch_size=1, min_subgraph_size=4, precision_mode=precision_map[args.precision], use_static=True, use_calib_mode=False, )当硬件为 RTX 3090 时,使用else分支的策略(min_subgraph_size=4)即可获得正常结果;但当硬件为 Tesla V100 时,必须使用if分支的策略(min_subgraph_size=30并禁用elementwise_add算子进 TensorRT 子图)才能保证量化后精度不下降。具体结果可对比上文第 2 节 Benchmark 中两张表在 RTX 3090 与 V100 上的差异。
8. 总结与扩展阅读
本文完整梳理了 PaddleOCR 模型自动压缩的工程链路:以 PaddleSlimAutoCompression为压缩引擎,以 PaddleOCR 数据管线、后处理与评估体系为外围支撑,通过"量化训练 + 蒸馏"组合策略,将 PP-OCRv4 检测/识别 Inference 模型压缩为 INT8 静态图模型,并在 TensorRT(GPU)与 MKLDNN(CPU)上完成精度与性能验证,最终可接入 PaddleLite 端侧部署。
在此基础上,你还可以进一步探索:
- 将自动压缩流程应用于 PP-OCRv3 等其他版本模型:只需替换
model_dir指向的 Inference 模型,并同步调整配置中的算法与数据集; - 更换数据集时,重点调整
Train.dataset/Eval.dataset的data_dir、label_file_list与transforms,并参考 3.2.1 节对极端长宽比图像进行预处理; - 调整量化策略时,可关注
QuantAware中的is_full_quantize、use_pact等开关,结合精度与加速效果的平衡选择合适的组合。
【免费下载链接】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),仅供参考