TPU-MLIR编译部署算法

这篇具有很好参考价值的文章主要介绍了TPU-MLIR编译部署算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

注意: 由于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)
      TPU-MLIR编译部署算法,mlir,算法,eureka
(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

TPU-MLIR编译部署算法,mlir,算法,eureka

(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

TPU-MLIR编译部署算法,mlir,算法,eureka

实现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

下载过程图:
TPU-MLIR编译部署算法,mlir,算法,eureka

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

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

TPU-MLIR编译部署算法,mlir,算法,eureka

每一个模型文件夹下都是模型权重和参数:
TPU-MLIR编译部署算法,mlir,算法,eureka

ppocr_img包含测试图片:
TPU-MLIR编译部署算法,mlir,算法,eureka

(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模型。

TPU-MLIR编译部署算法,mlir,算法,eureka

(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 文件如下, 该文件是模型的输入文件。
TPU-MLIR编译部署算法,mlir,算法,eureka

(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 的文件如下:
TPU-MLIR编译部署算法,mlir,算法,eureka

(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

TPU-MLIR编译部署算法,mlir,算法,eureka

生成校准表过程图:
TPU-MLIR编译部署算法,mlir,算法,eureka
TPU-MLIR编译部署算法,mlir,算法,eureka
TPU-MLIR编译部署算法,mlir,算法,eureka

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

TPU-MLIR编译部署算法,mlir,算法,eureka

编译为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

转换过程输出内容如下:

TPU-MLIR编译部署算法,mlir,算法,eureka

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

TPU-MLIR编译部署算法,mlir,算法,eureka

编译为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

TPU-MLIR编译部署算法,mlir,算法,eureka

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

TPU-MLIR编译部署算法,mlir,算法,eureka

问题及解决方法

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

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

TPU-MLIR编译部署算法,mlir,算法,eureka
TPU-MLIR编译部署算法,mlir,算法,eureka
TPU-MLIR编译部署算法,mlir,算法,eureka文章来源地址https://www.toymoban.com/news/detail-611209.html

到了这里,关于TPU-MLIR编译部署算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • eureka的docker镜像部署

    项目结构  1.pom.xml文件 2.EurekaServerApplication主函数类 3.application.yml配置文件 4.选择进行打jar包 5.打开linux虚拟机,启动docker镜像,并创建目录为了方便编写自定义镜像  6.创建docker目录,把jar包粘贴过来,并重命名(为了后面调用时方便) 选择新建文件,编写DockerFile文件 选择

    2024年02月06日
    浏览(42)
  • k8s部署Eureka集群

    镜像配置: 环境变量如下:

    2024年04月27日
    浏览(26)
  • 热塑性聚氨酯TPU的特性有哪些?UV胶水能够粘接热塑性聚氨酯TPU吗?又有哪些优势呢?

    热塑性聚氨酯(Thermoplastic Polyurethane,TPU)是一种具有多种优异性能的弹性塑料,广泛用于各种应用领域。以下是TPU的一些主要特性: 弹性和柔软性: TPU具有良好的弹性和柔软性,能够在受力后迅速恢复原状。这使得它在需要弹性和柔韧性的应用中表现出色。 高强度和韧性

    2024年01月20日
    浏览(79)
  • JAVA开发(分布式部署微服务注册到Eureka出现registration status: 204错误)

    将服务注册到多个Eureka出现有点的服务只注册到一个Eureka有点的服务可以注册到多个Eureka的问题,有的注册不上,报错:registration status: 204 Eureka1: Eureka2:  从截图可以看出有两台服务器上的 HN-BASE-ADMIN 和HN-BLOCKCHAIN-BUSINESS都可以注册到Eureka1 HN-BASE-GATEWAY分别都只有一台服务器

    2024年02月08日
    浏览(36)
  • 详解SpringCloud微服务技术栈:强推!源码跟踪分析Ribbon负载均衡原理、Eureka服务部署

    👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:详解SpringCloud微服务技术栈:认识微服务、服务拆分与远程调用 📚订阅专栏:微服务技术全家桶 希望文章对你们有所帮助 服务提供者:一次业务中,被其它微服务调用的服务(提供接口给

    2024年01月18日
    浏览(43)
  • 免费使用高性能的GPU和TPU—谷歌Colab使用教程

    楼主前一阶段在做视频插帧算法应用,鉴于在自己的本子上跑代码是在太慢,又不好意思在跑路后还是用学院的服务器账号,所以翻来覆去学会了在谷歌使用免费的算力进行模型训练和使用。在开始使用前,请您准备自己的Google账号并熟悉Jupyter Notebook的使用 什么是 Colab? 借

    2024年02月04日
    浏览(44)
  • TPU编程竞赛系列 | 创客北京2023·算能AI+边缘计算专项赛开始啦!

    为助力北京市高精尖产业发展,构建大中小企业相互依存、相互促进的企业发展生态,打造北京市有影响力的双创服务品牌赛事, “创客北京”大赛组委会联合算能举办AI+边缘计算方向专项赛。 本赛题基于“AI+边缘计算”方向,针对视觉领域中的 “AI+石化” 和 “AI+泛园区

    2024年02月14日
    浏览(31)
  • 首个中文Stable Diffusion模型开源;TPU演进十年;18个PyTorch性能优化技巧 | AI系统前沿动态...

    1. TPU演进十年:Google的十大经验教训 希腊神话中,特洛伊战争的起因是两方争夺世界上最美的女人——海伦,后世诗人将海伦的美貌“令成千战舰为之起航”。TPU就像海伦,它的出现引起了“成千芯片与之竞逐”。 可以说,TPU的问世引发了硅谷的“地震”。TPU宣布诞生后,

    2024年02月09日
    浏览(57)
  • Mysql 编译安装部署

    Mysql 编译安装部署 环境: 172.20.26.198 (Centos7.6)   源码安装Mysql-5.7 大概步骤如下: 1、上传mysql-5.7.28.tar.gz 、boost_1_59_0.tar 到/usr/src 目录下 2、安装依赖 3、cmake 4、make make install  5、cp support-files/mysql.server my.cnf ,编辑my.cnf文件,添加数据目录及参数 6、创建/data/mysql57目录,并

    2024年01月21日
    浏览(29)
  • RocketMQ 源码编译部署包

    1. 版本 Java 版本: 1.8.0_201 RocketMQ 版本: 5.1.3 2.打包 git clone https://github.com/apache/rocketmq.git git checkout release-5.1.3 cd rocketmq

    2024年02月16日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包