ACL简介
ACL(Ascend computing Language),ACL使用GE执行器(Graph Engine Executor)去执行模型和算子的加载;使用运行管理器实现运行资源的管理,例如:,设备,stream以及内存的管理;使用计算资源实现计算资源的管理,例如:矩阵的计算。
ACL基本概念
Host指的是与Device相连的X86服务器,ARM服务器,利用Device提供的NN(Neural-Network)计算能力,完成业务。Device是指安装了芯片的硬件设备,利用PCle接口与Host侧连接,为Host提供NN计算能力。Host侧用于数据处理,模型建立等方面,device侧只是用于数据的计算。
同步与异步是站在调用者和执行者的角度来观察的,在当前场景下,若在Host调用接口下后不等待Device执行完成再返回,则表示Host的调度是异步的;若在Host调用接口后需要等待Device执行完成再返回,则表示Host的调度是同步的。
一般是Host上的进程与线程,不是的话会特殊注明。
context是作为一个容器,管理所有对象(包含stream,Event,设备内存等)的生命周期,不同的context的stream,event是完全隔离的,无法建立同步等待关系。context分为两种:默认context:调用alctSetDevice接口指定用于运算的Device时,系统会自动隐式创建一个默认的Context,一个Device对应一个默认context,默认Context不能通过aclrtDestroyContext接口来释放。显示创建的Context:在进程或线程中调用aclrtCreateContext接口显示创建一个Context。
stream用于维护一些异步操作的执行顺序(你先注册异步操作到stream上,注册后便返回执行原来的操作,注册时要有顺序。),确保按照应用程序中的代码调用顺序在Device上执行。基于Stream的Kernerl执行和数据传输能够实现以下几种类型的并行:Host运算操作和Device运算操作并行;Host运算操作和“Host到Device的数据传输”并行;“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(AI preprocession)用于在AI core上完成图像处理,包括色域转换(转换图像格式),图像归一化(减均值/乘系数)和抠图(指定抠图起始点,抠出神经网络需要大小的图片)等。
AIPP区分为静态AIPP和动态AIPP。您只能选择静态AIPP或动态AIPP方式来处理图片,不能同时配置静态AIPP和动态AIPP两种方式。
静态AIPP:模型转换时设置为静态,同时设置AIPP参数,模型生成后,AIPP参数值被保存在离线模型中,每次模型推理方式采用固定的AIPP预处理参数(无法修改)。如果使用静态AIPP方式,多Batch情况下共用同一份AIPP参数。
动态AIPP:模型转换时仅设置为动态,每次模型推理前,根据需求,在执行模型前设置动态AIPP参数值,然后在模型执行是可以用不同的AIPP参数。设置动态AIPP参数的接口可参考设置动态AIPP参数。如果使用动态AIPP方式,多Batch可使用不同的AIPP参数。(一定程度上会牺牲性能)
主要接口调用流程:
创建一个"Hello World"文件
如果有什么错误,请指正
ACL简介
ACL(Ascend computing Language),ACL使用GE执行器(Graph Engine Executor)去执行模型和算子的加载;使用运行管理器实现运行资源的管理,例如:,设备,stream以及内存的管理;使用计算资源实现计算资源的管理,例如:矩阵的计算。
ACL基本概念
Host指的是与Device相连的X86服务器,ARM服务器,利用Device提供的NN(Neural-Network)计算能力,完成业务。Device是指安装了芯片的硬件设备,利用PCle接口与Host侧连接,为Host提供NN计算能力。Host侧用于数据处理,模型建立等方面,device侧只是用于数据的计算。
同步与异步是站在调用者和执行者的角度来观察的,在当前场景下,若在Host调用接口下后不等待Device执行完成再返回,则表示Host的调度是异步的;若在Host调用接口后需要等待Device执行完成再返回,则表示Host的调度是同步的。
一般是Host上的进程与线程,不是的话会特殊注明。
context是作为一个容器,管理所有对象(包含stream,Event,设备内存等)的生命周期,不同的context的stream,event是完全隔离的,无法建立同步等待关系。context分为两种:默认context:调用alctSetDevice接口指定用于运算的Device时,系统会自动隐式创建一个默认的Context,一个Device对应一个默认context,默认Context不能通过aclrtDestroyContext接口来释放。显示创建的Context:在进程或线程中调用aclrtCreateContext接口显示创建一个Context。
stream用于维护一些异步操作的执行顺序(你先注册异步操作到stream上,注册后便返回执行原来的操作,注册时要有顺序。),确保按照应用程序中的代码调用顺序在Device上执行。基于Stream的Kernerl执行和数据传输能够实现以下几种类型的并行:Host运算操作和Device运算操作并行;Host运算操作和“Host到Device的数据传输”并行;“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(AI preprocession)用于在AI core上完成图像处理,包括色域转换(转换图像格式),图像归一化(减均值/乘系数)和抠图(指定抠图起始点,抠出神经网络需要大小的图片)等。
AIPP区分为静态AIPP和动态AIPP。您只能选择静态AIPP或动态AIPP方式来处理图片,不能同时配置静态AIPP和动态AIPP两种方式。
静态AIPP:模型转换时设置为静态,同时设置AIPP参数,模型生成后,AIPP参数值被保存在离线模型中,每次模型推理方式采用固定的AIPP预处理参数(无法修改)。如果使用静态AIPP方式,多Batch情况下共用同一份AIPP参数。
动态AIPP:模型转换时仅设置为动态,每次模型推理前,根据需求,在执行模型前设置动态AIPP参数值,然后在模型执行是可以用不同的AIPP参数。设置动态AIPP参数的接口可参考设置动态AIPP参数。如果使用动态AIPP方式,多Batch可使用不同的AIPP参数。(一定程度上会牺牲性能)
主要接口调用流程:
创建一个"Hello World"文件
#include <stdio.h> #include "acl/acl.h" #define INFO_LOG(fmt,args...)fprint(stdout,"[INFO]"fmt"/n",##args) #define WARN_LOG(fmt,args...)fprint(stdout,"[WARN]"fmt"/n",##args) #define ERROR_LOG(fmt,args...)fprint(stdout,"[INFO]"fmt"/n",##args) using namespace std; int main() { INFO_LOG("ACL Hello World"); #ACL init const char*aclConfigPath="acl.json";//创建一个初始化文件 aclError ret = aclline(aclConfigPath);//acl的初始化 if(ret != ACL_ERROR_NONE){//看acl是否创建成功 ERROR_LOG("acl init failed"); } INFO_LOG("acl init success"); ret = aclFinaline();//acl的销毁 if(ret != ACL_ERROR_NONE){//看是否已经销毁 ERROR_LOG("finaline acl failed"); } INFO_LOG("end to finalize acl"); return 0; }如果有什么错误,请指正