单算子模型执行总体说明
单算子模型执行是指基于图IR执行算子,先编译算子(例如,使用ATC工具将Ascend IR定义的单算子描述文件编译成算子om模型文件),再调用acl接口加载算子模型(例如aclopSetModelDir接口),最后调用acl接口执行算子(例如aclopExecuteV2接口)。
图1 单算子模型执行接口调用流程


关键接口的说明如下:
- 编译算子。
根据算子编译的方式,可分为以下两种:
- 加载算子模型文件。支持以下2种方式中的一种加载单算子模型文件:
- 调用aclopSetModelDir接口,设置加载模型文件的目录,目录下存放单算子模型文件(*.om文件)。
- 调用aclopLoad接口,从内存中加载单算子模型数据,由用户管理内存。单算子模型数据是指“单算子编译成*.om文件后,再将om文件读取到内存中”的数据。
- 调用aclrtMalloc接口申请Device上的内存,存放执行算子的输入、输出数据。
如果需要将Host上数据传输到Device,则需要调用aclrtMemcpy接口(同步接口)或aclrtMemcpyAsync接口(异步接口)通过内存复制的方式实现数据传输。
- 动态Shape场景,如果无法明确算子的输出Shape时,在执行算子前,还需推导或预估算子的输出Shape。
需用户调用aclopInferShape接口、aclGetTensorDescNumDims接口、aclGetTensorDescDimV2接口、aclGetTensorDescDimRange等接口,推导或预估算子的输出Shape,作为算子执行接口aclopExecuteV2的输入。
- 执行算子。
- 对于被封装成acl接口的算子,包括GEMM算子(参见CBLAS接口)、Cast算子,目前支持以下两种执行方式:
- 不以handle方式执行算子,接口名称中不包含“Handle”关键字,例如,调用aclblasGemmEx接口(封装GEMM算子)、aclopCast接口(封装Cast算子)等执行算子。
- 以handle方式执行算子,接口名称中包含“Handle”关键字,例如,调用aclblasCreateHandleForGemmEx接口、aclopCreateHandleForCast接口等创建handle后,还需要调用aclopExecWithHandle接口执行算子。
- 对于未被封装成acl接口的算子,目前支持以下两种执行方式:
- 不以handle方式执行算子,调用aclopExecuteV2接口执行算子。
- 以handle方式执行算子,调用aclopCreateHandle接口创建handle,再调用aclopExecWithHandle接口执行算子。
不以handle方式执行算子时,每次执行算子时,系统内部都会根据算子描述信息匹配内存中的模型。
以handle方式执行算子时,系统内部将算子描述信息匹配到内存中的模型,并缓存在handle中,每次执行算子时,无需重复匹配算子与模型,因此在涉及多次执行同一个算子时,效率更高,但该方式不支持动态Shape算子,且handle使用结束后,需调用aclopDestroyHandle接口释放。
- 对于被封装成acl接口的算子,包括GEMM算子(参见CBLAS接口)、Cast算子,目前支持以下两种执行方式:
- 调用aclrtSynchronizeStream接口阻塞应用运行,直到指定Stream中的所有任务都完成。
- 调用aclrtFree接口释放内存。
如果需要将Device上的算子执行结果数据传输到Host,则需要调用aclrtMemcpy接口(同步接口)或aclrtMemcpyAsync接口(异步接口)通过内存复制的方式实现数据传输,然后再释放内存。
父主题: 单算子模型执行