专栏算法工具链模型输入输出对齐规则解析

模型输入输出对齐规则解析

颜值即正义2022-12-26
228
0
大家在板端部署的时候可能会发现模型的输入输出tensor有两个属性:validShape 以及 alignedShape。这是因为BPU有 stride 要求,alignedShape 就是 stride 对齐后的数据大小,validShape为原始大小。
在实际运行时模型输入大小为 alignedShape ,因此数据预处理时不可避免需要完成 padding 的动作( padding 值只能为0),对于图像输入类模型,只需在推理之前按 alignedByteSize 申请内存空间并指定 alignedShape = validShape,预测库 DNN 会依据此信号完成 padding 操作;但如果是 featuremap 输入的模型,则需要大家在预处理时自行完成 padding 操作。
对于模型输出 tensor,若以 bpu 节点直接结尾,则需要按 alignedShape 设置 for 循环的步长,将 padding 部分跳过。若模型尾部有其余 cpu 节点,则 BPU 与 CPU 发生数据传输时已由预测库 DNN 完成了 remove padding 操作,用户无需关注。

1 对齐规则

依据数据排布方式不同,模型输入输出tensor的对齐规则会有所不同:

  • NHWC: 当输入 C>4 时或输出时,C bytes 对齐 256 * {0, 1, ...} + {0, 16, 32, 64, 128} ;当C ≤ 4时,H对齐到2,W对齐到32
  • NCHW:W bytes对齐 256 * {0, 1, ...} + {0, 16, 32, 64, 128}
对于 HB_DNN_IMG_TYPE_NV12 ,要求模型输入的 H&W 必须为偶数。
HB_DNN_IMG_TYPE_NV12 以及 HB_DNN_IMG_TYPE_Y 这两种数据类型的对齐规则是只要求W为16的倍数,不需要完全按照 alignedShape 进行对齐。
(预测库 DNN 支持的数据类型 HB_DNN_xxx 与转换配置的input_type_rt对应关系可参考 PTQ&QAT方案板端验证注意事项 1.1节)

bytes对齐的计算方式可参考后文两个示例。

2 示例

示例 1

该示例中tensor_type为int32,占四个字节。tensor的C维度从425被对齐到了448。计算方式如下:

1. C维度的字节数除以256取余:

(425 * sizeof(tensor_type)) % 256 = (425 * 4) % 256 = 164

2. 由于 164 > 128,则向上对齐到256:

(256 - 164)/sizeof(tensor_type) = 92/4 = 23
3. 最终:

aligned_shape.C = 425+23 = 448

示例 2

该示例中tensor_type为int8,只占一个字节。tensor的C维度从425被对齐到了512。计算方式如下:

1. C维度的字节数除以256取余:

(425 * sizeof(tensor_type)) % 256 = 425 % 256 = 169
2. 由于 169 > 128,则向上对齐到256:
(256 - 169) / sizeof(tensor_type) = 87
3. 最终:

aligned_shape.C = 425 + 87 = 512

算法工具链
征程5征程3杂谈
评论0
0/1000