转载:【AI系统】推理引擎示例:AscendCL

news/2024/12/11 21:56:16/文章来源:https://www.cnblogs.com/xueaigc/p/18600858

AscendCL 作为华为 Ascend 系列 AI 处理器的软件开发框架,为用户提供了强大的编程支持。通过 AscendCL,开发者可以更加高效地进行 AI 应用的开发和优化,从而加速 AI 技术在各个领域的应用和落地。AscendCL 的易用性和高效性,使得它成为开发 AI 应用的重要工具之一。

本文将介绍 AscendCL 的概念、优势、应用场景以及基本开发流程。

AscendCL 基本介绍

AscendCL(Ascend Computing Language)是一套用于在昇腾平台上开发神经网络应用的 C 语言 API 库,提供运行资源管理、内存管理、模型加载与执行、算子加载与执行、媒体数据处理等 API,能够实现利用昇腾硬件计算资源、在昇腾 CANN 平台上进行深度学习推理计算、图形图像预处理、单算子加速计算等能力。

简单来说,就是统一的 API 框架,实现对所有资源的调用。其中,计算资源层是昇腾 AI 处理器的硬件算力基础,主要完成神经网络的矩阵相关计算、完成控制算子/标量/向量等通用计算和执行控制功能、完成图像和视频数据的预处理,为神经网络计算提供了执行上的保障。

AscendCL 优势

AscendCL 优势主要有三个要点:

  • 高度抽象:算子编译、加载、执行的 API 归一,相比每个算子一个 API,AscendCL 大幅减少 API 数量,降低复杂度。

  • 向后兼容:AscendCL 具备向后兼容,确保软件升级后,基于旧版本编译的程序依然可以在新版本上运行。

  • 零感知芯片:一套 AscendCL 接口可以实现应用代码统一,多款昇腾 AI 处理器无差异。

image

AscendCL 应用场景

  • 开发应用:用户可以直接调用 AscendCL 提供的接口开发图片分类应用、目标识别应用等。

  • 供第三方框架调用:用户可以通过第三方框架调用 AscendCL 接口,以便使用昇腾 AI 处理器的计算能力。

  • 供第三方开发 lib 库:用户还可以使用 AscendCL 封装实现第三方 lib 库,以便提供昇腾 AI 处理器的运行管理、资源管理等能力。

基本概念

概念 描述
同步/异步 本文中提及的同步、异步是站在调用者和执行者的角度:若在调用 AscendCL 接口后不等待Device 侧的任务执行完成再返回,则表示调度是异步的;若在调用 AscendCL 接口后需等待Device 侧的任务执行完成再返回,则表示调度是同步的。
进程/线程 本文中提及的进程、线程,若无特别注明,则表示 Host 上的进程、线程。
Host Host 指与 Device 相连接的 X86 服务器、ARM 服务器,会利用 Device 提供的 NN(Neural-Network )计算能力,完成业务。
Device Device 指安装了昇腾 AI 处理器的硬件设备,利用 PCIe 接口与 Host 侧连接,为 Host 提供 NN 计算能力。若存在多个 Device,多个 Device 之间的内存资源不能共享。
Context Context 作为一个容器,管理了所有对象(包括 Stream、Event、设备内存等)的生命周期。不同 Context 的 Stream、不同 Context 的 Event 是完全隔离的,无法建立同步等待关系。Context 分为两种:默认 Context:调用aclrtSetDevice接口指定用于运算的 Device 时,系统会自动隐式创建一个默认 Context,一个 Device 对应一个默认 Context,默认 Context 不能通过aclrtDestroyContext接口来释放。显式创建 Context:推荐,在进程或线程中调用aclrtCreateContext接口显式创建一个 Context。
Stream Stream 用于维护一些异步操作的执行顺序,确保按照应用程序中的代码调用顺序在 Device 上执行。基于 Stream 的 kernel 执行和数据传输能够实现 Host 运算操作、Host 与 Device 间的数据传输、Device 内的运算并行。Stream 分两种:默认 Stream:调用aclrtSetDevice接口指定用于运算的 Device 时,系统会自动隐式创建一个默认 Stream,一个 Device 对应一个默认 Stream,默认 Stream 不能通过aclrtDestroyStream接口来释放。显式创建 Stream:推荐,在进程或线程中调用aclrtCreateStream接口显式创建一个 Stream。
Event 支持调用 AscendCL 接口同步 Stream 之间的任务,例如同一个 Device 上的多个任务。例如,若 stream2 的任务依赖 stream1 的任务,想保证 stream1 中的任务先完成,这时可创建一个 Event,并将 Event 插入到 stream1,在执行 stream2 的任务前,先同步等待 Event 完成。
AIPP AIPP(Artificial Intelligence Pre-Processing)用于在 AI Core 上完成图像预处理,包括色域转换(转换图像格式)、图像归一化(减均值/乘系数)和抠图(指定抠图起始点,抠出神经网络需要大小的图片)等。AIPP 区分为静态 AIPP 和动态 AIPP。您只能选择静态 AIPP 或动态 AIPP 方式来处理图片,不能同时配置静态 AIPP 和动态 AIPP 两种方式。静态 AIPP:模型转换时设置 AIPP 模式为静态,同时设置 AIPP 参数,模型生成后,AIPP 参数值被保存在离线模型(*.om)中,每次模型推理过程采用固定的 AIPP 预处理参数(无法修改)。如果使用静态 AIPP 方式,多 Batch 情况下共用同一份 AIPP 参数。动态 AIPP:模型转换时设置 AIPP 模式为动态,每次模型推理前,根据需求,在执行模型前设置动态 AIPP 参数值,然后在模型执行时可使用不同的 AIPP 参数。如果使用动态 AIPP 方式,多 Batch 可使用不同的 AIPP 参数。
动态 Batch/动态分辨率 在某些场景下,模型每次输入的 batch size 或分辨率是不固定的,如检测出目标后再执行目标识别网络,由于目标个数不固定导致目标识别网络输入 BatchSize 不固定。动态 Batch:用户执行推理时,其 batch size 是动态可变的。动态分辨率: 用户执行推理时,每张图片的分辨率 H*W 是动态可变的。
动态维度(ND 格式) 为了支持 Transformer 等网络在输入格式的维度不确定的场景,需要支持 ND 格式下任意维度的动态设置。ND 表示支持任意格式,当前 N<=4。
通道 在 RGB 色彩模式下,图像通道就是指单独的红色 R、绿色 G、蓝色 B 部分。也就是说,一幅完整的图像,是由红色绿色蓝色三个通道组成的,它们共同作用产生了完整的图像。同样在 HSV 色系中指的是色调 H,饱和度 S,亮度 V 三个通道。
标准形态 指 Device 做为 EP,通过 PCIe 配合主设备(X86、ARM 等各种服务器)进行工作,此时 Device 上的 CPU 资源仅能通过 Host 调用,相关推理应用程序运行在 Host。Device 只为服务器提供 NN 计算能力。
EP 模式 以昇腾 AI 处理器的 PCIe 的工作模式进行区分,如果 PCIe 工作在从模式,则称为 EP 模式。
RC 模式 以昇腾 AI 处理器的 PCIe 的工作模式进行区分,如果 PCIe 工作在主模式,可以扩展外设,则称为 RC 模式。

Device、Context、Stream 关系

下面将会介绍 Device、Context 和 Stream 在 AscendCL 框架中的作用及其相互关系:

image

  1. Device,用于指定计算设备。

Device 的生命周期源于首次调用 aclrtSetDevice 接口。每次调用 aclrtSetDevice 接口,系统会进行引用计数加 1;调用 aclrtResetdevice 接口,系统会进行引用计数减 1。当引用计数减为零时,在本进程中 Device 上的资源不可用。

  1. Context,在 Device 下,一个 Context 一定属于一个唯一的 Device。

Context 分隐式创建和显式创建。隐式创建的 Context(即默认 Context),生命周期始于调用 aclrtSetDevice 接口,终结于调用 aclrtResetdevice 接口使引用计数为零时。隐式 Context 只会被创建一次,调用 aclrtSetDevice 接口重复指定同一个 Device,只增加隐式创建的 Context 的引用计数。

显式创建的 Context,生命周期始于调用 aclrtCreateContext 接口,终结于调用 aclrtDestroyContext 接口。若在某一进程内创建多个 Context(Context 的数量与 Stream 相关,Stream 数量有限制,请参见 aclrtCreateStream),当前线程在同一时刻内只能使用其中一个 Context,建议通过 aclrtSetCurrentContext 接口明确指定当前线程的 Context,增加程序的可维护性。

值得注意的是,进程内的 Context 是共享的,可以通过 aclrtSetCurrentContext 进行切换。

  1. Stream,是 Device 上的执行流,在同一个 stream 中的任务执行严格保序。

其 Stream 分隐式创建和显式创建。每个 Context 都会包含一个默认 Stream,这个属于隐式创建,隐式创建的 stream 生命周期同归属的 Context。

用户可以显式创建 stream,显式创建的 stream 生命周期始于调用 aclrtCreateStream,终结于调用 aclrtDestroyStream 接口。显式创建的 stream 归属的 Context 被销毁或生命周期结束后,会影响该 stream 的使用,虽然此时 stream 没有被销毁,但不可再用。

  1. Task/Kernel,是 Device 上真正的任务执行体。

线程、Context、Stream 关系

一个用户线程一定会绑定一个 Context,所有 Device 的资源使用或调度,都必须基于 Context。一个线程中当前会有一个唯一的 Context 在用,Context 中已经关联了本线程要使用的 Device。此时可以通过 aclrtSetCurrentContext 进行 Device 的快速切换。

一个线程中可以创建多个 Stream,不同的 Stream 上计算任务是可以并行执行;多线程场景下,推荐每个线程创建一个 Stream,线程之间的 Stream 在 Device 上相互独立,每个 Stream 内部的任务是按照 Stream 下发的顺序执行。

多线程的调度依赖于运行应用的操作系统调度,多 Stream 在 Device 侧的调度,由 Device 上调度组件进行调度。

进程内多线程间 Context 切换

  • 一个进程中可以创建多个 Context,但一个线程同一时刻只能使用一个 Context。
  • 线程中创建的多个 Context,线程缺省使用最后一次创建的 Context。
  • 进程内创建的多个 Context,可以通过 aclrtSetCurrentContext 设置当前需要使用的 Context。

image

默认 Context 和默认 Stream

Device 上执行操作下发前,必须有 Context 和 Stream,这个 Context、Stream 可以显式创建,也可以隐式创建。隐式创建的 Context、Stream 就是默认 Context、默认 Stream。

默认 Stream 作为接口入参时,直接传 NULL。

默认 Context 不允许用户执行 aclrtGetCurrentContext 或 aclrtSetCurrentContext 操作,也不允许执行 aclrtDestroyContext 操作。

默认 Context、默认 Stream 一般适用于简单应用,用户仅仅需要一个 Device 的计算场景下。多线程应用程序建议全部使用显式创建的 Context 和 Stream。

多线程、多 Stream 性能考虑

线程调度依赖运行的操作系统,Stream 上下发了任务后,Stream 的调度由 Device 的调度单元调度,但如果一个进程内的多 Stream 上的任务在 Device 存在资源争抢的时候,性能可能会比单 Stream 低。

当前昇腾 AI 处理器有不同的执行部件,如 AI Core、AI CPU、Vector Core 等,对应使用不同执行部件的任务,建议多 Stream 的创建按照算子执行引擎划分。

单线程多 Stream 与多线程多 Stream(一个进程中可以包含多个线程,每个线程中一个 Stream)性能上哪个更优,具体取决于应用本身的逻辑实现,一般来说前者性能略好,原因是相对后者,应用层少了线程调度开销。

基本开发流程

调用 AscendCL 接口,可开发包含模型推理、媒体数据处理、单算子调用等功能的应用,这些功能可以独立存在,也可以组合存在。下图给出了使用 AscendCL 接口开发 AI 应用的整体接口调用流程。

image

上图根据应用开发中的典型功能抽象出主要的接口调用流程。例如,如果模型对输入图片的宽高要求与用户提供的源图不一致,则需要媒体数据处理,将源图裁剪成符合模型的要求;如果需要实现模型推理的功能,则需要先加载模型,模型推理结束后,则需要卸载模型;如果模型推理后,需要从推理结果中查找最大置信度的类别标识对图片分类,则需要数据后处理。

其基本流程如下所示:

  1. AscendCL 初始化:调用 aclInit 接口实现初始化 AscendCL。

  2. 运行资源管理申请:申请运行管理资源(Device、Context、Stream 等)的具体流程。

  3. 具体计算:分为模型推理/单算子调用/媒体数据处理三部分。

    • 模型推理

      • 模型加载:模型推理前,需要先将对应的模型加载到系统中。注意加载模型前需要有适配昇腾 AI 处理器的离线模型。
      • (可选)媒体数据处理:可实现 JPEG 图片编/解码、视频解码、抠图/图片缩放/格式转换等功能。
      • 模型执行:使用模型实现图片分类、目标识别等推理功能。
      • (可选)数据后处理:处理模型推理的结果,此处根据用户的实际需求来处理推理结果,例如用户可以将获取到的推理结果写入文件、从推理结果中找到每张图片最大置信度的类别标识等。
      • 模型卸载:调用 aclmdlUnload 接口卸载模型。
    • 算子调用

      • 如果 AI 应用中不仅仅包括模型推理,还有数学运算(例如 BLAS 基础线性代数运算)、数据类型转换等功能,也想使用昇腾的算力,直接通过 AscendCL 接口加载并执行单个算子,省去模型构建、训练的过程,相对轻量级,又可以使用昇腾的算力。
      • 另外,自定义的算子,也可以通过单算子调用的方式来验证算子的功能。
  4. 运行管理资源释放:所有数据处理都结束后,需要依次释放运行管理资源。

  5. AscendCL 去初始化:调用 aclFinalize 接口实现 AscendCL 去初始化。

如果您想了解更多AI知识,与AI专业人士交流,请立即访问昇腾社区官方网站https://www.hiascend.com/或者深入研读《AI系统:原理与架构》一书,这里汇聚了海量的AI学习资源和实践课程,为您的AI技术成长提供强劲动力。不仅如此,您还有机会投身于全国昇腾AI创新大赛和昇腾AI开发者创享日等盛事,发现AI世界的无限奥秘~
转载自:| https://www.cnblogs.com/ZOMI/articles/18560903 | header |
| ---------------------------------------------- | ------ |
| | |

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

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

相关文章

转载:【AI系统】轻量级CNN模型综述

神经网络模型被广泛的应用于工业领域,并取得了巨大成功。然而,由于存储空间以及算力的限制,大而复杂的神经网络模型是难以被应用的。首先由于模型过于庞大,计算参数多(如下图所示),面临内存不足的问题。其次某些场景要求低延迟,或者响应要快。所以,研究小而高效的 CNN 模…

转载:【AI系统】推理系统介绍

推理系统是一个专门用于部署神经网络模型,执行推理预测任务的 AI 系统。它类似于传统的 Web 服务或移动端应用系统,但专注于 AI 模型的部署与运行。通过推理系统,可以将神经网络模型部署到云端或者边缘端,并服务和处理用户的请求。因此,推理系统也需要应对模型部署和服务生…

转载:【AI系统】推理系统引言

在深入探究 AI 编译原理之后,将进一步迈向一个与日常生活紧密相连的新领域。这个领域无处不在,无论是日常使用的购物应用、观看在线视频的平台,还是钟爱的游戏,它们都与这个领域息息相关。该领域,便是推理系统与推理引擎。 那么,推理系统与推理引擎究竟是什么呢?它们之间…

转载:【AI系统】TVM 实践案例

在本文我们探讨一下,如何利用 AI 编译器在新的硬件上部署一个神经网络,从算法设计到实际运行,有哪些需要考虑的地方?本文将以 TVM 为例,首先介绍一下 TVM 的工作流:导入模型。TVM 可以从 TensorFlow、PyTorch、ONNX 等框架导入模型。 转换为 Relay。Relay 是 TVM 的中间表…

转载:【AI系统】昇腾异构计算架构 CANN

本文将介绍昇腾 AI 异构计算架构 CANN(Compute Architecture for Neural Networks),这是一套为高性能神经网络计算需求专门设计和优化的架构。CANN 包括硬件层面的达芬奇架构和软件层面的全栈支持,旨在提供强大的硬件基础和管理网络模型、计算流及数据流的软件栈,以支撑神…

转载:【AI系统】计算与调度

上一篇我们了解了什么是算子,神经网络模型中由大量的算子来组成,但是算子之间是如何执行的?组成算子的算法逻辑跟具体的硬件指令代码之间的调度是如何配合? 计算与调度 计算与调度的来源 图像处理在当今物理世界中是十分基础且开销巨大的计算应用。图像处理算法在实践中需要…

转载:【AI系统】AI 编译器后端优化

AI 编译器分为多层架构,最顶层由各种 AI 训练框架编写的神经网络模型架构,一般由 Python 编写,常见的 AI 训练框架有 PyTorch、MindSpore、PaddlePaddle 等。在导入 AI 编译器时需要用对应框架的 converter 功能转换为 AI 编译器统一的 Graph IR,并在计算图级别由 Graph Op…

转载:【AI系统】图算 IR

本文将围绕计算图介绍相关内容。首先介绍计算图的基本构成,包括计算图的整体介绍、与自动微分的关系、控制流的表示方法等;接着将介绍 AI 框架产生计算图的方式,包括产生静态图和产生动态图的方式;之后将介绍静态和动态计算图的内容,包括 AI 框架关于计算图的不同方案,例…

【Creo 5.0 M280软件下载与安装教程】

Proe5.0 M280终极版本是5.0的最后一个版本,以后将不再更新,这是由PTC推出的一款CAD/CAM/CAE一体化三维设计软件,软件最大的特点就是参数化。软件采用模块的方式,可以广泛地应用于各类草图绘制、零件制作、装配设计、钣金设计、加工处理等领域。 1、安装包 我用夸克网盘分享…

转载:【AI系统】布局转换原理与算法

数据布局转换目前已经越来越多地用于编译器的前端优化,将内部数据布局转换为后端设备友好的形式。数据布局转换主要影响程序的空间局部性,所谓空间局部性指的是如果一个内存位置被引用了一次,那么程序很可能在不远的将来引用其附近的一个内存位置,它会影响到程序执行中的缓…

车流量识别摄像机

车流量识别摄像机是一种利用先进的图像识别技术和智能算法来监测道路上车辆数量和流量的设备。通过安装在道路或交通路口的摄像头,可以实时准确地统计车辆的通过情况,进而为交通管理、道路规划以及交通安全提供重要数据支持。车流量识别摄像机是一种利用先进的图像识别技术和…

SSL证书有效期将缩短为45天

作者:CEO博客最近全球互联网安全界的热点之一是苹果公司10月10日提出的缩短SSL证书有效期为45天的国际标准提案,笔者当时本想写篇文章说一说这事,但是最终还是决定等等,看看业界的反应后再讲这事。两个月过去了,这事在国外反映强烈,还在持续热议中。但是,国内好像一点反…