深度学习算法模型转成算能科技平台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.rhkb.cn/news/109191.html

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

相关文章

CTFhub-文件上传-前端验证

burp 抓包 --> 重发--> 查看源代码 用 GodZilla 生成木马 文件名为 1.php.jsp 上传-->抓包-->改包 (删掉 .jpg) --> 点击 放行 木马文件位置为&#xff1a;http://challenge-f0531d0c27641130.sandbox.ctfhub.com:10800/upload/1.php 用 蚁剑连接 ctfhub{4743b…

软件工程(十三) 设计模式之结构型设计模式(一)

前面我们记录了创建型设计模式,知道了通过各种模式去创建和管理我们的对象。但是除了对象的创建,我们还有一些结构型的模式。 1、适配器模式(Adapter) 简要说明 将一个类的接口转换为用户希望得到的另一个接口。它使原本不相同的接口得以协同工作。 速记关键字 转换接…

ES面试总结

前言 1、面试突击正确的学习姿势 老师在给你讲面试突击的时候&#xff0c;是有课件的&#xff0c;而且是有准备的。你在面试的时候&#xff0c;是没有笔记课件的&#xff0c;而且问题是由面试官提问的&#xff0c;具有一定的随机性面试突击课程的目标不是听懂&#xff0c;而是…

springboot服务端接口公网远程调试 - 实现HTTP服务监听【端口映射】

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…

最新SQLMap安装与入门技术

SQLMap详解 SQLMap是一个自动化的SQL注入工具&#xff0c;其主要功能是扫描、发现并利用给定URL的SQL注入漏洞。SQLMap内置了很多绕过插件&#xff0c;支持的数据库是MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase和…

Rabbitmq的Shovel

Federation 具备的数据转发功能类似&#xff0c; Shovel 够可靠、持续地从一个 Broker 中的队列 ( 作为源端&#xff0c;即source)拉取数据并转发至另一个 Broker 中的交换器 ( 作为目的端&#xff0c;即 destination) 。作为源端的队列和作为目的端的交换器可以同时位于…

Python Requests模块session的使用建议

本篇主要讲解Python Requests模块session的使用建议及整个会话中的所有cookie的方法。 测试代码 服务端&#xff1a;下面是用flask做的一个服务端&#xff0c;用来设置cookie以及打印请求时的请求头。 # -*- coding: utf-8 -*- from flask import Flask, make_response, req…

ORB-SLAM2算法11之地图点MapPoint

文章目录 0 引言1 MapPoint类1.1 构造函数1.2 成员函数1.2.1 AddObservation1.2.2 EraseObservation1.2.3 SetBadFlag1.2.4 Replace1.2.5 ComputeDistinctiveDescriptors1.2.6 UpdateNormalAndDepth1.2.7 PredictScale 2 MapPoint类用途 0 引言 ORB-SLAM2算法7详细了解了Syste…

Flask狼书笔记 | 04_表单

文章目录 4 表单4.1 HTML表单4.2 使用Flask-WTF4.3 处理表单数据4.4 表单进阶实践小记 4 表单 表单是和用户交互最常见的方式之一&#xff0c;本章涉及的Python包由WTForms、Flask-WTF、Flask-CKEditor。&#xff08;p104&#xff09; 4.1 HTML表单 通过<form>标签创建…

淘宝API技术解析,实现按图搜索淘宝商品

淘宝提供了开放平台接口&#xff08;API&#xff09;来实现按图搜索淘宝商品的功能。您可以通过以下步骤来实现&#xff1a; 1. 获取开放平台的访问权限&#xff1a;首先&#xff0c;您需要在淘宝开放平台创建一个应用&#xff0c;获取访问淘宝API的权限。具体的申请步骤和要求…

[QT]设置程序仅打开一个,再打开就唤醒已打开程序的窗口

需求&#xff1a;speedcrunch 这个软件是开源的计算器软件。配合launch类软件使用时&#xff0c;忘记关闭就经常很多窗口&#xff0c;强迫症&#xff0c;从网上搜索对版本进行了修改。 #include "gui/mainwindow.h"#include <QCoreApplication> #include <…

ubuntu学习(六)----文件编程实现cp指令

1 思路 Linux要想复制一份文件通常指令为&#xff1a; cp src.c des.c 其中src.c为源文件&#xff0c;des.c为目标文件。 要想通过文件编程实现cp效果&#xff0c;思路如下 1 首先打开源文件 src.c 2 读src到buf 3 创建des.c 4 将buf写入到des.c 5 close两个文件 2 实现 vi …

2023高教社杯数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模式树算法&#xff0c…

【德哥说库系列】-Oracle 19C RAC 应用RU19补丁

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

gPRC与SpringBoot整合教程

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Nginx配置文件详解

Nginx配置文件详解 1、Nginx配置文件1.1主配置文件详解1.2子配置文件 2、全局配置部分2.1修改启动的工作进程数&#xff08;worker process) 优化2.2cpu与worker process绑定2.3 PID 路径修改2.4 修改工作进程的优先级2.5调试工作进程打开的文件的个数2.6关闭master-worker工作…

智慧工厂解决方案:推动制造业转型升级的新引擎

随着信息技术的迅猛发展和制造业竞争的加剧&#xff0c;智慧工厂成为了推动制造业转型升级的重要引擎。智慧工厂解决方案通过整合物联网、人工智能、大数据分析等先进技术&#xff0c;实现生产过程的智能化、自动化和高效化&#xff0c;为企业提供了更加灵活、智能的生产模式和…

基于亚马逊云科技服务,构建大语言模型问答知识库

随着大语言模型效果明显提升&#xff0c;其相关的应用不断涌现呈现出越来越火爆的趋势。其中一种比较被广泛关注的技术路线是大语言模型&#xff08;LLM&#xff09;知识召回&#xff08;Knowledge Retrieval&#xff09;的方式&#xff0c;在私域知识问答方面可以很好的弥补通…

Kotlin 高阶函数详解

高阶函数 在 Kotlin 中&#xff0c;函数是一等公民&#xff0c;高阶函数是 Kotlin 的一大难点&#xff0c;如果高阶函数不懂的话&#xff0c;那么要学习 Kotlin 中的协程、阅读 Kotlin 的源码是非常难的&#xff0c;因为源码中有太多高阶函数了。 高阶函数的定义 高阶函数的…

vue中form、table和input标签过长

form标签过长 效果&#xff1a; 代码&#xff1a; <el-form-item v-for"(item,index) in ticketEditTable1" :label"item.fieldNameCn" :propitem.fieldName :key"item.fieldNameCn" overflow"":rules"form[item.fieldName…