aclmdlCreateAndGetOpDesc
aclmdlGetAippType
函数功能
获取指定模型的指定输入所支持的AIPP类型(动态AIPP或静态AIPP)及动态AIPP输入对应的index值。
函数原型
aclError aclmdlGetAippType(uint32_t modelId, size_t index, aclmdlInputAippType *type, size_t *dynamicAttachedDataIndex)
参数说明
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| modelId | 输入 | 指定模型的ID。 调用aclmdlLoadFromFile接口/aclmdlLoadFromMem接口/aclmdlLoadFromFileWithMem接口/aclmdlLoadFromMemWithMem接口加载模型成功后,会返回模型ID。 |
| index | 输入 | 模型中输入的index。 |
| type | 输出 | 指定模型输入的AIPP类型的指针。 |
| dynamicAttachedDataIndex | 输出 | 当type不为ACL_DATA_WITH_DYNAMIC_AIPP时,该值返回0xFFFFFFFF,表示无效。 当type为ACL_DATA_WITH_DYNAMIC_AIPP时,该值返回动态AIPP输入(用于配置动态AIPP参数)的index。 |
返回值说明
返回0表示成功,返回其它值表示失败。
参考资源
接口调用示例,参见动态AIPP(多个动态AIPP输入)。
父主题: 模型加载与执行
aclmdlSetAIPPByInputIndex
函数功能
动态AIPP场景下,根据指定的模型输入的输入index,设置模型推理时的AIPP参数值,同步接口。
动态AIPP支持的几种操作的计算方式及其计算顺序如下:抠图->色域转换->缩放(当前版本不支持缩放)->减均值/归一化->padding。
约束说明
-
经过动态AIPP处理后的图像的宽、高必须与原始模型中输入Shape中的宽、高保持一致。
-
多Batch场景下,根据每个Batch的配置计算出动态AIPP后输出图片的宽、高,经过动态AIPP后每个Batch的输出图片宽、高必须是一致的。计算输出图片宽、高的计算公式如表1所示。
-
抠图或者缩放或者padding之后,对图片宽、高的校验规则如下,其中,aippOutputW、aippOutputH分别表示AIPP输出图片的宽、高,其它参数是aclmdlSetAIPPSrcImageSize、aclmdlSetAIPPScfParams、aclmdlSetAIPPCropParams、aclmdlSetAIPPPaddingParams接口的入参:
表1 输出图片宽、高计算公式
抠图 缩放 补边(padding) 动态AIPP输出图片的宽、高 否 否 否 aippOutputW=srcImageSizeW,aippOutputH=srcImageSizeH 是 否 否 aippOutputW=cropSizeW,aippOutputH=cropSizeH 是 是 否 aippOutputW=scfOutputSizeW,aippOutputH=scfOutputSizeH 是 否 是 aippOutputW=cropSizeW + paddingSizeLeft + paddingSizeRight,aippOutputH=cropSizeH + paddingSizeTop + paddingSizeBottom 否 否 是 aippOutputW=srcImageSizeW + paddingSizeLeft + paddingSizeRight,aippOutputH=srcImageSizeH + paddingSizeTop + paddingSizeBottom 否 是 是 aippOutputW=scfOutputSizeW + paddingSizeLeft + paddingSizeRight,aippOutputH=scfOutputSizeH + paddingSizeTop + paddingSizeBottom 否 是 否 aippOutputW=scfOutputSizeW,aippOutputH=scfOutputSizeH 是 是 是 aippOutputW=scfOutputSizeW + paddingSizeLeft + paddingSizeRight,aippOutputH=scfOutputSizeH + paddingSizeTop + paddingSizeBottom
函数原型
aclError aclmdlSetAIPPByInputIndex(uint32_t modelId, aclmdlDataset *dataset, size_t index, const aclmdlAIPP *aippParmsSet)
参数说明
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| modelId | 输入 | 模型的ID。 调用aclmdlLoadFromFile接口/aclmdlLoadFromMem接口/aclmdlLoadFromFileWithMem接口/aclmdlLoadFromMemWithMem接口加载模型成功后,会返回模型ID。 |
| dataset | 输入 | 模型推理的输入数据的指针。 使用aclmdlDataset类型的数据描述模型推理时的输入数据,输入的内存地址、内存大小用aclDataBuffer类型的数据来描述。 |
| index | 输入 | 表示在第几个输入上设置动态AIPP参数。如果该输入没有关联动态AIPP输入,则返回报错。 可调用aclmdlGetAippType查询指定模型的指定输入是否有关联的动态AIPP输入,若有,则本接口的index参数值与aclmdlGetAippType接口的index参数值保持一致;若无,则无需设置动态AIPP参数。 |
| aippParmsSet | 输入 | 动态AIPP参数对象的指针。 提前调用aclmdlCreateAIPP接口创建aclmdlAIPP类型的数据。 |
返回值说明
返回0表示成功,返回其它值表示失败。
参考资源
接口调用示例,参见动态AIPP(多个动态AIPP输入)。
父主题: 模型加载与执行
aclmdlSetInputDynamicDims
函数功能
如果模型输入的Shape是动态的、输入数据Format为ND格式(ND表示支持任意格式,N<=4),在模型执行前调用本接口设置模型推理时具体维度的值。
函数原型
aclError aclmdlSetInputDynamicDims(uint32_t modelId, aclmdlDataset *dataset, size_t index, const aclmdlIODims *dims)
参数说明
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| modelId | 输入 | 模型ID。 调用aclmdlLoadFromFile接口/aclmdlLoadFromMem接口/aclmdlLoadFromFileWithMem接口/aclmdlLoadFromMemWithMem接口加载模型成功后,会返回模型ID。 |
| dataset | 输入&输出 | 模型推理的输入数据的指针。 使用aclmdlDataset类型的数据描述模型推理时的输入数据,输入的内存地址、内存大小用aclDataBuffer类型的数据来描述。 |
| index | 输入 | 标识动态维度的输入index。 需调用aclmdlGetInputIndexByName接口获取,输入名称固定为ACL_DYNAMIC_TENSOR_NAME。 |
| dims | 输入 | 具体某一档上的所有维度信息的指针。 此处设置的动态维度的值只能是模型构建时设置的档位中的某一档。 如果不清楚模型构建时的动态维度档位,也可以调用aclmdlGetInputDynamicDims接口获取指定模型支持的动态维度档位数以及每一档中的值。 **例如:**使用ATC工具进行模型转换时,input_shape="data:1,1,40,-1;label:1,-1;mask:-1,-1" ,dynamic_dims="20,20,1,1; 40,40,2,2; 80,60,4,4",若输入数据的真实维度为(1,1,40,20,1,20,1,1),则dims结构体信息的填充示例如下(name暂不使用): dims.dimCount = 8 dims.dims[0] = 1 dims.dims[1] = 1 dims.dims[2] = 40 dims.dims[3] = 20 dims.dims[4] = 1 dims.dims[5] = 20 dims.dims[6] = 1 dims.dims[7] = 1 |
返回值说明
返回0表示成功,返回其它值表示失败。
参考资源
接口调用流程及示例,参见模型动态Shape输入推理。
父主题: 模型加载与执行
aclmdlCreateAndGetOpDesc
函数功能
获取指定算子的描述信息,包括算子名、输入tensor描述、输出tensor描述,如果查询不到指定算子,则返回报错。该接口不支持动态Shape场景。同步接口。
约束说明
使用场景****举例:执行整网模型推理时,如果产生AI Core报错,可以调用本接口获取报错算子的描述信息,再做进一步错误排查。
推荐的接口调用顺序如下:
-
定义并实现异常回调函数fn(aclrtExceptionInfoCallback类型),回调函数原型请参见aclrtSetExceptionInfoCallback 。
实现回调函数的关键步骤如下:
-
在异常回调函数fn内调用aclrtGetDeviceIdFromExceptionInfo、aclrtGetStreamIdFromExceptionInfo、aclrtGetTaskIdFromExceptionInfo接口分别获取Device ID、Stream ID、Task ID。
-
在异常回调函数fn内调用aclmdlCreateAndGetOpDesc接口获取算子的描述信息。
-
在异常回调函数fn内调用aclGetTensorDescByIndex接口获取指定算子输入/输出的tensor描述。
-
在异常回调函数fn内如下接口获取tensor描述中的数据,进行进一步分析。
例如,调用aclGetTensorDescAddress接口获取tensor数据的内存地址(用户可从该内存地址中获取tensor数据)、调用aclGetTensorDescType接口获取tensor描述中的数据类型、调用aclGetTensorDescFormat接口获取tensor描述中的Format、调用aclGetTensorDescNumDims接口获取tensor描述中的Shape维度个数、调用aclGetTensorDescDimV2接口获取Shape中指定维度的大小。
-
-
调用aclrtSetExceptionInfoCallback接口设置异常回调函数。
-
执行模型推理。
如果存在AI Core报错,则触发回调函数fn,获取算子的信息,进行进一步分析。
函数原型
aclError aclmdlCreateAndGetOpDesc(uint32_t deviceId, uint32_t streamId, uint32_t taskId, char *opName, size_t opNameLen, aclTensorDesc **inputDesc, size_t *numInputs, aclTensorDesc **outputDesc, size_t *numOutputs)
参数说明
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| deviceId | 输入 | Device ID。 调用aclrtGetDeviceIdFromExceptionInfo接口获取异常信息中的Device ID,作为本接口的输入。 |
| streamId | 输入 | Stream ID。 调用aclrtGetStreamIdFromExceptionInfo接口获取异常信息中的Stream ID,作为本接口的输入。 |
| taskId | 输入 | Task ID。 调用aclrtGetTaskIdFromExceptionInfo接口获取异常信息中的Task ID,作为本接口的输入。 |
| opName | 输出 | 算子名称字符串的指针。 |
| opNameLen | 输入 | 算子名称字符串长度。 若用户指定的长度比实际算子名称的长度短,则返回报错。 |
| inputDesc | 输出 | 算子所有输入的tensor描述的指针,指向一块连续内存的首地址。 |
| numInputs | 输出 | 输入个数的指针。 |
| outputDesc | 输出 | 算子所有输出的tensor描述的指针,指向一块连续内存的首地址。 |
| numOutputs | 输出 | 输出个数的指针。 |
返回值说明
返回0表示成功,返回其它值表示失败。
参考资源
接口调用示例,参见AI Core异常信息获取。
父主题: 模型加载与执行
aclmdlInitDump
函数功能
Dump初始化。同步接口。
约束说明
-
aclmdlInitDump接口需要与aclmdlSetDump接口、aclmdlFinalizeDump接口配合使用,用于将Dump数据记录到文件中。一个进程内,可以根据需求多次调用这些接口,基于不同的Dump配置信息,获取Dump数据。
场景举例:
- 两次模型执行,需要设置不同的Dump配置信息,接口调用顺序:aclInit接口-->aclmdlInitDump接口-->aclmdlSetDump接口-->模型加载-->模型执行-->aclmdlFinalizeDump接口-->模型卸载-->aclmdlInitDump接口-->aclmdlSetDump接口-->模型加载-->模型执行-->aclmdlFinalizeDump接口-->模型卸载-->执行其它任务-->aclFinalize接口
- 同一个模型执行两次,第一次需要Dump,第二次无需Dump,接口调用顺序:aclInit接口-->aclmdlInitDump接口-->aclmdlSetDump接口-->模型加载-->模型执行-->aclmdlFinalizeDump接口-->模型卸载-->模型加载-->模型执行-->执行其它任务-->aclFinalize接口
-
如果已经通过aclInit接口配置了dump信息,则调用aclmdlInitDump接口时会返回失败。
-
必须在调用aclInit接口之后、模型加载接口之前调用aclmdlInitDump接口。
函数原型
aclError aclmdlInitDump()
参数说明
无
返回值说明
返回0表示成功,返回其它值表示失败。
相关接口
AscendCL还提供了aclInit接口,在AscendCL初始化阶段,通过*.json文件传入Dump配置信息,运行应用后获取Dump数据的方式。该种方式,一个进程内,只能调用一次aclInit接口,如果要修改Dump配置信息,需修改*.json文件中的配置。
父主题: 模型加载与执行
aclmdlSetDump
函数功能
设置dump参数。同步接口。
约束说明
-
aclmdlInitDump接口需要与aclmdlSetDump接口、aclmdlFinalizeDump接口配合使用,用于将Dump数据记录到文件中。一个进程内,可以根据需求多次调用这些接口,基于不同的Dump配置信息,获取Dump数据。
场景举例:
- 两次模型执行,需要设置不同的Dump配置信息,接口调用顺序:aclInit接口-->aclmdlInitDump接口-->aclmdlSetDump接口-->模型加载-->模型执行-->aclmdlFinalizeDump接口-->模型卸载-->aclmdlInitDump接口-->aclmdlSetDump接口-->模型加载-->模型执行-->aclmdlFinalizeDump接口-->模型卸载-->执行其它任务-->aclFinalize接口
- 同一个模型执行两次,第一次需要Dump,第二次无需Dump,接口调用顺序:aclInit接口-->aclmdlInitDump接口-->aclmdlSetDump接口-->模型加载-->模型执行-->aclmdlFinalizeDump接口-->模型卸载-->模型加载-->模型执行-->执行其它任务-->aclFinalize接口
-
只有在调用本接口之后加载模型,配置的Dump信息有效。在调用本接口之前已经加载的模型不受影响,除非用户在调用本接口后重新加载该模型。
例如以下接口调用顺序中,加载的模型1不受影响,配置的Dump信息仅对加载的模型2有效:
aclmdlInitDump接口-->模型1加载-->aclmdlSetDump接口-->模型2加载-->aclmdlFinalizeDump接口
-
多次调用本接口对同一个模型配置了Dump信息,系统内处理时会采用覆盖策略。
例如以下接口调用顺序中,第二次调用本接口配置的Dump信息会覆盖第一次配置的Dump信息:
aclmdlInitDump接口-->aclmdlSetDump接口-->aclmdlSetDump接口-->模型1加载-->aclmdlFinalizeDump接口
函数原型
aclError aclmdlSetDump(const char *dumpCfgPath)
参数说明
| 参数名 | 输入/输出 | 说明 |
|---|---|---|
| dumpCfgPath | 输入 | 配置文件路径的指针,包含文件名。 配置文件格式为json格式,当前可配置dump数据的相关信息,示例请参见配置文件示例,详细配置说明请参见《精度比对工具使用指南》中的“比对数据准备>推理场景数据准备>准备离线模型dump数据文件(AscendCL接口方式)”。 |
配置文件示例
以Caffe ResNet-50网络为例,若需要比对Caffe ResNet-50网络与基于Caffe ResNet-50转换成的适配昇腾AI处理器的离线模型中某些层算子的输出结果,可以在配置文件中配置如下内容:
{
"dump":{
"dump_list":[
{
"model_name":"ResNet-50",
"layer":[
"conv1conv1_relu",
"res2a_branch2ares2a_branch2a_relu",
"res2a_branch1",
"pool1"
]
}
],
"dump_path":"/MyApp20/dump",
"dump_mode":"output"
}
}
返回值说明
返回0表示成功,返回其它值表示失败。
相关接口
AscendCL还提供了aclInit接口,在AscendCL初始化阶段,通过*.json文件传入Dump配置信息,运行应用后获取Dump数据的方式。该种方式,一个进程内,只能调用一次aclInit接口,如果要修改Dump配置信息,需修改*.json文件中的配置。
父主题: 模型加载与执行
aclmdlFinalizeDump
函数功能
Dump去初始化。同步接口。
约束说明
-
aclmdlInitDump接口需要与aclmdlSetDump接口、aclmdlFinalizeDump接口配合使用,用于将Dump数据记录到文件中。一个进程内,可以根据需求多次调用这些接口,基于不同的Dump配置信息,获取Dump数据。
场景举例:
- 两次模型执行,需要设置不同的Dump配置信息,接口调用顺序:aclInit接口-->aclmdlInitDump接口-->aclmdlSetDump接口-->模型加载-->模型执行-->aclmdlFinalizeDump接口-->模型卸载-->aclmdlInitDump接口-->aclmdlSetDump接口-->模型加载-->模型执行-->aclmdlFinalizeDump接口-->模型卸载-->执行其它任务-->aclFinalize接口
- 同一个模型执行两次,第一次需要Dump,第二次无需Dump,接口调用顺序:aclInit接口-->aclmdlInitDump接口-->aclmdlSetDump接口-->模型加载-->模型执行-->aclmdlFinalizeDump接口-->模型卸载-->模型加载-->模型执行-->执行其它任务-->aclFinalize接口
函数原型
aclError aclmdlFinalizeDump()
参数说明
无
返回值说明
返回0表示成功,返回其它值表示失败。
相关接口
AscendCL还提供了aclInit接口,在AscendCL初始化阶段,通过*.json文件传入Dump配置信息,运行应用后获取Dump数据的方式。该种方式,一个进程内,只能调用一次aclInit接口,如果要修改Dump配置信息,需修改*.json文件中的配置。
父主题: 模型加载与执行
在线提单