Skip to main content

总体说明

aclmdlSetConfigOpt

函数功能

设置模型加载的配置对象中的各属性的取值,包括模型执行的优先级、模型的文件路径或内存地址、内存大小等。

本接口需要与以下其它接口配合,实现模型加载功能:

  1. 调用aclmdlCreateConfigHandle接口创建模型加载的配置对象。
  2. 多次调用aclmdlSetConfigOpt接口设置配置对象中每个属性的值。
  3. 调用aclmdlLoadWithConfig接口指定模型加载时需要的配置信息,并进行模型加载。
  4. 模型加载成功后,调用aclmdlDestroyConfigHandle接口销毁。

函数原型

aclError aclmdlSetConfigOpt(aclmdlConfigHandle *handle, aclmdlConfigAttr attr, const void *attrValue, size_t valueSize)

参数说明

参数名输入/输出说明
handle输出模型加载的配置对象的指针。需提前调用aclmdlCreateConfigHandle接口创建该对象。
attr输入指定需设置的属性。
attrValue输入指向属性值的指针,attr对应的属性取值。 如果属性值本身是指针,则传入该指针的地址。
valueSize输入attrValue部分的数据长度。 用户可使用C/C++标准库的函数sizeof(*attrValue)查询数据长度。

返回值说明

返回0表示成功,返回其它值表示失败。

相关接口

使用aclmdlSetConfigOpt接口、aclmdlLoadWithConfig接口时,是通过配置对象中的属性来区分,在加载模型时是从文件加载,还是从内存加载,以及内存是由系统内部管理,还是由用户管理。

当前AscendCL还提供了以下接口实现模型加载的功能,从使用的接口上区分从文件加载,还是从内存加载,以及内存是由系统内部管理,还是由用户管理。

父主题: 模型加载与执行

aclmdlLoadWithConfig

函数功能

指定模型加载时需要的配置信息,并进行模型加载。

本接口需要与以下其它接口配合,实现模型加载功能:

  1. 调用aclmdlCreateConfigHandle接口创建模型加载的配置对象。
  2. 多次调用aclmdlSetConfigOpt接口设置配置对象中每个属性的值。
  3. 调用aclmdlLoadWithConfig接口指定模型加载时需要的配置信息,并进行模型加载。
  4. 模型加载成功后,调用aclmdlDestroyConfigHandle接口销毁。

约束说明

在加载前,请先根据模型文件的大小评估内存空间是否足够,内存空间不足,会导致应用程序异常。

函数原型

aclError aclmdlLoadWithConfig(const aclmdlConfigHandle *handle, uint32_t *modelId)

参数说明

参数名输入/输出说明
handle输入模型加载的配置对象的指针。需提前调用aclmdlCreateConfigHandle接口创建该对象,与aclmdlSetConfigOpt中的handle保持一致。
modelId输出模型ID的指针。 系统成功加载模型后会返回的模型ID。

返回值说明

返回0表示成功,返回其它值表示失败。

相关接口

使用aclmdlSetConfigOpt接口、aclmdlLoadWithConfig接口时,是通过配置对象中的属性来区分,在加载模型时是从文件加载,还是从内存加载,以及内存是由系统内部管理,还是由用户管理。

当前AscendCL还提供了以下接口实现模型加载的功能,从使用的接口上区分从文件加载,还是从内存加载,以及内存是由系统内部管理,还是由用户管理。

父主题: 模型加载与执行

总体说明

本章主要介绍了如下几类算子API,提供了详细的接口介绍,包括接口原型、功能描述、参数说明、调用示例等,适合开发人员、测试人员。

  • NN类算子:主要包含实现数学基础运算(如加、减、乘、除等)、CNN相关操作(如卷积、池化、激活函数)等功能的算子接口。
  • DVPP类算子:主要包含实现图像缩放、JPEG图像解码、图像归一化等功能的算子接口。
  • **融合类算子:**主要将多个独立的“小算子”(向量Vector、矩阵Cube等)融合成一个“大算子”,达到提升算子性能的目的。

父主题: 单算子API执行

功能支持度说明

通过单算子API执行方式调用算子时,昇腾AI处理器对各类算子接口的支持度如下表所示。

版本NN类算子接口(aclnn)DVPP类算子接口(acldvpp)融合类算子接口(aclnn)
Atlas 200/500 A2推理产品xxx

父主题: 单算子API执行

两段式接口

单算子API执行的算子接口一般定义为“两段式接口”,以NN类算子接口定义为例:

aclnnStatus aclnnXxxGetWorkspaceSize(const aclTensor *src, ..., aclTensor *out, ..., uint64_t workspaceSize, aclOpExecutor **executor);
aclnnStatus aclnnXxx(void* workspace, int64 workspaceSize, aclOpExecutor* executor, aclrtStream stream);

其中aclnnXxxGetWorkspaceSize为第一段接口,主要用于计算本次API调用计算过程中需要多少的workspace内存。获取到本次API计算需要的workspace大小后,按照workspaceSize大小申请昇腾AI处理器内存,然后调用第二段接口aclnnXxx。

:::note 说明

  • workspace是指除输入/输出外,API在昇腾AI处理器上完成计算所需要的临时内存。

  • 第二段接口aclnnXxx(...)不能重复调用,如下调用方式会出现异常:

    aclnnXxxGetWorkspaceSize(...)
    aclnnXxx(...)
    aclnnXxx(...)

:::

父主题: 基本概念

非连续的Tensor

目前大部分算子API的输入Tensor支持“非连续的Tensor”,即一个Tensor可以通过(shape, strides, offset)表示。

示例1

例如现有一个shape=(6, 5)、strides=(10, 1)、offset=22的Tensor,其内存排布如下:

a0,0, a0,1, a0,2, a0,3, a0,4, a0,5, a0,6, a0,7, a0,8, a0,9
a1,0, a1,1, a1,2, a1,3, a1,4, a1,5, a1,6, a1,7, a1,8, a1,9
a2,0, a2,1, a2,2, a2,3, a2,4, a2,5, a2,6, a2,7, a2,8, a2,9
a3,0, a3,1, a3,2, a3,3, a3,4, a3,5, a3,6, a3,7, a3,8, a3,9
a4,0, a4,1, a4,2, a4,3, a4,4, a4,5, a4,6, a4,7, a4,8, a4,9
a5,0, a5,1, a5,2, a5,3, a5,4, a5,5, a5,6, a5,7, a5,8, a5,9
a6,0, a6,1, a6,2, a6,3, a6,4, a6,5, a6,6, a6,7, a6,8, a6,9
a7,0, a7,1, a7,2, a7,3, a7,4, a7,5, a7,6, a7,7, a7,8, a7,9
a8,0, a8,1, a8,2, a8,3, a8,4, a8,5, a8,6, a8,7, a8,8, a8,9
a9,0, a9,1, a9,2, a9,3, a9,4, a9,5, a9,6, a9,7, a9,8, a9,9

即该Tensor排布如上图的深色位置。这个完整的Tensor在内存排布上是不连续的,strides描述Tensor维度上相邻两个元素的间隔,如果在维度1上的stride为1, 该维度是连续的;如果在维度0上的stride为10,那么相邻的元素间隔10个元素,即非连续。offset表示这个Tensor的首元素相对addr的偏移。

示例2

例如现有一个shape=(4, 3)、strides=(20, 2)、offset=22的Tensor,其内存排布如下:

a0,0, a0,1, a0,2, a0,3, a0,4, a0,5, a0,6, a0,7, a0,8, a0,9
a1,0, a1,1, a1,2, a1,3, a1,4, a1,5, a1,6, a1,7, a1,8, a1,9
a2,0, a2,1, a2,2, a2,3, a2,4, a2,5, a2,6, a2,7, a2,8, a2,9
a3,0, a3,1, a3,2, a3,3, a3,4, a3,5, a3,6, a3,7, a3,8, a3,9
a4,0, a4,1, a4,2, a4,3, a4,4, a4,5, a4,6, a4,7, a4,8, a4,9
a5,0, a5,1, a5,2, a5,3, a5,4, a5,5, a5,6, a5,7, a5,8, a5,9
a6,0, a6,1, a6,2, a6,3, a6,4, a6,5, a6,6, a6,7, a6,8, a6,9
a7,0, a7,1, a7,2, a7,3, a7,4, a7,5, a7,6, a7,7, a7,8, a7,9
a8,0, a8,1, a8,2, a8,3, a8,4, a8,5, a8,6, a8,7, a8,8, a8,9
a9,0, a9,1, a9,2, a9,3, a9,4, a9,5, a9,6, a9,7, a9,8, a9,9

即该Tensor排布如上图的深色位置。这个完整的Tensor在内存排布上是不连续的,strides描述Tensor维度上相邻两个元素的间隔,如果在维度1上的stride为2, 该维度上间隔1个元素;如果在维度0上的stride为20,那么相邻的元素间隔20个元素,即非连续。offset表示这个Tensor的首元素相对addr的偏移。

父主题: 基本概念

在线提单