# paddlepaddleocr **Repository Path**: y30044005/paddlepaddleocr ## Basic Information - **Project Name**: paddlepaddleocr - **Description**: paddlepaddleocr - **Primary Language**: Python - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 5 - **Created**: 2023-08-04 - **Last Updated**: 2023-08-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PaddleOCR Direction classifier inference model 模型推理指导 ## 概述 ch_ppocr_mobile_v2.0_cls为PaddleOCR内置的中文文本方向分类器,对检测到的文本行文字角度分类,支持0和180度的分类。文本方向分类器主要用于图片非0度的场景下,该场景下需要对图片里检测到的文字进行分类,便于后续进行转正操作后将图片送入识别模型。 - 参考实现 ``` url=https://github.com/PaddlePaddle/PaddleOCR commit_id=a40f64a70b8d290b74557a41d869c0f9ce4959d5 model_name=ch_ppocr_mobile_v2.0_cls ``` ## 0 预置条件: ### 原始模型 ``` |--- ch_ppocr_mobile_v2.0_cls_infer/ |--- |--- inference.pdiparams |--- |--- inference.pdiparams.info |--- |--- inference.pdmodel ``` 原始模型获取链接:[ch_ppocr_mobile_v2.0_cls_infer](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar) ### .om模型推理环境: - 操作系统:ubuntu 18.04 - CPU架构:`aarch64` - NPU型号及驱动版本: ``` +--------------------------------------------------------------------------------------------------------+ | npu-smi 23.0.RC1.b010 Version: 23.0.RC1.b010 | +-------------------------------+-----------------+------------------------------------------------------+ | NPU Name | Health | Power(W) Temp(C) Hugepages-Usage(page) | | Chip Device | Bus-Id | AICore(%) Memory-Usage(MB) | +===============================+=================+======================================================+ | 2048 310P3 | OK | NA 46 0 / 0 | | 0 0 | 0000:81:00.0 | 0 4023 / 21527 | +===============================+=================+======================================================+ ``` - 关键包版本: ``` python: 3.7.5 CANN:6.3T200 ``` ### .engine模型推理环境: - 操作系统:ubuntu 18.04 - CPU架构:`x86_64` - GPU型号及驱动版本: ``` +-----------------------------------------------------------------------------+ | NVIDIA-SMI 525.60.13 Driver Version: 525.60.13 CUDA Version: 12.0 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |===============================+======================+======================| | 0 Tesla T4 Off | 00000000:5E:00.0 Off | 0 | | N/A 63C P0 29W / 70W | 5676MiB / 15360MiB | 0% Default | | | | N/A | +-------------------------------+----------------------+----------------------+ ``` - 关键包版本: ``` python: 3.9.5 onnxsim: 0.4.28 onnx: 1.14.0 onnxruntime: 1.15.0 paddlepaddle: 2.4.2 paddle2onnx: 1.0.6 paddleocr: 2.6.1.3 ``` ## 1 模型输入输出数据 - 输入数据 |输入数据|数据类型|大小|数据排布格式| |----|----|----|----| |input| RGB_FP32|batchsize x 3 x width x height|NCHW| - 输出数据 |输入数据|数据类型|大小|数据排布格式| |----|----|----|----| |output1|FLOAT32|batchsize x 2|ND| ## 2 推理全流程 ### 2.0 流程总览 ```mermaid graph LR subgraph 整体流程 direction LR A(paddle模型) --paddle2onnx模型转换--> B(onnx模型) B --atc模型转换--> C(om模型) B --trtexec模型转换--> D(engine模型) C --模型推理:ait benchmark--> E(end) D --模型推理:ntrtexec--> E end ``` ### 2.1 获取PaddleOCR Direction Classify的onnx模型 - 获取paddlepaddle模型: ``` # 下载ch_ppocr_mobile_v2.0_cls_infer模型的压缩包 wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar --no-check-certificate # 解压当前文件夹目录 tar -xf ch_ppocr_mobile_v2.0_cls_infer.tar ``` - 安装paddle2onnx ``` pip3 install paddle2onnx==1.0.6 ``` - 将paddlepaddle模型转换成onnx模型 ``` paddle2onnx --model_dir ch_ppocr_mobile_v2.0_cls_infer/ --model_filename inference.pdmodel --params_filename inference.pdiparams --save_file cls_onnx/ocr_cls.onnx --opset_version 10 --input_shape_dict="{'x':[-1,3,-1,-1]}" --enable_onnx_checker True ``` ### 2.2 准备不同场景om模型 #### atc 生成静态shape模型 ``` # input shape:"x:${batchsize},3,224,224", batchsize取:1,2,4,8,16 atc --model cls_onnx/ocr_cls.onnx \ --framework 5 \ --soc_version Ascend310P3 \ --output cls_om/cls_${batchsize}_3_224_224 \ --input_shape "x:${batchsize},3,224,224" \ # input shape:"x:${batchsize},3,48,192", batchsize取:1,2,4,8,16 atc --model cls_onnx/ocr_cls.onnx \ --framework 5 \ --soc_version Ascend310P3 \ --output cls_om/cls_${batchsize}_3_48_192 \ --input_shape "x:${batchsize},3,48,192" ``` #### atc 生成动态shape模型 ``` # input shape的batchsize和分辨率维度为动态 atc --model cls_onnx/ocr_cls.onnx \ --framework 5 \ --soc_version Ascend310P3 \ --output cls_om/cls_dym_shape \ --input_shape "x:-1,3,-1,-1" ``` #### aoe 算子调优生成静态shape模型 ``` # input shape:"x:1,3,48,192", batchsize:1 aoe --model ocr_cls.onnx \ --job_type 2 \ -f 5 \ --input_shape "x:1:3:224:224" # 生成的模型更名为cls_aoe_1_3_224_224.om ``` ### 2.3 准备不同场景的engine模型 - 使用onnxsim固定onnx模型的shape ``` # input shape:"x:${batchsize},3,224,224", batchsize取:1,2,4,8,16 onnxsim ocr_cls_dymshape.onnx \ cls_${batchsize}_3_224_224.onnx \ --overwrite-input-shape x:${batchsize},3,224,224 # input shape:"x:${batchsize},3,48,192", batchsize取:1,2,4,8,16 onnxsim ocr_cls_dymshape.onnx \ cls_${batchsize}_3_48_192.onnx \ --overwrite-input-shape x:${batchsize},3,48,192 ``` - 使用trtexec 生成engine模型 ``` trtexec --onnx=cls_${batchsize}_3_224_224.onnx \ --saveEngine=cls_${batchsize}_3_224_224.engine \ --exportOutput=result_${batchsize}_3_224_224.json ``` - 使用trtd 生成动态shape的engine模型 ``` trtd --onnx=cls_dym_shape.onnx \ --saveEngine=cls_dym_shape.engine \ --minShapes=x:1x3x1x1 \ --optShapes=x:1x3x224x224 \ --maxShapes=x:1x3x640x640 \ --buildOnly ``` ### 2.4 准备测试数据 在PaddleOCR[样本集](https://github.com/PaddlePaddle/PaddleOCR/tree/release/2.5/doc/imgs_words/ch)中获取ocr任务中框选完后的单词的图片。将其转换为shape为(1, 3, hight, width)的ndarray,保存为npy文件。 ```bash python ch_ppocr_mobile_v2.0_cls_infer_preprocess.py ${path/to/pic/} ``` ### 2.5 模型推理性能测试 在环境上安装好ait benchmark组件,ait 安装方法参考:https://gitee.com/ascend/ait/blob/master/ait/docs/install/README.md #### om 模型推理 - atc 模型静态shape:"${batchsize},3,224,224" ``` # batchsize取:1,2,4,8,16 ait benchmark --om-model cls_${batchsize}_3_224_224.om --loop 100 ait benchmark --om-model cls_${batchsize}_3_48_192.om --loop 100 ``` - atc 模型动态shape: ``` # batchsize取:1,2,4,8,16 ait benchmark --om-model cls_dym_shape.om \ --output-size 10000 \ --dym-shape "x:${batchsize},3,224,224" \ --loop 100 \ ait benchmark --om-model cls_dym_shape.om \ --output-size 10000 \ --dym-shape "x:${batchsize},3,48,192" \ --loop 100 ``` - aoe 模型静态shape ``` ait benchmark --om-model cls_aoe_1_3_224_224 --loop 100 ``` #### engine 模型推理 - 静态 ``` # batchsize取:1,2,4,8,16 trtexec --loadEngine=cls_${batchsize}_3_224_224.engine --exportOutput=result_${batchsize}_3_224_224.json --iterations=100 trtexec --loadEngine=cls_${batchsize}_3_48_192.engine --exportOutput=result_${batchsize}_3_48_192.json --iterations=100 ``` ### 2.6 模型推理精度测试 环境安装同2.5 #### om 模型推理 ``` ait benchmark --om-model cls_dym_shape.om \ --output-size 10000 \ --auto-set-dymshape-mode 1 \ --input ${path/to/pic/} \ --output ./output_om/ \ --outfmt NPY ``` #### engine 模型推理 ``` trtd --loadEngine=cls_dym_shape.engine \ --loadInputs=${path/to/pic/} \ --output=./output_engine/ \ --warmup=2 \ --buffer=5 ``` #### 比较结果 ```bash python ch_ppocr_mobile_v2.0_cls_infer_postprocess.py ./output_om/ ./output_engine/ ``` 精度比对结果(余弦相似度)会以打屏形式呈现 ### 2.7 推理性能汇总比较 分辨率224×224: ||engine静态shape"bs,3,224,224"(基线)|om静态shape"bs,3,224,224"|动态shape"bs,3,224,224"|(aoe)静态shape"bs,3,224,224"|surgeon改图静态shape"bs,3,224,224"|/| |:--------:|:---------:|:----------:|:--------:|:--------:|:------:|:------:| |batchsize(bs)|吞吐率Throughput|吞吐率Throughput|吞吐率Throughput|吞吐率Throughput|吞吐率Throughput|om静态模型性能提升(%)| |1|1968|1460|367|1786|1791|-25.81| |2|2652|2927|776|/|2923|10.37| |4|3256|4703|1534|/|4703|44.44| |8|3120|5982|2425|/|5954|91.73| |16|3168|5781|2761|/|5791|82.48| 分辨率48×192: ||engine静态shape"bs,3,48,192"(基线)|om静态shape"bs,3,48,192"|动态shape"bs,3,48,192"|(aoe)静态shape"bs,3,48,192"|/| |:--------:|:---------:|:----------:|:--------:|:--------:|:------:| |batchsize(bs)|吞吐率Throughput|吞吐率Throughput|吞吐率Throughput|吞吐率Throughput|静态模型性能提升(%)| |1|2599|2307|390|/|-11.24| |2|5182|3120|645|/|-39.79| |4|8760|8105|1399|/|-7.48| |8|9552|13989|3258|/|46.45| |16|13744|20606|5237|/|49.93| #### 推理性能结果总结 - 在batchsize较小时(1~4),om模型推理性能整体没有与engine模型拉开差距,甚至在1batch的情况下性能明显不如engine模型。 - 经过aoe的算子调优或者surgeon的改图,可以是转换出的om模型在1batchsize的情况下明显提升,但是性能依然不及engine模型。 - surgeon对om模型推理性能的提升几乎仅限于1batchsize的场景。 - batchsize>4的情况下,om模型推理的性能明显优于engine模型,性能整体要好40%~50%。 - 使用onnxsim固定模型shape的时候,有优化过onnx模型,om模型和engine模型似乎结构也是不一样的。 ### 2.8 推理精度汇总比较 |engine,om模型余弦相似度| |-----| |99.99%| ### 2.9 推理性能问题分析 - 从2.7节的性能结果不难发现,目前om模型主要的性能问题是**batchsize很小时和batchsize较大时,om模型性能差异巨大**。 - 为探究造成这种现象的原因,分别对batchsize=1和batchsize=16的om使用profile工具dump出具体的推理性能数据,命令如下: ``` ait profile --application "ait benchmark --om-model cls_1_3_224_224" --output output/ ait profile --application "ait benchmark --om-model cls_16_3_224_224" --output output/ ``` - dump数据保存在output/profiler/PROF_XXXXXXXX文件夹中,分析其中的op_summary.csv可以获取每个算子的执行时间。 #### 算子调度原因 算子执行时间总和与推理执行总时间的比较如下: |/|batchsize=1|batchsize=16| |:---------:|:---------:|:-------:| |**t1** 算子task_duration总和(us)|622.7|2588.8| |算子平均耗时(us)|3.834|16.18| |**t2** 推理总时间(us)|932.0|3099.0| |**t1/t2**|0.668|0.835| - 在算子平均执行时间很短(<10us)的网络中,算子下发和执行之间无法做到流水,导致调度在batchsize=1的情况下调度时间占比较多。 #### 数据搬运原因 - 对比分析batchsize=1和batchsize=16的om模型推理过程中各算子的计算用时,发现conv类算子在batchsize=1和batchsize=16的情况下运算时间差距巨大,咨询专家后得知这是由于batchsize小的时候,带宽没有拉满,算子搬运数据的速度要慢很多。 #### om模型使用建议 - 由于此模型的性能受batchsize的影响非常显著,决定使用哪个batch之前可以用ait benchmark的find_best_batchsize工具来找到性能最优的batchsize。工具链接:https://gitee.com/ascend/ait/tree/master/ait/components/benchmark/find_best_batchsize 工具可以支持分析atc工具和aoe工具转换出的om模型。