【2023 · CANN训练营第一季】应用开发深入讲解——第一章 模型转换(1)

news2024/11/19 18:39:39

学习目标

学习目标

学习资源

1.模型转换

  • 模型转换基础
    在线课程
    文档
  • AIPP功能说明
    文档

应用开发(初级)

课程目标:
了解AscendCL的使用场景、基本概念、基本开发流程。
学会使用AscendCL接口开发基础推理应用,应用中包含对图片的基本处理。

第1章 AscendCL概述

课程目标
在这里插入图片描述
ACL简介

ACL全称Ascend Computing Language,昇腾计算语言。

ACL总述

ACL基本概念

●Host:

Host指与Device相连接的X86服务器、ARM服务器,会利用Device提供的NN (Neural-Network )计算能力,完成业务。

●Device

Device指安装了芯片的硬件设备,利用PCIe接口与Host侧连接,为Host提供NN计算能力。

●同步/异步

同步、异步是站在调用者和执行者的角度来观察的,在当前场景下,若在Host调用接口后不等待Device执行完成再返回,则表示Host的调度是异步的;若在Host调用接口后需等待Device执行完成再返回,则表示Host的调度是同步的。

●进程/线程

本课程中提及的进程、线程,若无特别注明,则表示Host上的进程、线程。

●Context:

Context作为一个容器,管理了所有对象(包括Stream、Event、设备内存等)的生命周期。不同Context的Stream.不同Context的的Event是完全隔离的,无法建立同步等待关系。
Context分为两种:
-默认Context:调用aclrtSetDevice接口指定用于运算的Device时,系统会自动隐式创建一个默认Context,一个Device对应一个默认Context,默认Context不能通过acirtDestroyContext接口来释放。
–显式创建的Context:在进程或线程中调用aclrtCreateContext接口显式创建一个Context.

●Stream:

Stream用于维护一些异步操作的执行顺序,确保按照应用程序中的代码调用顺序在Device上执行。基于Stream的kernel执行和数据传输能够实现以下几种类型的并行:
-Host运算操作和Device运算操作并行;
-Host运算操作和“Host到JDevice的数据传输”并行;
-“Host到Device的数据传输”和Device运算操作并行;
-Device内的运算并行。
Stream分两种:
-默认Stream:调用aclrtSetDevice接口指定用于运算的Device时,系统会自动隐式创建一个默认Stream,一个Device对应一个默认Stream,默认Stream不能通过aclrtDestroyStream接口来释放。
-显式创建的Stream:在进程或线程中调用aclrtCreateStream接口显式创建一个Stream。

●Event:

支持调用ACL接口同步Stream之间的任务,包括同步Host与Device之间的任务、Device与Device间的任务。
例如,若stream2的任务依赖stream1的任务,想保证stream1中的任务先完成,这时可创建一个Event,并将Event插入到stream1,在执行stream2的任务前,先同步等待Event完成。

●动态AIPP:

AIPP (Al Preprocessing)用于在Al Core上完成图像预处理,包括色域转换(转换图像格式)、图像归一化((减均值/乘系数)和抠图(指定抠图起始点,抠出神经网络需要大小的图片)等。
AIPP区分为静态AIPP和动态AIPP。您只能选择静态AIPP或动态AIPP方式来处理图片,不能同时配置静态AlPP和动态AIPP两种方式。
-静态AIPP:模型转换时设置AIPP模式为静态,同时设置AIPP参数,模型生成后,AIPP参数值被保存在离线模型(*.om)中,每次模型推理过程采用固定的AIPP预处理参数(无法修改)。
如果使用静态AIPP方式,多Batch情况下共用同一份AIPP参数。
-动态AIPP:模型转换时仅设置AIPP模式为动态,每次模型推理前,根据需求,在执行模型前设置动态AIPP参数值,然后在模型执行时可使用不同的AlPP参数。设置动态AIPP参数值的接口请参见设置动态AIPP参数。
如果使用动态AIPP方式,多Batch可使用不同的AIPP参数。

主要接口调用流程

主要接口调用流程

HelloWorld

在这里插入图片描述

#include <iostream>
#include "acl/acl.b"
#define INFO_LOG(fmt,args...) fprintf(stdout,"[INFO] " fmt "\n"
#define WARN_LOG(fmt, args...) fprintf(stdout, "[WARN] " fmt "'\n",##args)
#define ERROR_LOG(fmt, args..) fprintf(stdout, "[ERROR] " fmt "\n",##args)using namespace std;
int main()
{
INFO_LOG("ACL Hello World.");//ACL init
const char *aclConfigPath = "acl.json";
aclError ret = acllnit(aclConfigPath); #初始化
if (ret != ACL_ERROR_NONE) {
	ERROR_LOG("acl init failed");
}
INFO_LOG("acl init success");
ret = aclFinalize();  #销毁
if (ret != ACL_ERROR_NONE){
	ERROR_LOG("finalize acl failed");
}
INFO_LOG("end to finalize acl");
return O;
}

编译配置

使用cmake编译
编译配置

第2章 快速入门

应用总体执行流程

在这里插入图片描述

部署与运行

在这里插入图片描述
首先进入昇腾社区网站(https://www.hiascend.com/),在开发者菜单中找到开源子菜单(https://www.hiascend.com/zh/developer/opensource),找到CANN Samples仓(https://gitee.com/ascend/samples),此时可以打开华为云服务器,具体的配置环境链接可以看另一篇博客 环境配置

切换用户:
在这里插入图片描述
可以看到这里有samples文件夹,直接进入到resnet50_firstapp文件夹。

cd samples/cplusplus/level2_simple_inference/1_classification

获取ResNet-50开源模型,放到“resnet50_firstapp/model“目录下。
ResNet-50网络的模型文件(*.prototxt)

wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/resnet50/resnet50.prototxt

ResNet-50网络的权重文件(*.caffemodel)

wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/AE/ATC%20Model/resnet50/resnet50.caffemodel

执行模型转换
执行以下命令(以昇腾310 AI处理器为例),将原始模型转换为昇腾AI处理器能识别的*.om模型文件。请注意,执行命令的用户需具有命令中相关路径的可读、可写权限。

atc --model=model/resnet50.prototxt --weight=model/resnet50.caffemodel --framework=0 --output=model/resnet50 --soc_version=Ascend310
  • –model:ResNet-50网络的模型文件(*.prototxt)的路径。

  • –weight:ResNet-50网络的预训练模型文件(*.caffemodel)的路径。

  • –framework:原始框架类型。0表示Caffe。

  • –output:resnet50.om模型文件的路径。请注意,记录保存该om模型文件的路径,后续开发应用时需要使用。

  • –soc_version:昇腾AI处理器的版本。进入“CANN软件安装目录/compiler/data/platform_config”目录,".ini"文件的文件名即为昇腾AI处理器的版本,请根据实际情况选择。

关于各参数的详细解释,请参见《ATC工具使用指南》《ATC工具使用指南》《ATC工具使用指南》。

正在启动
在这里插入图片描述
启动成功
在这里插入图片描述
准备测试图片
使用如下命令下载图片,放到“resnet50_firstapp/data“目录下。

wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/models/aclsample/dog1_1024_683.jpg

编译及运行应用
设置环境变量

export APP_SOURCE_PATH=/home/HwHiAiUser/samples/cplusplus/level2_simple_inference/1_classification/resnet50_firstapp
export DDK_PATH=/home/HwHiAiUser/Ascend/ascend-toolkit/latest
export NPU_HOST_LIB=${INSTALL_DIR}/runtime/lib64/stub
chmod +x sample_build.sh
./sample_build.sh

在这里插入图片描述
出现上图代表编译成功

说明: 如果执行脚本报错“ModuleNotFoundError: No module named ‘PIL’”,则表示缺少Pillow库,请使用 pip3 install Pillow --user 命令安装Pillow库。

运行应用。
以运行用户将resnet50_firstapp目录上传至运行环境,以运行用户登录运行环境,切换到resnet50_firstapp目录下,执行以下命令。

chmod +x sample_run.sh
./sample_run.sh

终端上屏显的结果如下,index表示类别标识、value表示该分类的最大置信度:
在这里插入图片描述

代码详解

在这里插入图片描述
初始化函数
在这里插入图片描述
执行推理
在这里插入图片描述
在这里插入图片描述
对结果进行预处理
在这里插入图片描述
卸载模型,释放内存
在这里插入图片描述
AscendCL去初始化
在这里插入图片描述

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

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

相关文章

javaScript常见面试题(二)

一、浅拷贝和深拷贝 浅拷贝&#xff1a;&#xff08;1&#xff09;对于基本数据类型&#xff0c;拷贝的是值&#xff0c;修改的时候数据互不影响&#xff1b;&#xff08;2&#xff09;对于引用数据类型&#xff0c;拷贝的是在堆内存中存储的内存地址&#xff0c;修改的时候&a…

mapreduce基础: 手写本地wordcount案例

文章目录 一、源代码1. WordCountMapper类2. WordCountReducer类3. WordCountDriver类 二、运行截图 一、源代码 1. WordCountMapper类 package org.example.wordcount;import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apac…

yum库和nfs共享服务

yum库 redhat&#xff0c;centos用的是.rpm的包&#xff0c;用yum解决依赖包关系下载 ubuntu&#xff0c;debian用的是.deb的包&#xff0c;用apt解决依赖包的关系下载 yum软件仓库的提供方式 FTP服务: ftp://… HTTP服务: http://…或者https&#xff1a;//… 本地目录: fi…

母婴品牌内容输出怎么做?“四板斧”送你

新媒体时代&#xff0c;信息大爆炸&#xff0c;人们的注意力有限&#xff0c;有噱头和亮点的内容才能博得注意&#xff0c;成为用户关注的焦点。 母婴行业重视品牌效益和产品的质量&#xff0c;毕竟类似“三聚氰胺”的惨剧谁也不希望再发生。母婴产品的质量依赖技术和生产线支…

C语言从入门到精通第9天(循环结构的使用)

循环结构的使用 while语句do-while语句for语句嵌套循环 循环结构可以重复的执行一段代码块&#xff0c;在C语言中提供了三种不同类型的循环结构&#xff1a;for、while和do-while。 while语句 语法&#xff1a; while(表达式){ 语句&#xff1b; } 如果表达式为真则执行结构体…

并发编程学习笔记

为什么学&#xff1f; 只要去做一个技术含量稍微好点的系统&#xff0c;并发包下面的东西是很容易会要用到的 synchronized(Object){ } 主要是用来给对象加锁 synchronized底层原理 首先监视器的计数器是0&#xff0c;然后线程一访问&#xff0c;会将值改为1&#xff0c;…

[Gitops--4] OpenELB

OpenELB OpenELB是一个开源的负载均衡器,功能和metalLB类似 OpenELB主要两种工作模式: Layer2和BGP模式.目前OpenELB的BGP不支持ipv6 OpenELB核心思想就是通过某种方式将特定的VIP的流量引导k8s集群中,然后通过Kube-proxy将流量转发到后面的特定服务. 1. OpenELB介绍 1.1 La…

对于python文件,敲下回车后发生了什么

引言 我们常说 Python 一是门解释型语言&#xff0c;只需要敲下 python code.py就可以运行编写的代码&#xff0c;而无需使用类似于 javac 或者 gcc 进行编译。那么&#xff0c;Python 解释器是真的一行一行读取 Python 源代码而后执行吗? 实际上&#xff0c;Python 在执行程序…

为什么要进行倾斜摄影三维模型的顶层合并?

为什么要进行倾斜摄影三维模型的顶层合并&#xff1f; 1、倾斜摄影三维模型顶层合并的重要性 倾斜摄影三维模型的顶层合并是指将拍摄同一区域的多个倾斜角度的影像进行融合&#xff0c;生成一个连续的、完整的三维地理信息数据。其原因主要有以下几点&#xff1a; &#xff0…

关于倾斜摄影三维模型轻量化数据大小和质量关系分析

关于倾斜摄影三维模型轻量化数据大小和质量关系分析 倾斜摄影三维模型轻量化是一种常用的技术&#xff0c;通过对原始三维模型数据进行压缩和简化&#xff0c;减小其数据大小&#xff0c;从而提高数据传输和展示效率。然而&#xff0c;轻量化过程中可能会对数据质量产生影响。以…

性能测试——安装Loadrunner11.0的详细步骤

一、下载Loadrunner11.0版本 去相关网站下载即可 二、安装 &#xff08;windows与虚拟机上安装操作大相径庭&#xff09; 1、将ISO文件导入&#xff0c;打开光驱&#xff0c;运行“setup.exe“ 2、点击安装&#xff0c;部分机器会提示缺少“Microsoft Visual C 2005 SP1运行组…

有效的字母异位词

给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次数都相同&#xff0c;则称 s 和 t 互为字母异位词。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetco…

Java 将json中key值中带有下划线的部分转为驼峰格式

一、背景说明 在开发过程中&#xff0c;有时会遇到第三方厂商提供的接口返回结果不是严格按照驼峰命名&#xff0c;需要将其中带有下划线的字段进行格式化转换为驼峰命名。 如下图中的self_auth、user_id、user_name、creator_name 和 others_auths 等 key 值。 如果是对 JS…

Mysql 45讲和45问笔记(未完待续0203/04/24)

一、mysql 45讲 1&#xff09;索引的本质讲解 定义解释 所以是帮助Mysql高效获取数据的排好序的数据结构 索引数据结构 ①二叉树 ②红黑树 ③Hash表 ④B-Tree 原理讲解 可以看到右边的数据结构里面&#xff0c;是按照k-v来存数据结构的&#xff0c;key是col2的字段&#xf…

【Linux】线程-线程概念

线程概念 什么是线程线程的优点和缺点线程的用途和线程异常线程与进程的区别 什么是线程 实际上&#xff0c;线程是一个进程内部的控制序列&#xff0c;一个程序的一个执行线路就是一个线程。 并且一个进程中至少有一个线程&#xff0c;本质上&#xff0c;一个进程内部如果有多…

6. 树的入门

6. 树的入门 之前我们实现的符号表中&#xff0c;不难看出&#xff0c;符号表的增删查操作&#xff0c;随着元素个数N的增多&#xff0c;其耗时也是线性增多的&#xff0c;时间复杂度都是O(n),为了提高运算效率&#xff0c;接下来我们学习树这种数据结构。 6.1 树的基本定义 …

MybatisPlus-入门项目搭建、SQL日志打印、实体类注解、简单持久层操作

Mybatis-Plus mybatis plus概述 ​ Mybatis Plus &#xff08;opens new window&#xff09;简称 MP&#xff0c;它是一个MyBatis 的增加工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 Mybatis Plus官网&#xff1a;https://…

拉格朗日函数对偶问题、KKT条件

一、概念介绍 KKT最优化条件是Karush(1939)以及Kuhn和Tucker(1951)先后独立发表出来的&#xff0c;但在Kuhn和Tucker发表之后才逐渐受到重视&#xff0c;因此多数情况下记载成库恩-塔克条件(Kuhn-Tucker conditions)。先介绍几个优化的概念。 1.1 优化 最优化问题&#xff0…

大彩串口屏新品发布:大彩7寸新品RS485/232双通讯口人机界面发布!

一、产品介绍 新品发布&#xff1a;大彩7寸新品RS485/232双通讯口人机界面发布&#xff01; 此次发布7.0寸外壳HMI产品采用普清800*480液晶屏、触摸选用电阻触摸&#xff0c;硬件性能上与M型医用级组态串口屏一样&#xff0c;软件上拥有炫酷的动画效果&#xff0c;页面切换流…

路侧激光雷达目标检测系统-篇2

本篇文章承接上文&#xff0c;主要阐述代码&#xff0c;分布的成果等工作。识别结果为单帧图片&#xff0c;每一张图片识别完之后&#xff0c;放在一起&#xff0c;就可以连续播放单帧文件&#xff0c;变成视频&#xff0c;或者直接在matlab图窗里面播放。关于这个函数的功能我…