动态输入介绍

当模型输入张量属性 validShape 或 stride 中含有 -1 时,代表该模型的输入是动态的,您需要根据实际输入对动态维度进行填写。

本节介绍 stride 的填写规则,并以一个三输入模型为例给出完整的推导过程。读完本节,您应当能够得到一组可以直接用于输入准备的 validShape 与 stride。

stride 填写时应遵循以下规则:

  • 应确保填写数值满足 stride[idx]>=stride[idx+1]∗validShape.dimensionSize[idx+1]stride[idx] >= stride[idx+1] * validShape.dimensionSize[idx+1],其中 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 排布输入数据:请查看 模型推理应用开发指导 章节。