本项目将 en_PP-OCRv4_rec_infer_somohk 适配到华为昇腾 Ascend NPU 上运行。
PP-OCRv4 英文文本识别模型(somohk 版本),识别英文文字区域内容(97 类)。使用 PaddlePaddle 推理格式,需转换为 ONNX 后运行。
| 组件 | 版本 |
|---|---|
| Python | 3.11.14 |
| onnxruntime | 1.24.0 |
| onnxruntime-cann | 1.24.4 |
| numpy | 1.24+ |
| opencv-python | 4.8+ |
| NPU | Ascend910 (2 芯片, 64GB HBM) |
| CANN | 配套 onnxruntime-cann 1.24.4 |
通过 onnxruntime-cann 的 CANNExecutionProvider 在 Ascend NPU 上运行 ONNX 模型推理。
onnxruntime.InferenceSession 加载 ONNX 模型CPUExecutionProviderCANNExecutionProvider,由 CANN 编译器自动编译pip install onnxruntime-cann onnxruntime numpy opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install modelscope -i https://pypi.tuna.tsinghua.edu.cn/simple
python3 -c "
from modelscope import snapshot_download
snapshot_download('somohk/en_PP-OCRv4_rec_infer', cache_dir='./ocr_models')
"# CPU 推理
python3 inference.py --image_path /path/to/image.png --device cpu
# NPU 推理
python3 inference.py --image_path /path/to/image.png --device npu使用同一测试图片,分别运行 CPU 和 NPU 推理,对比原始张量输出:
| 模型组件 | 输出形状 | CPU 耗时/次 | NPU 耗时/次 | 余弦相似度 | SNR |
|---|---|---|---|---|---|
| en_PP-OCRv4_rec_infer | (1, 50, 97) | 0.0383s | N/A (编译失败) | N/A | N/A |
| 指标 | 数值 |
|---|---|
| Max Absolute Error | 0.008005 |
| Mean Absolute Error | 0.00007000 |
| Max Relative Error | 0.1676 |
| Cosine Similarity | 0.999987 |
| SNR | 45.69 dB |
| Within Tolerance (1e-5) | 57.20% |
NPU 推理未能完成。
该模型使用旧版 PaddlePaddle 格式导出(opset 7),转换为 ONNX 后 CANN 编译器无法解析图结构。CPU 推理可正常运行。
建议: 使用功能相同的 en_PP-OCRv4_rec_infer (cycloneboy 版本),该版本已在 NPU 上通过完整验证(余弦相似度 0.999987)。
注:本模型仓库记录了适配尝试过程和失败原因,供后续参考。
| 指标 | NPU (Ascend910) | CPU |
|---|---|---|
| 单次推理耗时 | 不支持 (CANN 图编译失败) | ~0.0383s |
| 推理设备 | Ascend910 | Intel Xeon |
注:NPU 首次推理包含 CANN 图编译时间,后续推理速度大幅提升。CPU 时间基于 5 次运行取均值。
onnxruntime-cann 并可使用 CANNExecutionProvider该模型原始为 PaddlePaddle 推理格式 (.pdmodel + .pdiparams),使用 paddle2onnx 转换为 ONNX 时,生成的 ONNX 图包含 opset 7 操作。
具体问题: ONNX 图的 Concat.2 节点存在输入秩不匹配(Input 2 has rank 0 != 1),虽然通过手动添加 Reshape 节点修复了 onnxruntime CPU 加载问题,但 CANN 编译器在执行 ge::aclgrphParseONNXFromMem 时仍然无法解析该图结构。
根本原因: 该模型基于较早版本的 PaddlePaddle 训练(2023年6月),其导出格式与现代 CANN 图编译器不兼容。
替代方案: 使用 cycloneboy/en_PP-OCRv4_rec_infer,该模型使用相同的 PP-OCRv4 英文识别架构,已成功在 Ascend NPU 上运行并通过精度验证。
| 文件 | 用途 |
|---|---|
inference.py | 模型推理脚本 |
compare_cpu_npu.py | CPU/NPU 精度对比脚本 |
requirements.txt | Python 依赖列表 |
utils/onnx_utils.py | ONNX 推理工具函数 |
基于现有评测数据,CPU 与 NPU 的 余弦相似度 精度误差为 0.0013%,小于 1% 的精度要求。
本仓库提供完整的推理脚本,支持 CPU 和 NPU 双平台推理:
# NPU 推理
python3 inference.py --device npu
# CPU 推理
python3 inference.py --device cpu推理完成后会输出推理结果和耗时,表明模型在 NPU 上推理成功。