【2023 · CANN训练营第一季】:AscendCL应用开发深入讲解 基础知识介绍

news2025/1/12 6:06:16

昇腾(Ascend)CANN(Compute Architecture for Neural Networks)是华为推出的一款面向AI处理器的软件开发工具包,用于支持各种AI应用的开发和部署。它的深度神经网络应用开发流程可以分为以下几个主要步骤

AscendCL应用开发,深度学习网络推理应用开发流程主要步骤如下:

  1. 准备模型:首先,使用 TensorFlow、PyTorch、Caffe等主流深度学习框架训练一个深度神经网络模型。完成训练后,将模型导出为相应的格式,如 TensorFlow 的 *.pb文件,PyTorch 的 *.pth 文件,Caffe 的 *.prototxt 和 *.caffemodel 文件。
  2. 模型转换:使用昇腾CANN中的ATC(AI Tensor Compiler)工具将训练好的模型转换为昇腾处理器可以识别和执行的离线模型(OM文件)。在这个过程中,可能需要对模型进行优化和量化,以提高在昇腾处理器上的执行效率。
  3. 开发应用程序:根据实际应用需求,使用昇腾提供的软件组件(如 AscendCL、AICPU等)和APIs开发深度神经网络应用程序。这可能包括输入数据预处理、模型加载、模型输入输出,推理执行、输出数据后处理等操作,其流程如下图所示
  4. 编译和部署:将开发好的应用程序编译成可执行文件,并将它与转换后的离线模型(OM文件)一起部署到昇腾AI处理器设备上。昇腾处理器设备可以是云端服务器、边缘设备等。
  5. 执行和优化:在昇腾AI处理器上运行部署好的深度神经网络应用程序。在执行过程中,可以通过分析和调试工具找出性能瓶颈并进行相应的优化,以进一步提高应用程序的性能和效率。

在这里插入图片描述

通过以上五个步骤,用户可以使用昇腾CANN工具包开发、部署并优化针对昇腾AI处理器的深度神经网络应用程序

文本主要讲解ATC和开发应用程序的部分内容

2023 · CANN训练营第一季:AscendCL应用开发深入讲解学习笔记

  • 模型转换(ATC)
    • ATC转换流程
  • 开发应用程序
    • 数据预处理
      • DVPP关键功能
    • Host&Device内存管理和数据传输
      • 内存管理
        • Host端内存申请与释放:
        • Device端内存管理:
      • 数据传输
        • Host到Device的数据传输
        • Device到Host的数据传输

模型转换(ATC)

ATC(AI Tensor Compiler)是昇腾CANN工具包中的一个重要组件,主要用于将来自不同深度学习框架的模型转换成昇腾AI处理器能够识别和执行的离线模型(OM文件)。

ATC的主要功能和特点如下:

  1. 支持多种深度学习框架:ATC 支持将 TensorFlow、PyTorch、Caffe、ONNX等主流深度学习框架的模型转换为昇腾处理器可以执行的模型。
  2. 模型优化:在模型转换过程中,ATC 能够对模型进行优化,提高模型在昇腾AI处理器上的执行效率。优化手段包括操作融合、算子优化等。
  3. 量化支持:ATC 支持将浮点模型转换为低精度的定点模型(如int8),以降低模型体积和计算资源需求,同时在保持较高推理精度的前提下,提升模型在昇腾AI处理器上的运行速度。
  4. 离线模型生成:经过ATC转换后,用户将获得一个适用于昇腾AI处理器的离线模型(OM文件)。这个模型可以直接部署到 Ascend
    系列设备上进行推理计算。

要使用ATC进行模型转换,用户需要根据源模型的深度学习框架和转换需求选择适当的转换参数。转换完成后,用户可以使用昇腾提供的其他软件组件(如 AscendCL、AICPU 等)在 Ascend AI处理器上运行和部署离线模型,ATC工具功能架构图如下:
在这里插入图片描述
在上图中,开源框架网络模型经过Parser解析转换为中间态IR Graph,中间态IR经过图准备,图拆分,图优化,图编译等一系列操作后,转成适配昇腾AI处理器离线模型,用户可通过AscendCL接口加载模型件实现推理

ATC转换流程

ATC的流程可以概括为以下几个步骤:

  1. 环境准备:获取ATC工具,设置环境变量
  2. 准备源模型:首先,使用 TensorFlow、PyTorch、Caffe等主流深度学习框架训练一个深度神经网络模型。完成训练后,将模型导出为相应的格式,如 TensorFlow 的 *.pb文件,PyTorch 的 *.onnx 文件,Caffe 的 *.prototxt 和 *.caffemodel 文件。
  3. 安装ATC工具:确保已经安装了昇腾CANN工具包,其中包括ATC工具。通常,CANN工具包安装完成后,ATC工具会自动安装在相应的路径中。
  4. 配置转换参数:为了使用ATC工具进行模型转换,需要为源模型设置一些转换参数,如输入和输出节点、数据类型、优化选项等。这些参数取决于源模型的深度学习框架、网络结构和转换需求。
  5. 执行模型转换:运行ATC命令并提供正确的转换参数,以启动模型转换过程。在转换过程中,ATC会将源模型转换为适用于昇腾AI处理器的离线模型(OM文件),同时进行模型优化和量化(如果需要)。
  6. 验证转换结果:转换完成后,使用转换后的离线模型(OM文件)进行推理测试,以确保模型转换正确且性能满足预期。在必要时,可以对转换参数进行调整并重新执行模型转换,以获得最佳的推理性能。通过以上五个步骤,用户可以使用ATC工具将各种深度学习框架的模型转换为昇腾AI处理器上可执行的离线模型(OM文件)。

在这里插入图片描述

开发应用程序

在这里插入图片描述

数据预处理

受网络结构和训练方式等因素的影响,绝大数神经网络模型对输入数据都有数据都有格式上的限制,在计算机视觉领域,这个限制大多体现在图像的尺寸、色域、归一化参数等,如果源图或视频的尺寸、格式等与网络模型的要求不一致时,我们需要将源图或视频处理成符合模型要求的图或视频。

在这里插入图片描述
CANN提供了两套用于数据预处理的方式:AIPP和DVPP,下面是一个表格,描述了AscendCL数据预处理方式AIPP和推理DVPP的主要特点和差异:

预处理方式AIPPDVPP
目的AI模型推理前的图像预处理视频处理中的图像预处理
处理对象静态图像动态视频序列
设备昇腾AI处理器(Ascend)昇腾AI处理器(Ascend)
功能色域转换色域转换
图像裁剪图像裁剪
数据格式转换(如FP32到FP16数据格式转换(如FP32到FP16
通道重排通道重排
应用场景AI模型推理视频处理(如视频解码、编码等)

DVPP可以分开独立使用,也可以组合使用,组合场景下, 一般先使用DVPP对图片/视频进行解码、抠图、缩放等基础处理,但由于 DVPP硬件上约束,DVPP处理后的图片格式、分辨率有可能不满足模型的要求,因此还需要再经过AIPP进一步做色域转换、抠图、填充等处理

下面举例一个场景:输入一张JPEG图片文件(源图格式为YUV420),经过JEPGD+VPC后,输出一张YUV420SP格式图片,再通过AIPP将图片格式转为RGB,同时进行归一化配置,最后将图片送给模型进行推理
在这里插入图片描述

DVPP关键功能

DVPP(Digital Video Processing Platform)在昇腾AI处理器中负责数字视频处理。其主要功能模块包括解码与编码、图像处理等。这里,我们将详细介绍 JPEGD 图片解码、VPC 视觉预处理以及 JPEGD+VPC 模块的功能。

1.JPEGD 图片解码

JPEGD(JPEG Decoder)是 DVPP 中负责 JPEG 图像解码的功能模块。JPEGD 可以将 JPEG 编码的图像数据解码为其他像素格式,例如 YUV420SP、YUV422SP 和 RGB 等。JPEG 图片解码在许多 AI 应用中都很常见,因为图像数据通常以 JPEG 格式存储和传输,而 AI 模型则需要其他像素格式的数据。

2.VPC 视觉预处理

VPC(Visual Processing Component)是 DVPP 中负责视觉预处理的功能模块。VPC 提供了一系列图像处理功能,包括:色域转换:将图像从一种色域转换为另一种色域,例如从 YUV 到 RGB。图像缩放:改变图像尺寸,可以实现图像的放大或缩小。图像裁剪:从原始图像中截取一个特定区域,以满足特定的尺寸或比例要求。通道重排:对图像通道进行重新排序,以满足模型输入的通道顺序要求。
VPC 对于视频处理和 AI 应用的前处理非常重要,因为它们需要对原始图像数据进行预处理,以适应后续处理和分析的需求。

3.JPEGD+VPC 模块

JPEGD+VPC 模块是将 JPEGD 图片解码和 VPC 视觉预处理功能结合起来的一个组合模块。使用这个模块,开发者可以方便地将 JPEG 编码的图像数据解码为其他像素格式,并在解码过程中直接应用 VPC 提供的图像处理功能。这种集成方式有助于简化数据预处理流程,并提高处理效率。

Host&Device内存管理和数据传输

在这里插入图片描述

在AscendCL中,Host(即内存和CPU)和Device(即Ascend AI处理器(NPU和Device内存))之间需要进行内存管理和数据传输以便在推理任务中共同工作。

在应用开发代码中加载输入数据时,需要申请Host内存进行存储,当输入数据处理完毕后,,需要将处理完成的数据从Host内存拷贝到Device的模型输入内存中,以便Device进行模型推理的专用计算。

以下是实现内存管理和数据传输的主要方法:

内存管理

Host端内存申请与释放:

使用aclrtMallocHost和aclrtFreeHost进行Host端内存的申请和释放。它们用于在Host端分配一段可用的内存区域,以便存储需要在Host和Device之间传输的数据

void* hostBuffer;
size_t bufferSize = ...; // 分配所需内存大小
aclError ret = aclrtMallocHost(&hostBuffer, bufferSize);
// 使用 hostBuffer 进行一些操作,如数据加载等
...
aclrtFreeHost(hostBuffer); // 在不再需要时释放分配的内存

Device端内存管理:

使用aclrtMalloc和aclrtFree进行Device端内存的分配和释放。它们用于在Device端分配一段可用的内存区域,以便存储需要在Host和Device之间传输的数据。

void* deviceBuffer;
size_t bufferSize = ...; // 分配所需内存大小
aclError ret = aclrtMalloc(&deviceBuffer, bufferSize);
// 使用 deviceBuffer 进行一些操作,如数据传输、模型推理等
...
aclrtFree(deviceBuffer); // 在不再需要时释放分配的内存

数据传输

数据传输是指在Host和Device之间传输数据,通常用于将输入数据传输到Device端以进行模型推理,然后将推理结果传输回Host端。

Host到Device的数据传输

使用aclrtMemcpy函数将数据从Host端内存复制到Device端内存。这个函数需要指定源地址、目标地址以及要复制的数据大小。

aclError ret = aclrtMemcpy(deviceBuffer, bufferSize, hostBuffer, bufferSize, ACL_MEMCPY_HOST_TO_DEVICE);

Device到Host的数据传输

使用aclrtMemcpy函数将数据从Device端内存复制到Host端内存。这个函数需要指定源地址、目标地址以及要复制的数据大小。

aclError ret = aclrtMemcpy(hostBuffer, bufferSize, deviceBuffer, bufferSize, ACL_MEMCPY_DEVICE_TO_HOST);

通过上述内存管理和数据传输方法,AscendCL能够实现Host和Device之间的数据交互和协作,从而完成AI应用的推理任务。

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

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

相关文章

TS WIKI 个人知识库软件

TS WIKI 个人知识库软件(VER: 0.1) TS WIKI 目标是做一个可以本地化部署,小型的,适合个人或小型团队的知识管理软件。 T(iny) S(mall) WIKI 软件界面 TS WIKI 功能说明 1、简化的软件依赖和安装 依赖的软件最简化。软件只使用 SQLITE 数据库&#xf…

【Java闭关修炼】SpringMVC-HttpMeaasgeConverter

【Java闭关修炼】SpringMVC-HttpMeaasgeConverter概述RequestBodyRequestEntity使用原生servlet响应浏览器ResponseBody概述 浏览器发送到服务器,将请求报文转换为java对象 服务器响应浏览器,将java对象转换成响应报文 RequestBody 将请求体中的请求报…

Flink系列-6、Flink DataSet的Transformation

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 大数据系列文章目录 官方网址:https://flink.apache.org/ 学习资料:https://flink-learning.org.cn/ 目录Flink 算子Ma…

C生万物 | 火眼辨析指针数组与数组指针

本文我们来讲讲C语言中的易混淆的指针数组与数组指针✒ 文章目录 一、指针数组1、概念明细2、数组地址偏移量与指针偏移量3、指针变量与数组名的置换【✔】4、实例讲解① 指针数组存放地址② 指针数组存放数组 二、数组指针1、数组指针的定义2、&数组名VS数组名3、数组指针…

VL822- GEN2 10Gbps简述及运用(USB3.1 HUB芯片)

VL822是一颗USB3.1 GEN2(10Gbps)的HUB芯片,有三种封装分别是QFN88(10x10x0.85 mm);QFN76(9x9x0.85 mm );QFN56(7x7x0.85 mm)。这三种封装在USB数据协议上都是一样,但各个封装都有自己的实际应用特点。 VL8…

ODrive运放电路的分析和替代方案

SimpleFOC、ODrive和VESC教程链接汇总:请点击   一、电流采样范围的计算 这是一个典型的Lowside电流采样运放电路,下图: 实际运用中会增加阻容做滤波处理。(SP1-SN1)就是电流在R5采样电阻上产生的压降&#xff0c…

模型融合和预测结果融合

模型融合和预测结果融合 文章目录模型融合和预测结果融合1. 模型融合提升技术1. Bagging 方法和随机森林2. Boosting 方法2. 预测结果融合策略1. Voting2. 软投票代码示例:3. Averaging 和 Ranking4. Blending5. Stacking3. 其他提升方法1. 模型融合提升技术 模型融…

一个Java线程的线生(线生 vs 人生)

java线程的使用 1. Java多线程概述 下面我们看下Java的多线程 1.1 java天生就是多线程的 一个Java程序从main()方法开始执行,然后按照既定的代码逻辑执行,看似没有其他线程参与,但实际上Java程序天生就是多线程程序,因为执行main…

设计模式 -- 建造者模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

WPF教程(四)--Dispatcher

一、Dispatcher介绍 微软在WPF引入了Dispatcher,那么这个Dispatcher的主要作用是什么呢? 不管是WinForm应用程序还是WPF应用程序,实际上都是一个进程,一个进程可以包含多个线程,其中有一个是主线程,其余的是…

Embodied AI 具身智能

大模型的时代的到来,现在的大模型的参数几乎是几何级数的上升。 谷歌和柏林工业大学的团队重磅推出了史上最大视觉语言模型——PaLM-E:An Embodied Multimodal Language Model。通才大模型PaLM-E,什么是通才模型,就是多任务统一学…

NeRF必读:NeuS--三维重建的milestone以及脑补的作者脑回路

前言 NeRF从2020年发展至今,仅仅三年时间,而Follow的工作已呈井喷之势,相信在不久的将来,NeRF会一举重塑三维重建这个业界,甚至重建我们的四维世界(开头先吹一波)。NeRF的发展时间虽短&#xf…

C++入门(前篇)

🔥🔥本章重内容 C入门 1.命名空间2. C输入&输出3. 缺省参数 简单的说一下C语言的出现是为了弥补C语言的不足 由于要补充的东西太多,所以就在C语言的基础上又出了C 所以我认为学习C的前提是你得懂C语言 C中可以使用C的大部分语法 可以这样…

Autowired注解与Resource注解的区别

两者的用法 其实这两个注解的作用都一样,都是在做bean的注入,在使用过程中,两个注解有时候可以替换使用 两者的共同点 Resource注解和Autowired注解都可以用作bean的注入.在接口只有一个实现类的时候,两个注解可以互相替换,效果相同. 两者的不同点 Resource注解是Java自身的…

技术分享 | OceanBase 手滑误删了数据文件怎么办

作者:张乾 外星人2号,现兼任六位喵星人的资深铲屎官。 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 手滑误删了数据文件,并且没有可替换的节点时&…

代码随想录第19天 | 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

235. 二叉搜索树的最近公共祖先 var lowestCommonAncestor function(root, p, q) {// 使用递归的方法// 1. 使用给定的递归函数lowestCommonAncestor// 2. 确定递归终止条件if(root null) {return root;}if(root.val > p.val && root.val > q.val) {// 向左子…

set、map容器

一、set 1. set基本概念 简介: 所有元素都会在插入时自动被排序 本质: set/multiset属于关联式容器&#xff0c;底层结构是用二叉树实现。 set和multiset区别: set不允许容器中有重复的元素 multiset允许容器中有重复的元素 2. set构造和赋值 构造: set<T> st; …

安装WMware16、centos7记录

将一台闲置电脑安装虚拟机&#xff0c;计划给个8G内存&#xff0c;80G硬盘&#xff0c;打算安装WMware16&#xff0c;对系统要求是win10 一、将win7升级到win10 1.1、正版的win10安装U盘制作教程 https://www.bilibili.com/video/BV1AW411G7Lq/?vd_sourcecaf04463d06774efd…

Okio 网络提速

文章目录网络数据处理流程Page Cache传统 I/O 拷贝的性能问题零拷贝技术DMA 技术零拷贝技术分类mmapsendfilespliceDirect I/O零拷贝技术性能分析小结OkioOkio 的使用Okio 网络提速的原理Okio 总结总结网络数据处理流程 在讲 Okio 之前&#xff0c;为了能更好的了解 Okio 的优…

如何制定项目里程碑 它的作用体现在哪

制定项目里程碑是项目管理中的一个重要步骤&#xff0c;它可以帮助团队确立项目目标、分解任务、评估风险、规划资源和监控进度。在这篇文章中&#xff0c;我们将介绍如何制定项目里程碑和它的作用。 如何制定项目里程碑 制定项目里程碑需要遵循以下步骤&#xff1a; 1、确定…