CANN动态维度设置指南

📅 2026/7/5 20:19:27
CANN动态维度设置指南
动态Batch/动态分辨率/动态维度设置多档维度值【免费下载链接】docs该仓库用于维护cann公共文档项目地址: https://gitcode.com/cann/docs本节介绍动态Batch/动态分辨率/动态维度功能涉及的关键接口、接口调用流程及示例代码。接口调用流程动态Shape输入场景下模型推理与静态Shape输入模型推理的流程类似都涉及初始化与去初始化、运行时资源申请与释放、模型构建、模型加载、模型执行、模型卸载等。本节中重点描述动态Shape输入场景下模型推理与静态Shape输入模型推理的不同之处构建模型时需配置动态Batch、动态分辨率、动态维度ND格式相关的信息若模型推理时包含动态Batch特性在模型推理时需调用acl接口设置模型推理时需使用的batch size模型支持的batch size已提前在构建模型时配置例如构建模型时使用ATC工具的dynamic_batch_size参数详细参数说明请参见《ATC离线模型编译工具》中的“参数说明 基础功能参数 输入选项 --dynamic_batch_size”。若模型推理时包含动态分辨率特性在模型推理时需调用acl接口设置模型推理时需使用的分辨率模型支持的分辨率已提前在构建模型时配置例如构建模型时使用ATC工具的dynamic_image_size参数详细参数说明请参见《ATC离线模型编译工具》中的“参数说明 基础功能参数 输入选项 --dynamic_image_size”。若模型推理时包含动态维度ND格式特性在模型推理时需调用acl接口设置模型推理时需使用的维度值模型支持哪些维度值已提前在构建模型时配置例如构建模型时使用ATC工具的dynamic_dims参数详细参数说明请参见《ATC离线模型编译工具》中的“参数说明 基础功能参数 输入选项 --dynamic_dims”。构建模型成功后在生成的om模型中会新增相应的输入下文简称动态Batch输入/动态分辨率输入/动态维度输入在模型推理时通过该新增的输入提供具体的Batch值/分辨率/维度值。例如a输入的batch size是动态的在om模型中会新增与a对应的b输入来描述a的batch信息。在模型执行时准备a输入的数据结构请参见准备模型执行的输入/输出数据结构。由于输入tensor数据的Shape支持多种档位在模型执行前才能确定因此该输入和输出所需的内存大小建议用户调用aclmdlGetInputSizeByIndex、aclmdlGetOutputSizeByIndex接口获取该接口获取的是最大档位的内存确保内存够用。模型执行完成后可以调用aclmdlGetCurOutputDims接口获取模型输出tensor的实际维度信息。准备b输入的数据结构、设置b输入的数据请参见第2步。在执行模型推理前需准备动态Batch/动态分辨率/动态维度输入的数据结构申请动态Batch/动态分辨率/动态维度输入对应的内存前需要先调用aclmdlGetInputIndexByName接口根据输入名称固定为ACL_DYNAMIC_TENSOR_NAME获取模型中标识该输入的index。说明ACL_DYNAMIC_TENSOR_NAME是一个宏宏的定义如下 #define ACL_DYNAMIC_TENSOR_NAME ascend_mbatch_shape_data 2. 调用aclmdlGetInputSizeByIndex根据index获取输入内存大小。 3. 调用aclrtMalloc接口根据[2.b](#zh-cn_topic_0000001086879105_li899693033013)中的大小申请内存。 申请动态Batch/动态分辨率/动态AIPP/动态维度输入对应的内存后无需用户设置该内存中的数据否则可能会导致业务异常用户调用[2.b](#li1767343825610)中的接口后系统会自动向该内存中填入数据。 4. 调用aclCreateDataBuffer接口创建aclDataBuffer类型的数据用于存放动态Batch/动态分辨率/动态维度输入数据的内存地址、内存大小。 5. 调用aclmdlCreateDataset接口创建aclmdlDataset类型的数据并调用aclmdlAddDatasetBuffer接口向aclmdlDataset类型的数据中增加aclDataBuffer类型的数据。 - 需设置动态Batch/动态分辨率/动态维度参数值 **图 1** 接口调用流程 ![](https://raw.gitcode.com/cann/docs/raw/a173bdbfa81bbfd36d1c4da672d78301fb678d36/docs/app-dev/zh/figures/接口调用流程-11.png 接口调用流程-11?utm_sourcegitcode_repo_files) 1. 调用aclmdlGetInputIndexByName接口根据输入名称固定为ACL\_DYNAMIC\_TENSOR\_NAME获取模型中标识该输入的index。 2. 设置动态Batch/动态分辨率/动态维度参数值。 - 调用aclmdlSetDynamicBatchSize接口设置动态Batch。 此处设置的batch size只能是构建模型时设置的Batch档位中的某一个。 也可以调用aclmdlGetDynamicBatch接口获取指定模型支持的Batch档位数以及每一档中的batch size。 - 调用aclmdlSetDynamicHWSize接口设置动态分辨率。 此处设置的分辨率只能是构建模型时设置的分辨率档位中的某一个。 也可以调用aclmdlGetDynamicHW接口获取指定模型支持的分辨率档位数以及每一档中的宽、高。 - 调用aclmdlSetInputDynamicDims接口设置动态维度的维度值。 此处设置的动态维度的值只能是构建模型时设置的档位中的某一档。 也可以调用aclmdlGetInputDynamicDims接口获取指定模型支持的动态维度档位数以及每一档中的值。动态Batch示例代码以下是模型推理关键步骤的代码示例不能直接拷贝编译运行仅供参考。调用接口后需增加异常处理的分支并记录报错日志、提示日志此处不一一列举。您可以单击YOLOV3_dynamic_batch_detection_picture获取样例。...... // 1. 模型加载加载成功后再设置动态Batch ...... // 2. 准备模型描述信息modelDesc_准备模型的输入数据input_和模型的输出数据output_ // ...... // 3. 自定义函数设置动态Batch int ModelSetDynamicInfo() { size_t index; // 3.1 获取动态Batch输入的index标识动态Batch输入的输入名称固定为ACL_DYNAMIC_TENSOR_NAME aclError ret aclmdlGetInputIndexByName(modelDesc_, ACL_DYNAMIC_TENSOR_NAME, index); // 3.2 设置Batch // modelId_表示加载成功的模型的IDinput_表示aclmdlDataset类型的数据index表示标识动态Batch输入的输入indexbatchSize表示Batch数此处以8为例 uint64_t batchSize 8; ret aclmdlSetDynamicBatchSize(modelId_, input_, index, batchSize); // ...... } // 4. 自定义函数执行模型 int ModelExecute(int index) { aclError ret; // 4.1 调用自定义函数设置动态Batch ret ModelSetDynamicInfo(); // 4.2 执行模型modelId_表示加载成功的模型的IDinput_和output_分别表示模型的输入和输出 ret aclmdlExecute(modelId_, input_, output_); // ...... } // 5. 处理模型推理结果 ......动态分辨率示例代码以下是模型推理关键步骤的代码示例不能直接拷贝编译运行仅供参考。调用接口后需增加异常处理的分支并记录报错日志、提示日志此处不一一列举。您可以单击YOLOV3_dynamic_batch_detection_picture获取样例。...... // 1. 模型加载加载成功后再设置动态分辨率 ...... // 2. 准备模型描述信息modelDesc_准备模型的输入数据input_和模型的输出数据output_ ...... // 3. 自定义函数设置动态分辨率 int ModelSetDynamicInfo() { size_t index; // 3.1 获取动态分辨率输入的index标识动态分辨率输入的输入名称固定为ACL_DYNAMIC_TENSOR_NAME aclError ret aclmdlGetInputIndexByName(modelDesc_, ACL_DYNAMIC_TENSOR_NAME, index); // 3.2 设置输入图片分辨率modelId_表示加载成功的模型的IDinput_表示aclmdlDataset类型的数据index表示标识动态分辨率输入的输入index uint64_t height 224; uint64_t width 224; ret aclmdlSetDynamicHWSize(modelId_, input_, index, height, width); // ...... } // 4. 自定义函数执行模型 int ModelExecute(int index) { aclError ret; // 4.1 调用自定义函数设置动态分辨率 ret ModelSetDynamicInfo(); // 4.2 执行模型modelId_表示加载成功的模型的IDinput_和output_分别表示模型的输入和输出 ret aclmdlExecute(modelId_, input_, output_); // ...... } // 5. 处理模型推理结果 ......ND格式动态维度示例代码以下是模型推理关键步骤的代码示例不能直接拷贝编译运行仅供参考。调用接口后需增加异常处理的分支并记录报错日志、提示日志此处不一一列举。...... // 1. 模型加载加载成功后再设置动态维度 ...... // 2. 准备模型描述信息modelDesc_准备模型的输入数据input_和模型的输出数据output_ ...... // 3. 自定义函数设置动态维度 int ModelSetDynamicInfo() { size_t index; // 3.1 获取动态维度输入的index动态维度输入的输入名称固定为ACL_DYNAMIC_TENSOR_NAME aclError ret aclmdlGetInputIndexByName(modelDesc_, ACL_DYNAMIC_TENSOR_NAME, index); // 3.2 设置具体档位信息包括维度数dimCount和各个维度的数值modelId_表示加载成功的模型的IDinput_表示aclmdlDataset类型的数据index表示标识动态维度输入的输入index aclmdlIODims currentDims; currentDims.dimCount 4; currentDims.dims[0] 8; currentDims.dims[1] 3; currentDims.dims[2] 224; currentDims.dims[3] 224; ret aclmdlSetInputDynamicDims(modelId_, input_, index, currentDims); // ...... } // 4. 自定义函数执行模型 int ModelExecute(int index) { aclError ret; // 4.1 调用自定义函数设置动态维度 ret ModelSetDynamicInfo(); // 4.2 执行模型modelId_表示加载成功的模型的IDinput_和output_分别表示模型的输入和输出 ret aclmdlExecute(modelId_, input_, output_); // ...... } // 5. 处理模型推理结果 ......【免费下载链接】docs该仓库用于维护cann公共文档项目地址: https://gitcode.com/cann/docs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考