AscendCL(Ascend Computing Language)是一套用于在昇腾平台上开发深度神经网络推理应用的C语言API库,提供运行资源管理、内存管理、模型加载与执行、算子加载与执行、媒体数据处理等API,能够实现利用昇腾硬件计算资源、在昇腾CANN平台上进行深度学习推理计算、图形图像预处理、单算子加速计算等能力。简单来说,就是统一的API框架,实现对所有资源的调用。
计算资源层是昇腾AI处理器的硬件算力基础,主要完成神经网络的矩阵相关计算、完成控制算子/标量/向量等通用计算和执行控制功能、完成图像和视频数据的预处理,为深度神经网络计算提供了执行上的保障。
AscendCL的应用场景:
AscendCL的优势:
概念 |
描述 |
---|---|
同步/异步 |
本文中提及的同步、异步是站在调用者和执行者的角度,在当前场景下,若在调用接口后不等待Device执行完成再返回,则表示调度是异步的;若在调用接口后需等待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分为两种:
|
Stream |
Stream用于维护一些异步操作的执行顺序,确保按照应用程序中的代码调用顺序在Device上执行。 基于Stream的kernel执行和数据传输能够实现Host运算操作、Host与Device间的数据传输、Device内的运算并行。 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两种方式。
|
动态Batch/动态分辨率 |
在某些场景下,模型每次输入的batch size或分辨率是不固定的,如检测出目标后再执行目标识别网络,由于目标个数不固定导致目标识别网络输入BatchSize不固定。
|
动态维度(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模式。 |
… aclrtCreateContext(&ctx1,0); aclrtCreateStream(&s1); aclopExecuteV2(op1,...,s1); aclrtCreateContext(&ctx2,1); /*在当前线程中,创建ctx2后,当前线程对应的Context切换为ctx2,对应在Device 1进行后续的计算任务,本例中将在Device 1上进行op2的执行调用 */ aclrtCreateStream(&s2); aclopExecuteV2(op2,...,s2); aclrtSetCurrentContext(ctx1); /*在当前线程中,通过Context切换,使后续计算任务在对应的Device 0上进行*/ aclopExecuteV2(op3,...,s1); …
示例代码如下,仅供参考,不可以直接拷贝编译运行:
… aclInit(...); aclrtSetDevice(0); /*已经创建了一个default ctx,在default ctx中创建了一个default stream,并且在当前线程可用*/ … aclopExecuteV2(op1,...,NULL); //最后一个NULL表示在default stream上执行算子op1 aclopExecuteV2(op2,...,NULL); //最后一个NULL表示在default stream上执行算子op2 aclrtSynchronizeStream(NULL); /*等待计算任务全部完成(op1、op2执行结束),用户根据需要获取计算任务的输出结果*/ … aclrtResetDevice(0); //释放计算设备0,对应的default ctx及default stream生命周期也终止。