对于开源框架的网络模型(如ONNX、TensorFlow等),不能直接在昇腾AI处理器上做推理,需要先使用ATC(Ascend Tensor Compiler)工具将开源框架的网络模型转换为适配昇腾AI处理器的离线模型(*.om文件)。

此处以ONNX框架的ResNet-50网络为例,说明如何使用ATC工具进行模型转换,详细说明请参见《ATC工具使用指南》。

  1. 以运行用户登录开发环境。
  2. 执行模型转换。
    执行以下命令,将原始模型转换为昇腾AI处理器能识别的*.om模型文件。请注意,执行命令的用户需具有命令中相关路径的可读、可写权限。以下命令中的“<SAMPLE_DIR>”请根据实际样例包的存放目录替换、“<soc_version>”请根据实际昇腾AI处理器版本替换。
    cd <SAMPLE_DIR>/MyFirstApp_ONNX/model wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/003_Atc_Models/resnet50/resnet50.onnx atc --model=resnet50.onnx --framework=5 --output=resnet50 --input_shape="actual_input_1:1,3,224,224" --soc_version=<soc_version>各参数的解释如下,详细约束说明请参见《ATC工具使用指南》。
  • --model:ResNet-50网络的模型文件的路径。
  • --framework:原始框架类型。5表示ONNX。
  • --output:resnet50.om模型文件的路径。请注意,记录保存该om模型文件的路径,后续开发应用时需要使用。
  • --input_shape:模型输入数据的shape。
  • --soc_version:昇腾AI处理器的版本。
    说明

多Batch推理的基本流程与单Batch类似,请参见模型推理。

多Batch推理与单Batch推理的不同点在于:

  • 多Batch场景下,在构建模型时,使用ATC工具的input_shape参数需根据实际的Batch数设置batch size值,详细说明请参见《ATC工具使用指南》。
  • 在推理前,需要编写一段代码,实现逻辑为:等输入数据满足多Batch(例如:8Batch)的要求,申请Device上的内存存放多Batch的数据,作为模型推理的输入。如果最后循环遍历所有的输入数据后,仍不满足多Batch的要求,则直接将剩余数据作为模型推理的输入。
  • ​队列方式模型推理

基本原理

  • 调用aclmdlLoadFromFileWithQ或aclmdlLoadFromMemWithQ接口以队列方式加载模型。
  • 调用acltdtEnqueueData接口将模型的输入数据传入队列,由AscendCL内部根据队列中的输入数据进行推理,无需调用模型执行的接口。
  • 调用acltdtDequeueData接口等待模型推理执行完毕,再由用户从输出内存中获取结果数据。

队列方式模型推理

基本原理

  • 调用aclmdlLoadFromFileWithQ或aclmdlLoadFromMemWithQ接口以队列方式加载模型。
  • 调用acltdtEnqueueData接口将模型的输入数据传入队列,由AscendCL内部根据队列中的输入数据进行推理,无需调用模型执行的接口。
  • 调用acltdtDequeueData接口等待模型推理执行完毕,再由用户从输出内存中获取结果数据。

使用约束

  • 动态AIPP和动态Batch同时使用时
    • 调用aclmdlCreateAIPP接口设置batchSize时,batchSize要设置为最大batch size。
    • 模型中需要进行动态AIPP处理的data节点,其对应的输入内存大小需按照最大Batch来申请。
  • 动态AIPP和动态分辨率同时使用时
    • 若在设置动态AIPP参数时,开启了抠图或缩放或补边功能,则不能与动态分辨率同时使用。
    • 若在设置动态AIPP参数时,未开启抠图或缩放或补边功能,在与动态分辨率同时使用时,需确保通过aclmdlSetAIPPSrcImageSize接口设置的宽、高与通过aclmdlSetDynamicHWSize接口设置的宽、高相等,都必须设置成模型转换时动态分辨率最大档位的宽、高。
    • 模型中需要进行动态AIPP处理的data节点,其对应的输入内存大小需按照最大分辨率(宽、高)来申请。
  • 动态AIPP和动态Shape输入(设置Shape范围)同时使用时,动态AIPP的输出图片宽、高要在所设置的Shape范围内。
  • 对同一个模型,AIPP(包括静态AIPP和动态AIPP)与动态维度(ND格式)不能同时使用。
  • AscendCL还提供了基于DVPP(Digital Vision Pre-Processing)硬件进行媒体数据处理的功能,包括缩放、抠图、格式转换、图片编解码、视频编解码等,功能比AIPP丰富,但对于输入/输出图片、内存有一定的约束。
    基于DVPP的媒体数据处理接口介绍,请参见媒体数据处理(含图像/视频等)。

动态AIPP(单个动态AIPP输入)

接口调用流程

动态AIPP场景下模型推理与模型推理的流程类似,都涉及AscendCL初始化与去初始化、运行管理资源申请与释放、模型构建、模型加载、模型执行、模型卸载等。

本节中重点描述动态AIPP场景下模型推理与模型推理的不同之处:

  • 模型构建时,需配置动态AIPP相关参数:
    构建模型时,需通过ATC工具的insert_op_conf参数配置动态AIPP模式。ATC工具的参数说明请参见《ATC工具使用指南》。
    构建模型成功后,在生成的om模型中,会新增相应的输入(下文简称动态AIPP输入),在模型推理时通过该新增的输入提供具体的AIPP配置值。
    例如,a输入的AIPP配置是动态的,在om模型中,会有与a对应的b输入来描述a的AIPP配置信息。在模型执行时,准备a输入的数据结构请参见准备模型执行的输入/输出数据结构,准备b输入的数据结构、设置b输入的数据请参见以下内容。
  • 在执行模型推理前
    • 准备动态AIPP输入的数据结构:
  1. 申请动态AIPP输入对应的内存前,需要先调用aclmdlGetAippDataSize接口获取内存大小。
    同时,旧版本中调用aclmdlGetInputSizeByIndex接口获取内存大小的方式依然支持,但该方式在batch size不固定的场景下获取到的内存大小可能为0,此时用户需自行预估内存大小。若调用aclmdlGetInputSizeByIndex接口获取内存大小,还需提前调用aclmdlGetInputIndexByName接口根据输入名称(固定为ACL_DYNAMIC_AIPP_NAME宏,表示ascend_dynamic_aipp_data)获取模型中标识该输入的index。
  2. 调用aclrtMalloc接口根据1中的大小申请内存。
    申请动态AIPP输入对应的内存后,无需用户设置该内存中的数据(否则可能会导致业务异常),用户调用2中的接口后,系统会自动向该内存中填入数据。
  3. 调用aclCreateDataBuffer接口创建aclDataBuffer类型的数据,用于存放动态AIPP输入数据的内存地址、内存大小。
  4. 调用aclmdlCreateDataset接口创建aclmdlDataset类型的数据,并调用aclmdlAddDatasetBuffer接口向aclmdlDataset类型的数据中增加aclDataBuffer类型的数据。

设置动态AIPP参数值:

  1. 调用aclmdlGetInputIndexByName接口根据输入名称(固定为ACL_DYNAMIC_AIPP_NAME)获取模型中标识该输入的index。
  2. 设置动态AIPP参数值。
    1. 调用aclmdlCreateAIPP接口创建aclmdlAIPP类型。
    2. 根据实际需求,调用aclmdlAIPP数据类型下的操作接口设置动态AIPP参数值。
    3. 动态AIPP场景下,aclmdlSetAIPPSrcImageSize接口(设置原始图片的宽和高)必须调用。
    4. 调用aclmdlSetInputAIPP接口设置模型推理时的动态AIPP数据。
    5. 及时调用aclmdlDestroyAIPP接口销毁aclmdlAIPP类型。

动态AIPP(多个动态AIPP输入)

模型有多个动态AIPP输入时的推理基本流程与单个动态AIPP输入类似,请参见动态AIPP(单个动态AIPP输入)。

多个动态AIPP输入与单个动态AIPP输入的不同点如下:

  • 需调用aclmdlGetAippType接口查询指定模型的指定输入是否有关联的动态AIPP输入,若有,则输出标识动态AIPP输入的index,该参数值可作为aclmdlSetAIPPByInputIndex接口的入参之一,来设置对应输入上的动态AIPP参数值。
  • 为避免在错误的输入上设置动态AIPP参数,用户可调用aclmdlGetInputNameByIndex接口先获取指定输入index的输入名称,根据输入名称所对应的index设置动态AIPP参数。
Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐