TPU-MLIR编译部署算法

news2024/11/16 15:25:39

注意: 由于SOPHGO SE5微服务器的CPU是基于ARM架构,以下步骤将在基于x86架构CPU的开发环境中完成

  • 初始化开发环境(基于x86架构CPU的开发环境中完成)
  • 模型转换 (基于x86架构CPU的开发环境中完成)

处理后的PP-OCR项目文件将被拷贝至 SE5微服务器 上进行推理测试

开发环境配置

【x86架构CPU的开发环境】

  • Linux开发环境
    1. 一台安装了Ubuntu16.04/18.04/20.04的x86主机,运行内存建议12GB以上
    2. 下载SophonSDK开发包(v23.03.01)
      在这里插入图片描述

(1)解压缩SDK包

sudo apt-get install p7zip
sudo apt-get install p7zip-full
7z x Release_<date>-public.zip
cd Release_<date>-public

(2)Docker 安装–TPU-MLIR环境初始化

# 安装docker
sudo apt-get install docker.io
# docker命令免root权限执行
# 创建docker用户组,若已有docker组会报错,没关系可忽略
sudo groupadd docker
# 将当前用户加入docker组
sudo gpasswd -a ${USER} docker
# 重启docker服务
sudo service docker restart
# 切换当前会话到新group或重新登录重启X会话
newgrp docker
提示:需要logout系统然后重新登录,再使用docker就不需要sudo了。

(3)创建docker容器并进入Docker

docker run -v $PWD/:/workspace -p 8001:8001 -it sophgo/tpuc_dev:latest

在这里插入图片描述

(4)加载tpu-mlir–激活环境变量

以下操作需要在Docker容器中。关于Docker的使用, 请参考 启动Docker Container 。

$ tar zxf tpu-mlir_xxxx.tar.gz
$ source tpu-mlir_xxxx/envsetup.sh

_xxxx表示的时tpu-mlir的版本号

本文是在SOPHGO PCIE 1684X/1684云平台上实现

**注意:**如果是在SOPHGO提供的1684X/1684 PCIE云平台上,则无需创建和进入docker,直接加载tpu-mlir并激活环境变量即可。如下命令直接source:

cd tpu-mlir_xxxx/
source tpu-mlir_xxxx-xxxx/envsetup.sh

在这里插入图片描述

实现PP-OCR的文字识别算法模型的转换和量化

1、模型转换

【x86架构CPU的开发环境】

(1)下载SOPHON示例仓库-PP-OCR算法移植代码:

git clone https://github.com/sophon-ai-algo/examples.git
# PP-OCR示例项目代码位置 /examples/simple/PP-OCRv2

(2)将checkpoints模型 转换为 inference模型

PaddlePaddle 支持导出 inference 模型用于部署推理场景,相比于训练调优场景,inference 模型会将网络权重与网络结构进行持久化存储,并且
PaddlePaddle 支持使用预测引擎加载 inference 模型进行预测推理。
参考:https://gitee.com/paddlepaddle/PaddleClas/blob/release/2.3/docs/zh_CN/inference_deployment/export_model.md
超轻量PP-OCRv2系列包含三个模型:检测(3.1M)+ 方向分类器(1.4M)+ 识别(8.5M)= 13.0M
可以直接通过运行SOPHON示例项目中的脚本下载转换好的inference模型:

通过脚本下载需要的数据和模型:

# 进入项目
cd /examples/simple/PP-OCRv2/
# 执行脚本下载数据和模型
./scripts/download.sh

下载过程图:
在这里插入图片描述

下载的模型存放目录为 PP-OCRv2/data/models

下载的模型包括:
ch_PP-OCRv2_det_infer: 文本检测模型
ch_PP-OCRv2_rec_infer: 文本识别模型
ch_ppocr_mobile_v2.0_cls_infer: 文本方向分类模型
下载的数据包括:
ppocr_img: 用于测试的相关图片

在这里插入图片描述

每一个模型文件夹下都是模型权重和参数:
在这里插入图片描述

ppocr_img包含测试图片:
在这里插入图片描述

(3)转换为ONNX格式模型

由于目前只支持ONNX、TFLite和Caffe模型直接转换F32和Int8,PyTorch、PaddlePaddle和TensorFlow则需要转换为中间格式ONNX才能通过MLIR转换F32和Int8。

在命令行中通过以下命令安装paddle2onnx工具,并利用该工具将PaddlePaddle模型转为ONNX模型:

$ pip install paddle2onnx
$ cd /PP-OCRv2/data/models/
$ paddle2onnx  --model_dir ./ch_xxxxxxx_xxx_infer \ 
#xxx表示可以是PP-OCRv2_det也可以是rec,又或者是ppocr_mobile_v2.0_cls(即下载的几个模型文件所在文件夹)
          --model_filename inference.pdmodel \
          --params_filename inference.pdiparams \
          --opset_version 13 \
          --save_file pp_ocrv2.onnx

运行完以上所有命令后我们将获得一个名为pp_ocrv2.onnx的onnx模型。

在这里插入图片描述

(4)ONNX转换MLIR模型

如果模型是图片输入, 在转模型之前我们需要了解模型的预处理。如果模型用预处理后的npz文件做输入, 则不需要考虑预处理。参考yolov5s的rgb图片,mean和scale对应为 0.0,0.0,0.00.0039216,0.0039216,0.0039216

模型转换命令如下:

$ mkdir workspace && cd workspace
$ model_transform.py \
    --model_name pp_ocrv2 \
    --model_def ../pp_ocrv2.onnx \
    --input_shapes [[1,3,640,640]] \
    --mean 0.0,0.0,0.0 \
    --scale 0.0039216,0.0039216,0.0039216 \
    --keep_aspect_ratio \
    --pixel_format rgb \
    --test_input ../../images/ppocr_img/imgs/1.jpg \
    --test_result pp_ocrv2_top_outputs.npz \
    --mlir pp_ocrv2.mlir \
    #--post_handle_type yolo 此参数可以不加,防止后边的npz文件compare时报错

model_transform.py 支持的参数如下:

参数名必选?说明
model_name指定模型名称
model_def指定模型定义文件, 比如.onnx.tflite.prototxt文件
input_shapes指定输入的shape, 例如[[1,3,640,640]]; 二维数组, 可以支持多输入情况
resize_dims原始图片需要resize之后的尺寸; 如果不指定, 则resize成模型的输入尺寸
keep_aspect_ratio在Resize时是否保持长宽比, 默认为false; 设置时会对不足部分补0
mean图像每个通道的均值, 默认为0.0,0.0,0.0
scale图片每个通道的比值, 默认为1.0,1.0,1.0
pixel_format图片类型, 可以是rgb、bgr、gray、rgbd四种情况
output_names指定输出的名称, 如果不指定, 则用模型的输出; 指定后用该指定名称做输出
test_input指定输入文件用于验证, 可以是图片或npy或npz; 可以不指定, 则不会正确性验证
test_result指定验证后的输出文件
excepts指定需要排除验证的网络层的名称, 多个用,隔开
mlir指定输出的mlir文件名称和路径
post_handle_type将后处理融合到模型中,指定后处理类型, 比如yolo、ssd

转成mlir文件后, 会生成一个 ${model_name}_in_f32.npz 文件如下, 该文件是模型的输入文件。
在这里插入图片描述

(5)MLIR转换F32模型

将mlir文件转换成f32的bmodel, 操作方法如下:

$ vi mlir2f32.sh
#将下列命令写入到mlir2f32.sh文件中,这样方便日后代码复现
model_deploy.py \
    --mlir pp_ocrv2.mlir \
    --quantize F32 \
    --chip bm1684x \
    --test_input pp_ocrv2_in_f32.npz \
    --test_reference pp_ocrv2_top_outputs.npz \ #这一步的test_reference要和上一步的test_result保持一致
    --tolerance 0.99,0.99 \
    --model pp_ocrv2_1684x_f32.bmodel
$ sh mlir2f32.sh

model_deploy.py 的相关参数说明如下:

参数名必选?说明
mlir指定mlir文件
quantize指定默认量化类型, 支持F32/F16/BF16/INT8
chip指定模型将要用到的平台, 支持bm1684x/bm1684/cv183x/cv182x/cv181x/cv180x
calibration_table指定校准表路径, 当存在INT8量化的时候需要校准表
tolerance表示 MLIR 量化后的结果与 MLIR fp32推理结果相似度的误差容忍度
test_input指定输入文件用于验证, 可以是图片或npy或npz; 可以不指定, 则不会正确性验证
test_reference用于验证模型正确性的参考数据(使用npz格式)。其为各算子的计算结果
compare_all验证正确性时是否比较所有中间结果, 默认不比较中间结果
excepts指定需要排除验证的网络层的名称, 多个用,隔开
fuse_preprocess是否将预处理放入模型中做,目前只支持CV18xx系列的芯片,后面的章节会进行介绍
customization_format指定输入到模型的图像格式,与预处理有关,一般不需要指定
aligned_input是否将对输入数据做对齐,只支持CV18xx系列的芯片,后面的章节会进行介绍
model指定输出的model文件名称和路径

编译完成后, 会生成名为 ${model_name}_1684x_f32.bmodel 的文件如下:
在这里插入图片描述

(6)MLIR转INT8模型

生成校准表

转INT8模型前需要跑calibration, 得到校准表; 输入数据的数量根据情况准备100~1000张左右。

然后用校准表, 生成对称或非对称bmodel。如果对称符合需求, 一般不建议用非对称, 因为 非对称的性能会略差于对称模型。

这里用现有的20张ppocr_img的图片举例, 执行calibration:

$ vi cali_table.sh
# 将下列命令写入sh文件中,这样做方便日后命令复现
run_calibration.py pp_ocrv2.mlir \
    --dataset  ../../images/ppocr_img/imgs \
    --input_num 20 \
    -o ppocr_cali_table
$ sh cali_table.sh

在这里插入图片描述

生成校准表过程图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

运行完成后会生成名为 ${model_name}_cali_table 的文件, 该文件用于后续编译INT8 模型的输入文件。

在这里插入图片描述

编译为INT8对称量化模型

转成INT8对称量化模型, 执行如下命令:

$ vi mlir2int8.sh
model_deploy.py \
    --mlir pp_ocrv2.mlir \
    --quantize INT8 \
    --calibration_table ppocr_cali_table \
    --chip bm1684x \
    --test_input pp_ocrv2_in_f32.npz \
    --test_reference pp_ocrv2_top_outputs.npz \
    --tolerance 0.85,0.45 \
    --model pp_ocrv2_1684x_int8_sym.bmodel
$ sh mlir2int8.sh

转换过程输出内容如下:

在这里插入图片描述

最终生成${model_name}_1684x_int8_sym.bmodel等相关文件如下:

在这里插入图片描述

编译为INT8非对称量化模型

转成INT8非对称量化模型, 执行如下命令:

$ model_deploy.py \
    --mlir pp_ocrv2.mlir \
    --quantize INT8 \
    --asymmetric \
    --calibration_table pp_ocrv2_cali_table \
    --chip bm1684x \
    --test_input pp_ocrv2_in_f32.npz \
    --test_reference pp_ocrv2_top_outputs.npz \
    --tolerance 0.90,0.55 \
    --model pp_ocrv2_1684x_int8_asym.bmodel

在这里插入图片描述

编译完成后, 会生成名为 ${model_name}_1684x_int8_asym.bmodel 的文件。

在这里插入图片描述

问题及解决方法

【问题】npz文件找不到或者报错error:npz_tool.py RuntimeError等。

【解决办法】首先检查deploy.py的test_result的输出npz文件名和转换F32时的test_reference的npz文件名称保持一致;其次检查输如shape等参数信息的一致性。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/800772.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

el-table-column 合并列,切换表格显示,数据错乱问题

由于同一个页面需要通过lable进行切换显示不同的表格结果在切换的时候发现表格列错乱了 正常是这样的 切换错乱的是这样的 序号没有了&#xff0c;已接单协同总数列也不见了 切换回来发现第一个表格 原先的两列被后面的挤压了 代码也没啥毛病&#xff0c;最主要的原因是因为同…

【从零开始学习JAVA | 第三十二篇】 异常(下)新手必学!

目录 前言&#xff1a; Exceptions&#xff08;异常&#xff09;&#xff1a; 异常的两大作用&#xff1a; 异常的处理方式&#xff1a; 1.JVM默认处理 2.自己捕获异常 3.抛出处理 自定义异常&#xff1a; 异常的优点&#xff1a; 总结&#xff1a; 前言&#xff1a; 前…

LUMEN技术要点总结

LUMEN总结 主题是动态全局光照和Lumen Lumen更像是一个各种GI算法的集大成者。 1. 如何理解lumen及全局光照的实现机制 渲染方程 至今为止所有的实时光照都是按照Render Equation来进行渲染的&#xff0c;我们做得到只是在无限的逼近它。 我们把只进行一次反弹叫做SingleBou…

uni-app 经验分享,从入门到离职(一)——初始 uni-app,快速上手(文末送书福利1.0)

文章目录 &#x1f4cb;前言&#x1f3af;什么是 uni-app&#x1f3af;创建第一个 uni-app 项目&#x1f9e9;前期工作&#x1f9e9;创建项目&#xff08;熟悉默认项目、结构&#xff09;&#x1f9e9;运行项目 &#x1f4dd;最后&#x1f3af;文末送书&#x1f525;参与方式 &…

客户方数据库服务器CPU负载高优化案例

客户方数据库服务器CPU负载高优化案例 背景 上周线上服务出现一个问题&#xff0c;打开某个页面&#xff0c;会导致其它接口请求响应超时&#xff0c;排查后发现数据库响应超400s&#xff0c;之前1s就可查到数据。 具体原因是有个大屏统计页面&#xff0c;会实时查看各业务服…

echarts坐标轴名称换行

一、期望效果&#xff1a; 期望超过6个字换行&#xff0c;最多可显示十个字 如图&#xff1a; 二、踩坑&#xff1a; echarts的width和overflow设置后换行无效。&#xff08;如果其他人有设置有效的 还请说明下&#xff09; 三、解决方案&#xff1a; 用\n换行&#xf…

Django + Xadmin 数据列表复选框显示为空,怎么修复这个问题?

问题描述&#xff1a; 解决方法&#xff1a; 后续发现的报错&#xff1a; 解决方案&#xff1a; 先根据报错信息定位到源代码&#xff1a; 在该文件顶部写入&#xff1a; from django.core import exceptions然后把&#xff1a; except models.FieldDoesNotExist修改为&…

qt6.5 download for kali/ubuntu ,windows (以及配置选项选择)

download and sign in qt官网 sign in onlion Install 1 2 3 4 5

SpringBoot整合WebService

SpringBoot整合WebService WebService是一个比较旧的远程调用通信框架&#xff0c;现在企业项目中用的比较少&#xff0c;因为它逐步被SpringCloud所取代&#xff0c;它的优势就是能够跨语言平台通信&#xff0c;所以还有点价值&#xff0c;下面来看看如何在SpringBoot项目中使…

Neo4j图数据基本操作

Neo4j 文章目录 Neo4jCQL结点和关系增删改查匹配语句 根据标签匹配节点根据标签和属性匹配节点删除导入数据目前的问题菜谱解决的问题 命令行窗口 neo4j.bat console 导入rdf格式的文件 :GET /rdf/ping CALL n10s.graphconfig.init(); //初始化 call n10s.rdf.import.fetch(&q…

每日一题——两个链表的第一个公共结点

题目 输入两个无环的单向链表&#xff0c;找出它们的第一个公共结点&#xff0c;如果没有公共节点则返回空。&#xff08;注意因为传入数据是链表&#xff0c;所以错误测试数据的提示是用其他方式显示的&#xff0c;保证传入数据是正确的&#xff09; 数据范围&#xff1a; n≤…

LeetCode 75 第十一题(392)判断子序列

题目: 示例: 分析: 给两个字符串s和t,问s是不是t的子序列.即判断t中能不能提取出s(s有的元素,t都要有.并且字符的相对顺序不能变,如果字符的相对顺序能变的话就不能用双指针来做,而是要用哈希表了,可以参考力扣383赎金信这题). 这题虽然简单,但是是练习双指针的一个很好的题目…

【QT】Day3

1. 完成闹钟的实现&#xff1a; widgt.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> #include <QTimerEvent> //定时器事件处理函数 #include <QTime> //时间类 #include <QTextToSpeech> //文本转语音类头…

ARP协议(地址解析协议)详解

ARP协议&#xff08;地址解析协议&#xff09;详解 ARP协议的作用映射方式静态映射动态映射 ARP原理及流程ARP请求ARP响应 ARP协议报文首部 ARP协议的作用 ARP协议是“Address Resolution Protocol”&#xff08;地址解析协议&#xff09;的缩写。其作用是在以太网环境中&…

DataEase开源BI工具安装_数据全量_增量同步_大屏拖拽自动生成_多数据源支持_数据血缘分析---大数据工作笔记0183

我这里用的是Centos7.9安装的 可以通过uname -p来查看一下我们的电脑架构,可以看到是x86_64架构的 我们下第一个,这个是x86架构的,第二个arm架构的 然后解压到/opt/module中 然后再去重命名一下文件夹. 推荐200G 本地模式的功能比较多 推荐100G

喜报!麒麟信安操作系统通过GB18030-2022国家标准

《信息技术 中文编码字符集》强制性国家标准GB 18030-2022将于2023年8月1日起全面实施。麒麟信安积极推动电子信息产业标准化工作&#xff0c;快速完成标准适配&#xff0c;近日&#xff0c;麒麟信安服务器操作系统V3、麒麟信安桌面操作系统V3顺利通过GB18030-2022《信息技术 中…

【Linux后端服务器开发】数据链路层

目录 一、以太网 二、MAC地址 三、MTU 四、ARP协议 一、以太网 “以太网”不是一种具体的网路&#xff0c;而是一种技术标准&#xff1a;既包含了数据链路层的内容&#xff0c;也包含了一些物理层的内容&#xff0c;例如&#xff1a;规定了网络拓扑结构、访问控制方式、传…

【Matplotlib 绘制折线图】

使用 Matplotlib 绘制折线图 在数据可视化中&#xff0c;折线图是一种常见的图表类型&#xff0c;用于展示随着变量的变化&#xff0c;某个指标的趋势或关系。Python 的 Matplotlib 库为我们提供了方便易用的功能来绘制折线图。 绘制折线图 下面的代码展示了如何使用 Matplo…

AutoSAR系列讲解(实践篇)9.4-通信相关机制(下)

一、Deadline Monitoring 1、超时监控 Deadline Monitoring,超时监控。超时监控之前在Update Bit中也提到过,但是超时监控可以分为两个等级: IPDU级:当一个Rx IPDU没有在规定的时间内收到有效数据,就启动超时处理Signal级:就是之前我们说过的Update Bit的方式,如果没有…

利用Vector和鸿鹄搭建微服务应用的可观测性平台

一. 背景 1.1 什么是微服务应用 微服务应用由一组具有自治性的服务所组成&#xff0c;每一个服务只提供一类服务&#xff0c;这些服务一起协作以提供复杂的业务功能。相比于传统的单体应用&#xff0c;微服务应用是高度分布式的。如下图所示&#xff0c;即为一个典型的微服务应…