深度学习算法模型转成算能科技平台xx.bmodel模型的方法步骤

目录

1 docker镜像下载

2 SDK下载 

3 下载sophon-demo

4 修改docker镜像的脚本

5 创建个文件夹

6.source

7.转模型


1 docker镜像下载

可以在dockerhub看到镜像的相关信息

https://hub.docker.com/r/sophgo/tpuc_dev/tags

 用下面的命令下载

docker pull sophgo/tpuc_dev:latest

如果上面的命令太慢,那去算能官网下载另一个版本的docker镜像,

technical center

 下载完之后是:

然后执行下下面的命令load镜像

docker load -i sophgo-tpuc_dev-v2.1-82d75f5c633d.tar
475a54c2a93d: Loading layer [==================================================>]  65.52MB/65.52MB
c5cf9c6d3cf4: Loading layer [==================================================>]  5.647GB/5.647GB
0cdbfbd3d3f4: Loading layer [==================================================>]  739.4MB/739.4MB
7d7b0448f25b: Loading layer [==================================================>]  1.536kB/1.536kB
Loaded image: sophgo/tpuc_dev:v2.1

 注意这里的sophgo/tpuc_dev:v2.1,后面脚本中会用到。

2 SDK下载 

technical center

去下载23.03.01,模型转换不需要SDK,但是需要里面的nntc。 

3 下载sophon-demo

https://github.com/sophgo/sophon-demo

去上面的网址下载sophon-demo,这里面有转换脚本。

4 修改docker镜像的脚本

docker_run_sophonsdk.sh,

#!/bin/basharch=$(uname -m)
x86="x86"
arm="aarch64"REPO="sophgo"
IMAGE="sophonsdk3"
TAG=${1:-ubuntu18.04-py37-dev-22.06}if [ x$(echo ${arch} | grep ${x86}) != x"" ]; thenecho "running on: ${arch}"
elif [[ $(echo ${arch} | grep ${arm}) != "" ]]; thenecho "${arch} not support yet"
elseecho "${arch} not support yet"exit 1
fiDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
WORKSPACE=$PWD
echo "Current   Directory: $DIR"
echo "Workspace Directory: $WORKSPACE"
echo "Docker             : $REPO/$IMAGE:$TAG"if [ -c "/dev/bm-sophon0" ]; thenfor dev in $(ls /dev/bm-sophon*);domount_options+="--device="$dev:$dev" "doneCMD="docker run \--network=host \--workdir=/workspace \--privileged=true \${mount_options} \--device=/dev/bmdev-ctl:/dev/bmdev-ctl \-v /dev/shm --tmpfs /dev/shm:exec \-v $WORKSPACE:/workspace \-v /dev:/dev \-v /etc/localtime:/etc/localtime \-e LOCAL_USER_ID=`id -u` \-itd $REPO/$IMAGE:$TAG \bash"
elseCMD="docker run \--network=host \--workdir=/workspace \--privileged=true \-v $WORKSPACE:/workspace \-v /dev/shm --tmpfs /dev/shm:exec \-v /etc/localtime:/etc/localtime \-e LOCAL_USER_ID=`id -u` \-itd $REPO/$IMAGE:$TAG \bash"
fiecho "creating docker container from image: $REPO/$IMAGE:$TAG"
echo $CMD
container_sha=`eval $CMD`
container_id=${container_sha:0:12}
CMD="docker exec -it ${container_id} bash"echo "container_id: $container_id"
[[ ! -z "$container_id" ]] && eval $CMD || echo "failed to create container!"

 由于我们换了新的镜像,所以修改里面docker镜像的REPO,IMAGE,TAG为下面的形式,其他内容暂时不修改。

REPO="sophgo"
IMAGE="tpuc_dev"
TAG="v2.1"

5 创建个文件夹

这里我创建了一个convert_model文件夹,然后把demo,nntc都放到里面,如下图所示

docker_run_sophonsdk.sh在前面已经修改过了,然后我直接运行脚本把镜像起来。

./docker_run_sophonsdk.sh

6.source

source下环境变量

在/workspace/tpu-nntc/tpu-nntc_v3.1.7-b267d3cd-230327/scripts有个envsetup.sh脚本

source envsetup.sh

7.转模型

然后具体的转换模型脚本在sophon-demo-release/sample/YOLOv5/scripts这里面有,

模型要用jit之后的模型,具体方法在老方法里面有:https://github.com/sophon-ai-algo/examples/tree/3.0.0/simple/yolov5

我们修改一下gen_int8bmodel_nntc.sh脚本,修改其中的校准图片的路径还有模型文件的路径和名字。修改后如下

#!/bin/bash
model_dir=$(dirname $(readlink -f "$0"))if [ ! $1 ]; thenecho "Please set the target chip. Option: BM1684 and BM1684X"exit
elsetarget=$1
fioutdir=../models/$targetfunction auto_cali()
{python3 -m ufw.cali.cali_model  \--net_name=yolov5s  \--model=../build/640_edge_compute_best_20230821.torch.pt  \--cali_image_path=../calib  \--cali_iterations=128   \--cali_image_preprocess='resize_h=640,resize_w=640;scale=0.003921569,bgr2rgb=True'   \--input_shapes="[1,3,640,640]"  \--target=$target   \--convert_bmodel_cmd_opt="-opt=1"   \--try_cali_accuracy_opt="-fpfwd_outputs=< 24 >86,< 24 >55,< 24 >18;-th_method=MAX"mv ../models/torch/yolov5s_batch1/compilation.bmodel $outdir/yolov5s_v6.1_3output_int8_1b.bmodel
}function gen_int8bmodel()
{bmnetu --model=../models/torch/yolov5s_bmnetp_deploy_int8_unique_top.prototxt  \--weight=../models/torch/yolov5s_bmnetp.int8umodel \-net_name=yolov5s \--shapes=[$1,3,640,640] \-target=$target \-opt=1mv compilation/compilation.bmodel $outdir/yolov5s_v6.1_3output_int8_$1b.bmodel
}pushd $model_dir
if [ ! -d $outdir ]; thenmkdir -p $outdir
fi
# batch_size=1
auto_cali
# batch_size=4
gen_int8bmodel 4popd

然后执行

./gen_int8bmodel_nntc.sh  BM1684

报错: 

bad layer name: < 24 >55 !!!
*** Check failure stack trace: ***
./gen_int8bmodel_nntc.sh: line 14:  2971 Aborted                 (core dumped) python3 -m ufw.cali.cali_model --net_name=yolov5s --model=../build/640_edge_compute_best_20230821.torch.pt --cali_image_path=../calib --cali_iterations=128 --cali_image_preprocess='resize_h=640,resize_w=640;scale=0.003921569,bgr2rgb=True' --input_shapes="[1,3,640,640]" --target=$target --convert_bmodel_cmd_opt="-opt=1" --try_cali_accuracy_opt="-fpfwd_outputs=< 24 >86,< 24 >55,< 24 >18;-th_method=MAX"
mv: cannot stat '../models/torch/yolov5s_batch1/compilation.bmodel': No such file or directory

然后可以看到脚本里面24行那里的outputs的名字,

 这是因为层的名字不对,我看我自己的onnx模型,

 然后把脚本里面的层名字改一下,修改后的脚本如下,gen_int8bmodel那个函数没有调用,不需要

#!/bin/bash
model_dir=$(dirname $(readlink -f "$0"))if [ ! $1 ]; thenecho "Please set the target chip. Option: BM1684 and BM1684X"exit
elsetarget=$1
fioutdir=../models/$targetfunction auto_cali()
{python3 -m ufw.cali.cali_model  \--net_name=yolov5s  \--model=../build/edge_compute_best_20230821.onnx  \--cali_image_path=../calib  \--cali_iterations=150   \--cali_image_preprocess='resize_h=640,resize_w=640;scale=0.003921569,bgr2rgb=True'   \--input_shapes="[1,3,640,640]"  \--target=$target   \--convert_bmodel_cmd_opt="-opt=1"   \--try_cali_accuracy_opt="-fpfwd_outputs=326,378,430;-th_method=MAX"#mv ../models/torch/yolov5s_batch1/compilation.bmodel $outdir/yolov5s_v6.1_3output_int8_1b.bmodel
}function gen_int8bmodel()
{bmnetu --model=../models/torch/yolov5s_bmnetp_deploy_int8_unique_top.prototxt  \--weight=../models/torch/yolov5s_bmnetp.int8umodel \-net_name=yolov5s \--shapes=[$1,3,640,640] \-target=$target \-opt=1mv compilation/compilation.bmodel $outdir/yolov5s_v6.1_3output_int8_$1b.bmodel
}pushd $model_dir
if [ ! -d $outdir ]; thenmkdir -p $outdir
fi
# batch_size=1
auto_cali
# batch_size=4
#gen_int8bmodel 4popd

 然后会生成模型

======================================================================
以后转模型用上面介绍的新方法,下面的方法是之前的老的方法,现在新方法教程在:https://github.com/sophgo/sophon-demo

https://github.com/sophgo/sophon-demo/blob/release/docs/Environment_Install_Guide.md#1-tpu-mlir%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA

并且docker镜像下载新的,然后SDK可以先用之前用的3.0然后只把SDK里面的nntc替换成新的,然后转换demo用新的网址。

以下网址弃用。

https://github.com/sophon-ai-algo/examples/tree/cc94f7c06da1c645ec193e40537915d40f94e005/simple/yolov5

 按照以上网址的说明进行算法模型转换,

1.首先要下载SDK包和镜像包

SDK软件包下载

  • 开发docker基础镜像:点击前往官网下载Ubuntu开发镜像,请选择与SDK版本适配的docker镜像

  • SDK软件包:点击前往官网下载SDK软件包,请选择与仓库代码分支对应的SDK版本

2 创建docker开发环境 

  • 安装工具

    sudo apt update
    sudo apt install unzip
  • 加载docker镜像:

    unzip <docker_image_file>.zip
    cd <docker_image_file>
    docker load -i <docker_image>
  • 解压缩SDK:

    unzip <sdk_zip_file>.zip
    cd <sdk_zip_file>/
    tar zxvf <sdk_file>.tar.gz
  • 创建docker容器,SDK将被挂载映射到容器内部供使用:

    cd <sdk_path>/
    # 若您没有执行前述关于docker命令免root执行的配置操作,需在命令前添加sudo
    ./docker_run_<***>sdk.sh
  • 进入docker容器中安装库:

    # 进入容器中执行
    cd  /workspace/scripts/
    ./install_lib.sh nntc
  • 设置环境变量-[无PCIe加速卡]:

    # 配置环境变量,这一步会安装一些依赖库,并导出环境变量到当前终端
    # 导出的环境变量只对当前终端有效,每次进入容器都需要重新执行一遍,或者可以将这些环境变量写入~/.bashrc,这样每次登录将会自动设置环境变量
    source envsetup_cmodel.sh
  • 设置环境变量-[有PCIe加速卡]:

    # 配置环境变量,这一步会安装一些依赖库,并导出环境变量到当前终端
    # 导出的环境变量只对当前终端有效,每次进入容器都需要重新执行一遍,或者可以将这些环境变量写入~/.bashrc,这样每次登录将会自动设置环境变量
    source envsetup_pcie.sh
  • 安装python对应版本的sail包

    # the wheel package is in the SophonSDK:
    pip3 uninstall -y sophon
    # get your python version
    python3 -V
    # choose the same verion of sophon wheel to install
    # the following py3x maybe py35, py36, py37 or py38
    # for x86
    pip3 install ../lib/sail/python3/pcie/py3x/sophon-?.?.?-py3-none-any.whl --user

3 模型准备

 这个需要注意的是,在我们导出算法模型时,需要增加相关的trace代码

SophonSDK中的PyTorch模型编译工具BMNETP只接受PyTorch的JIT模型(TorchScript模型)。

JIT(Just-In-Time)是一组编译工具,用于弥合PyTorch研究与生产之间的差距。它允许创建可以在不依赖Python解释器的情况下运行的模型,并且可以更积极地进行优化。在已有PyTorch的Python模型(基类为torch.nn.Module)的情况下,通过torch.jit.trace就可以得到JIT模型,如torch.jit.trace(python_model, torch.rand(input_shape)).save('jit_model')。BMNETP暂时不支持带有控制流操作(如if语句或循环)的JIT模型,因此不能使用torch.jit.script,而要使用torch.jit.trace,它仅跟踪和记录张量上的操作,不会记录任何控制流操作。这部分操作yolov5已经为我们写好,只需运行如下命令即可导出符合要求的JIT模型:

4 模型转换

这个直接运行脚本进行转换即可,32位的模型和int8的模型分别都有不同的脚本。

8. 各框架模型转ONNX参考 — TPU-MLIR 1.1 文档

https://github.com/sophgo/sophon-demo

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

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

相关文章

若依vue打印的简单方法

像我们后端程序员做前端的话,有时候真不需要知道什么原理,直接塞就好了 我们选用基于hiprint 的vue-plugin-hiprint来打印 目的是为了实现点击某些行的数据,然后点击某个按钮直接弹出下面的打印 此链接 大佬是原创,我拿来总结梳理一下 插件进阶功能请移步: 链接 插件模板制作页…

设计模式--代理模式

笔记来源&#xff1a;尚硅谷Java设计模式&#xff08;图解框架源码剖析&#xff09; 代理模式 1、代理模式的基本介绍 1&#xff09;代理模式&#xff1a;为一个对象提供一个替身&#xff0c;以控制对这个对象的访问。即通过代理对象访问目标对象2&#xff09;这样做的好处是…

mysql 、sql server 游标 cursor

游标 声明的位置 游标必须在声明处理程序之前被声明&#xff0c;并且变量和条件还必须在声明游标或处理程序之前被声明 游标的使用步骤 声明游标打开游标使用游标关闭游标 &#xff08;sql server 关闭游标和释放游标&#xff09; sql server 游标 declare my_cursor curs…

scikit-learn中OneHotEncoder用法

One-Hot编码&#xff0c;又称为一位有效编码&#xff0c;是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值&#xff0c;然后&#xff0c;每个整数值被表示为二进制向量&#xff0c;将整数索引标记为1&#xff0c;其余都标为0。 OneHotEncoder()常用参数解释 …

SpringBoot的日志级别你了解吗(自定义打印日志)?

1 SpringBoot日志介绍 ⽇志是程序的重要组成部分&#xff0c;想象⼀下&#xff0c;如果程序报错了&#xff0c;不让你打开控制台看⽇志&#xff0c;那么你能找到报错的原因吗&#xff1f; 如果是简单的错误有可能找出来&#xff0c;但是对于开发中的大多数错误还是需要我们打开…

在 Redis 中处理键值 | Navicat

Redis 是一个键值存储系统&#xff0c;允许我们将值与键相关联起来。与关系型数据库不同的是&#xff0c; 在Redis 中&#xff0c;不需要使用数据操作语言 &#xff08;DML&#xff09; 和查询语法&#xff0c;那么我们如何进行数据的写入、读取、更新和删除操作呢&#xff1f;…

数据库——Redis 常见数据结构以及使用场景分析

文章目录 1. string2. list3. hash4. set5. sorted set 你可以自己本机安装 redis 或者通过 redis 官网提供的在线 redis 环境。 1. string 介绍 &#xff1a;string 数据结构是简单的 key-value 类型。虽然 Redis 是用 C 语言写的&#xff0c;但是 Redis 并没有使用 C 的字符串…

Docker构建镜像

Docker根据Dockerfile文件构建镜像 在实际生产中&#xff0c;常常使用Dockerfile构建企业级生产环境镜像,然后再部署在我们的生产环境中&#xff0c;本文将从从零开始介绍Dockerfile如何使用&#xff0c;构建镜像。 Dockerhub官网地址&#xff1a;https://registry.hub.docke…

Vue Element upload组件和Iview upload 组件上传文件

今天要分享的是使用这俩个UI组件库的upload组件分别实现调用组件本身的上传方法实现和后台交互。接下来就是开车的时间&#xff0c;请坐稳扶好~ 一、element upload组件传送门 1、html文件 <el-upload ref"uploadRef" :action"uploadUrl" :data"…

深入探讨C存储类和存储期——Storage Duration

&#x1f517; 《C语言趣味教程》&#x1f448; 猛戳订阅&#xff01;&#xff01;&#xff01; ​—— 热门专栏《维生素C语言》的重制版 —— &#x1f4ad; 写在前面&#xff1a;这是一套 C 语言趣味教学专栏&#xff0c;目前正在火热连载中&#xff0c;欢迎猛戳订阅&#…

lab8 lock

PreRead 第六章3.5节&#xff1a;物理内存分配器8.1-8.3 文章目录 PreReadMemory allocatortaskshints思路 Buffer cachetaskhints思路实现 这次的lab&#xff0c;本质上都是通过将锁的粒度减小来获得性能的提升 第一个task&#xff0c;可以简单地按cpu划分&#xff0c;因为本…

数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成

数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成 目录 数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成生成效果基本描述程序设计参考资料 生成效果 基本描述 数据生成 | MATLAB实现GAN生成对抗网络结合SVM支持向量机的数据生成。 生成对抗…

C语言基础之——指针(上)

前言&#xff1a;小伙伴们又见面啦&#xff01;本期内容&#xff0c;博主将展开讲解有关C语言中指针的上半部分基础知识&#xff0c;一起学习起来叭&#xff01;&#xff01;&#xff01; 目录 一.什么是指针 二.指针类型 1.指针的解引用 2.指针-整数 三.野指针 1.野指针…

【洛谷】P2678 跳石头

原题链接&#xff1a;https://www.luogu.com.cn/problem/P2678 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 二分答案。&#xff08;使用二分需要满足两个条件。一个是有界&#xff0c;一个是单调。 这题的题面&#xff1a;使得选手们在比赛过程中…

【数据结构】手撕顺序表

一&#xff0c;概念及结构 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储&#xff1b; 在数组上完成数据的增删查改。 1&#xff0c; 静态顺序表&#xff1a;使用定长数组存储元素。 2.&#xff0c;动态顺序表&#xff1…

基于Spring Boot的游泳馆管理系统的设计与实现(Java+spring boot+MySQL)

获取源码或者论文请私信博主 演示视频&#xff1a; 基于Spring Boot的游泳馆管理系统的设计与实现&#xff08;Javaspring bootMySQL&#xff09; 使用技术&#xff1a; 前端&#xff1a;html css javascript jQuery ajax thymeleaf 微信小程序 后端&#xff1a;Java spring…

opencv进阶18-基于opencv 决策树导论

1. 什么是决策树&#xff1f; 决策树是最早的机器学习算法之一&#xff0c;起源于对人类某些决策过程 的模仿&#xff0c;属于监督学习算法。 决策树的优点是易于理解&#xff0c;有些决策树既可以做分类&#xff0c;也可以做回归。在排名前十的数据挖掘算法中有两种是决策树[1…

Kafka为什么这么快?

Kafka 是一个基于发布-订阅模式的消息系统&#xff0c;它可以在多个生产者和消费者之间传递大量的数据。Kafka 的一个显著特点是它的高吞吐率&#xff0c;即每秒可以处理百万级别的消息。那么 Kafka 是如何实现这样高得性能呢&#xff1f;本文将从七个方面来分析 Kafka 的速度优…

科技资讯|荷兰电动自行车丢失将被拒保,苹果Find My可以减少丢失

荷兰最大的自行车协会荷兰皇家旅游俱乐部宣布&#xff0c;将不再为胖胎电动自行车提供保险&#xff0c;因为这种自行车的被盗风险极高。 随着电动自行车的销量飙升&#xff0c;胖胎也变得更受欢迎。但问题是&#xff0c;胖胎电动自行车也成为了自行车盗窃者的首选目标。ANWB …

GIthub 无法访问使用Watt Toolkit加速

一、使用 Watt Toolkit Watt Toolkit 是一款加速软件&#xff0c;原名是 Steam&#xff0c;后来改名为 Watt Toolkit&#xff0c;其可以让原本无法访问的 Steam 游戏社区、 GitHub 、谷歌验证码等国内难以访问的网页正常访问。 三种下载方式&#xff1a; Watt Toolkit 官网下…