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

news/2024/11/14 21:06:36/

学习目标

学习目标

学习资源

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.ppmy.cn/news/52831.html

相关文章

软件测试的新技术和方法

作为一位资深的IT领域博主&#xff0c;我一直在关注软件测试领域的发展趋势。随着技术的不断发展&#xff0c;软件测试领域也在不断更新换代。在本文中&#xff0c;我将分享一些最新的软件测试技术和方法&#xff0c;希望能对广大软件测试工程师提供一些参考。 一、自动化测试…

No.045<软考>《(高项)备考大全》【专项1】《案例分析 - 简介、方法、技巧、理论》

《案例分析》 1 专项介绍1.1 考试分析1.2 试卷参考1.3 题型分析 2 案例分析答题技巧2.1 考试6要2.2 三不要—可以2.3 其他技巧 3 案例中的万金油4 各领域中的重要工具与输出5 案例分析答题技巧6 案例分析理论题历年考点分析6.1 一般知识和科研立项6.2 整体、范围、需求6.3 进度…

算法记录lday2 左右指针 + sliding window滑动窗口

leetcode 977 题目 Given an integer array nums sorted in non-decreasing order, return an array of the squares of each number sorted in non-decreasing order. Example 1: Input: nums [-4,-1,0,3,10] Output: [0,1,9,16,100] Explanation: After squaring, the a…

TryHackMe-Second(boot2root)

Second 排名第二并不是一件坏事&#xff0c;但在这种情况下并非如此。 端口扫描 循例nmap Web枚举 进到8000 注册个账号进去&#xff0c;没啥用 二次注入 虽然登录框那里没有sql注入&#xff0c;但是可以尝试注册个非法账户名尝试二次注入 登录进去之后使用单词计数器 说明…

JavaScript 函数调用和JavaScript 闭包

文章目录 一、JavaScript 函数调用二、JavaScript 闭包总结 一、JavaScript 函数调用 JavaScript 函数有 4 种调用方式。 每种方式的不同在于 this 的初始化。 this 关键字 一般而言&#xff0c;在Javascript中&#xff0c;this指向函数执行时的当前对象。 注意 this 是保留…

文件系统和动静态库

目录 再识文件属性 查看文件属性的原理 初识inode 了解磁盘 什么是磁盘 磁盘的结构 磁盘的存储结构 CHS寻址 磁盘的逻辑结构 使用LBA地址的意义 理解文件系统 页框和页帧 分治思想管理 Linux ext2文件系统 软硬链接 软链接 硬链接 文件的三个时间 动静态库 …

分享一个有意思的文字飞入动画(模仿水滴融合)

先上效果图&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>* {margin: 0;padding: 0;box-sizing: border-box;}:root {--text-…

5岁程序员上岸的5个选择,适合所有的大龄IT从业者,如何突破职场发展

80%的成语 当他35岁大多数都要考虑转行了 否则35岁你必然被淘汰 当天有个小伙伴 问我一个成语员都关心的问题 他呢在一家互联网大厂工作 他和他的一些同事 都有一种所谓的35岁的焦虑症 担心自己在职场上的竞争力 不断的变弱 又担心自己在上有老下有小的年纪 被公司优化掉 在行业…