大家在板端部署的时候可能会发现模型的输入输出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. 最终:
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:
2. 由于 169 > 128,则向上对齐到256:
(256 - 169) / sizeof(tensor_type) = 87
3. 最终:
3. 最终:
aligned_shape.C = 425 + 87 = 512


