大家在板端部署的时候可能会发现模型的输入输出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对齐到32NCHW: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

