开发应用时,如果涉及执行单个算子,请先参见AscendCL接口调用流程了解整体流程,再查看本节中的流程说明。
系统支持的算子请参见《算子清单》。
对于系统不支持的算子,用户需先参见《TBE&AI CPU算子开发指南》完成自定义算子开发。
对于TIK自定义动态Shape算子,需要先注册算子选择器,请参见执行动态Shape算子示例代码(注册算子选择器)。
当前版本提供的NN类算子(aclnn)特性为试用特性,后续版本会存在变更,不支持应用于商用产品中。
昇腾AI处理器对两种单算子调用方式的支持度如下表所示。
- |
单算子API执行 |
单算子模型执行 |
---|---|---|
Atlas 200/300/500 推理产品 |
x |
√ |
Atlas 训练系列产品 |
√ |
√ |
Atlas A2训练系列产品 |
√ |
√ |
Atlas 推理系列产品 |
x |
√ |
以NN类算子API调用为例,具体调用流程如图1所示。
调用aclInit接口实现初始化AscendCL。
依次申请运行管理资源:Device、Context、Stream。具体流程,请参见运行管理资源申请与释放。
如果需要将Host上数据传输到Device,则需要调用aclrtMemcpy接口(同步接口)或aclrtMemcpyAsync接口(异步接口)通过内存复制的方式实现数据传输。
关于算子的aclnnXXXGetWorkspaceSize、aclnnXXX两段式接口,具体介绍参见单算子API执行(试用特性)章节。
如果需要将Device上算子执行结果数据传输到Host,则需要调用aclrtMemcpy接口(同步接口)或aclrtMemcpyAsync接口(异步接口)通过内存复制的方式实现数据传输。
调用aclFinalize接口实现AscendCL去初始化。
该种方式下编译算子,需使用ATC工具,详细描述请参见《ATC工具使用指南》,将单算子定义文件(*.json)编译成适配昇腾AI处理器的离线模型(*.om文件)。
该种方式下编译算子,需调用AscendCL提供的接口,根据不同场景调用不同的接口:
如果需要将Host上数据传输到Device,则需要调用aclrtMemcpy接口(同步接口)或aclrtMemcpyAsync接口(异步接口)通过内存复制的方式实现数据传输。
需用户调用aclopInferShape接口、aclGetTensorDescNumDims接口、aclGetTensorDescDimV2接口、aclGetTensorDescDimRange等接口,推导或预估算子的输出Shape,作为算子执行接口aclopExecuteV2的输入。
不以handle方式执行算子时,每次执行算子时,系统内部都会根据算子描述信息匹配内存中的模型。
以handle方式执行算子时,系统内部将算子描述信息匹配到内存中的模型,并缓存在Handle中,每次执行算子时,无需重复匹配算子与模型,因此在涉及多次执行同一个算子时,效率更高,但该方式不支持动态Shape算子,且Handle使用结束后,需调用aclopDestroyHandle接口释放。
如果需要将Device上的算子执行结果数据传输到Host,则需要调用aclrtMemcpy接口(同步接口)或aclrtMemcpyAsync接口(异步接口)通过内存复制的方式实现数据传输,然后再释放内存。