动态输入介绍
当模型输入张量属性 validShape 或 stride 中含有 -1 时,代表该模型的输入是动态的,您需要根据实际输入对动态维度进行填写。
本节介绍 stride 的填写规则,并以一个三输入模型为例给出完整的推导过程。读完本节,您应当能够得到一组可以直接用于输入准备的 validShape 与 stride。
stride 填写时应遵循以下规则:
-
应确保填写数值满足 ,其中
idx代表当前维度。 -
对于 Y 和 UV 输入的
stride, 由于存在一些硬件约束,需要W方向保证固定的对齐要求,其中 J6H/P 与 S6P 要求64对齐,J6E/M/B 要求32对齐,这意味着您需要根据stride对输入进行对齐处理。各计算平台在输入输出处理上的完整差异,可查看 平台差异说明 章节的输入输出处理差异一节。
这里以J6E模型为例,stride要求32对齐,模型有三个输入:
input_y: validShape = [1,-1,-1,1],stride = [-1,-1,1,1]input_uv: validShape = [1,-1,-1,2],stride = [-1,-1,2,1]input_roi: validShape = [1,4],stride = [16,4]
其中 input_y 与 input_uv 为动态输入,且是 Y 和 UV 输入。假设实际输入: input_y 的 validShape = [1,220,220,1], input_uv 的 validShape = [1,110,110,2]。 stride 计算如下所示,保证该维度stride 32对齐,其中 ALIGN_32 代表32字节对齐:
-
input_y:stride[3] = 1;
stride[2] = 1;
stride[1] = ALIGN_32(stride[2] * validShape.dimensionSize[2]) = ALIGN_32(1 * 220) = 224;
stride[0] = ALIGN_32(stride[1] * validShape.dimensionSize[1]) = ALIGN_32(224 * 220) = 49280;
-
input_uv:stride[3] = 1;
stride[2] = 2;
stride[1] = ALIGN_32(stride[2] * validShape.dimensionSize[2]) = ALIGN_32(2 * 110) = 224;
stride[0] = ALIGN_32(stride[1] * validShape.dimensionSize[1]) = ALIGN_32(224 * 110) = 24640;
您需要在准备输入时设置属性如下,并且将输入数据按照 stride 进行对齐处理:
input_y: validShape = [1,220,220,1],stride = [49280,224,1,1]input_uv: validShape = [1,110,110,2],stride = [24640,224,2,1]input_roi: validShape = [1,4],stride = [16,4]
上述算例以 J6E 平台的 32 对齐要求为例。若同一模型部署在 J6H/P 或 S6P 平台上,W 方向的对齐要求变为 64 对齐,推导公式本身不变,只需把推导中的 ALIGN_32 整体替换为 ALIGN_64。同样以上述实际输入为例,stride 计算如下,其中 ALIGN_64 代表64字节对齐:
-
input_y:stride[3] = 1;
stride[2] = 1;
stride[1] = ALIGN_64(stride[2] * validShape.dimensionSize[2]) = ALIGN_64(1 * 220) = 256;
stride[0] = ALIGN_64(stride[1] * validShape.dimensionSize[1]) = ALIGN_64(256 * 220) = 56320;
-
input_uv:stride[3] = 1;
stride[2] = 2;
stride[1] = ALIGN_64(stride[2] * validShape.dimensionSize[2]) = ALIGN_64(2 * 110) = 256;
stride[0] = ALIGN_64(stride[1] * validShape.dimensionSize[1]) = ALIGN_64(256 * 110) = 28160;
对应的输入属性设置如下:
input_y: validShape = [1,220,220,1],stride = [56320,256,1,1]input_uv: validShape = [1,110,110,2],stride = [28160,256,2,1]input_roi: validShape = [1,4],stride = [16,4]
input_roi 不是 Y 或 UV 输入,也不是动态输入,因此不受 W 方向对齐要求变化的影响,两个平台上的取值一致。
下一步看哪里
-
需要确认输入输出内存首地址的对齐要求,以及
alignedByteSize的使用方式:请查看 对齐规则 章节。 -
需要了解如何在代码中申请内存、并按填写好的
stride排布输入数据:请查看 模型推理应用开发指导 章节。
