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

news2024/11/16 1:32:24

目录

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/bash

arch=$(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"" ]; then
  echo "running on: ${arch}"
elif [[ $(echo ${arch} | grep ${arm}) != "" ]]; then
  echo "${arch} not support yet"
else
  echo "${arch} not support yet"
  exit 1
fi

DIR="$( 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" ]; then
  for dev in $(ls /dev/bm-sophon*);
  do
    mount_options+="--device="$dev:$dev" "
  done
  CMD="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
  "
else
  CMD="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
  "
fi

echo "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 ]; then
    echo "Please set the target chip. Option: BM1684 and BM1684X"
    exit
else
    target=$1
fi

outdir=../models/$target

function 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=1
    mv compilation/compilation.bmodel $outdir/yolov5s_v6.1_3output_int8_$1b.bmodel
}

pushd $model_dir
if [ ! -d $outdir ]; then
    mkdir -p $outdir
fi
# batch_size=1
auto_cali
# batch_size=4
gen_int8bmodel 4

popd

然后执行

./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 ]; then
    echo "Please set the target chip. Option: BM1684 and BM1684X"
    exit
else
    target=$1
fi

outdir=../models/$target

function 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=1
    mv compilation/compilation.bmodel $outdir/yolov5s_v6.1_3output_int8_$1b.bmodel
}

pushd $model_dir
if [ ! -d $outdir ]; then
    mkdir -p $outdir
fi
# batch_size=1
auto_cali
# batch_size=4
#gen_int8bmodel 4

popd

 然后会生成模型

======================================================================
以后转模型用上面介绍的新方法,下面的方法是之前的老的方法,现在新方法教程在: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.coloradmin.cn/o/934236.html

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

相关文章

vim练习题

在普通模式 / 可以用来寻找 . 是重复上次的动作&#xff0c;$ 是移动到末尾 直接查找 .vimrc 保存后重启 安装curl 出现问题 宏 通过记录在寄存器中&#xff0c;让寄存器知道怎么操作 宏只能在1 2 4 寄存器上面使用 替代命令&#xff0c;将匹配到的&#xff0c;包括这些内容…

【力扣每日一题】2023.8.27 合并区间

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 那么合并区间是在什么情况下才能合并呢&#xff1f; 我总结为两种情况 第一种情况就是这样&#xff0c;第二个区间的左区间大于第一个区…

算法通关村第十四关——堆

堆是将一组数据按照完全二叉树的存储顺序&#xff0c;将数据存储在一个一维数组中的结构。堆有两种结构&#xff0c;一种称为大顶堆&#xff0c;一种称为小顶堆&#xff0c;如下图。 小顶堆&#xff1a;任意节点的值均小于等于它的左右孩子&#xff0c;并且最小的值位于堆顶&am…

哪个蓝牙耳机打电话比较好,打电话降噪蓝牙耳机推荐

近年来&#xff0c;骨传导耳机的市场表现出了显著的增长&#xff0c;其市场竞争也变得异常激烈&#xff0c;与传统无线耳机相比&#xff0c;“骨传导耳机”的知名度还达不到举世皆知的地步&#xff0c;但对于运动群体以及部分有听力损伤的群体来说&#xff0c;骨传导耳机还是有…

大数据和人工智能之间如何的相互促进

文章目录 大数据为人工智能提供支持人工智能加速大数据的分析和应用紧密联系和合作方式综合效应&#xff1a;智能化决策和创新结论 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&…

回归预测 | MATLAB实现SSA-ELM麻雀搜索算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现SSA-ELM麻雀搜索算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现SSA-ELM麻雀搜索算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基…

Java基础数据结构

二叉查找树 二叉查找树&#xff0c;又称二叉树或者二叉搜索树 特点&#xff1a;每一个节点上最多又两个子节点 任意节点左子树上的值都小于当前节点 任意节点右子树上的值都大于当前节点 二叉查找树添加节点&#xff1a;规则 小的存左边 大的存右边 一样的不存 平衡二叉树&am…

小研究 - JVM 逃逸技术与 JRE 漏洞挖掘研究(二)

Java语言是最为流行的面向对象编程语言之一&#xff0c; Java运行时环境&#xff08;JRE&#xff09;拥有着非常大的用户群&#xff0c;其安全问题十分重要。近年来&#xff0c;由JRE漏洞引发的JVM逃逸攻击事件不断增多&#xff0c;对个人计算机安全造成了极大的威胁。研究JRE安…

libdrm全解析二十三 —— 源码全解析(20)

接前一篇文章&#xff1a;libdrm全解析二十二 —— 源码全解析&#xff08;19&#xff09; 本文参考以下博文&#xff1a; DRM 驱动程序开发&#xff08;VKMS&#xff09; 特此致谢&#xff01; 前一篇文章已提到&#xff0c;drmModeGetResources函数值得深入地进行讲解。本回…

C语言练习题Day1

从今天开始分享C语言的练习题&#xff0c;每天都分享&#xff0c;差不多持续16天&#xff0c;看完对C语言的理解可能更进一步&#xff0c;让我们开始今天的分享吧&#xff01; 题目一 执行下面的代码&#xff0c;输出结果是&#xff08;&#xff09; int x5,y7; void swap()…

Vue2向Vue3过度核心技术自定义指令

目录 1 自定义指令1.指令介绍2.自定义指令3.自定义指令语法4.指令中的配置项介绍5.代码示例6.总结 2 自定义指令-指令的值1.需求2.语法3.代码示例 3 自定义指令-v-loading指令的封装1.场景2.需求3.分析4.实现5.准备代码 1 自定义指令 1.指令介绍 内置指令&#xff1a;v-html、v…

基于JSP+Servlet+mysql学生宿舍管理系统

基于JSPServletmysql学生宿舍管理系统 一、系统介绍二、功能展示四、其它1.其他系统实现五.获取源码 一、系统介绍 项目类型&#xff1a;Java web项目 项目名称&#xff1a;基于JSPServlet的学生宿舍管理系统[sushe] 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java…

免费开源跨平台视频下载器 支持数百站点视频和音频下载-ytDownloader

ytDownloader&#xff1a; ytDownloader是一款免费开源跨平台视频下载器&#xff0c;帮助用户从数百个网站下载不同格式的视频和提取音频&#xff0c;使用简单&#xff0c;复制视频链接粘贴即可下载&#xff0c;支持4K画质视频下载&#xff0c;支持Linux、Windows 和 macOS平台…

DBO优化SVM的电力负荷预测,附MATLAB代码

今天为大家带来一期基于DBO-SVM的电力负荷预测。 原理详解 文章对支持向量机(SVM)的两个参数进行优化&#xff0c;分别是&#xff1a;惩罚系数c和 gamma。 其中&#xff0c;惩罚系数c表示对误差的宽容度。c越高&#xff0c;说明越不能容忍出现误差,容易过拟合。c越小&#xff0…

基于Java+SpringBoot+Vue前后端分离图书电子商务网站设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

大数据(二)大数据行业相关统计数据

大数据&#xff08;二&#xff09;大数据行业相关统计数据 目录 一、大数据相关的各种资讯 二、转载自网络的大数据统计数据 2.1、国家大数据政策 2.2、产业结构分析 2.3、应用结构分析 2.4、数据中心 2.5、云计算 一、大数据相关的各种资讯 1. 据IDC预测&#xff0…

软件工程(十五) 行为型设计模式(一)

1、责任链模式 简要说明 通过多个对象处理的请求,减少请求的发送者与接收者之间的耦合。将接受对象链接起来,在链中传递请求,直到有一个对象处理这个请求。 速记关键字 传递职责 类图如下 由类图可以比较容易的看出来,其实就是自己关联自己,形成了一个链,并且自己有…

开源与区块链:去中心化的未来

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

基于Java+SpringBoot+Vue前后端分离人力资源管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

【Linux操作系统】Linux系统编程中的互斥锁

文章目录 1. 互斥锁的原理2. 互斥锁的相关函数3. 互斥锁的例子总结 1. 互斥锁的原理 在Linux系统编程中&#xff0c;互斥锁&#xff08;Mutex&#xff09;是一种用于保护共享资源的同步机制。它可以确保在任意时刻只有一个线程可以访问被保护的资源&#xff0c;从而避免了多个…