对齐规则

本节内容介绍使用BPU的对齐限制规则。

模型输入要求

BPU不限制模型输入大小或者奇偶。既像YOLO这种416x416的输入可以支持,对于像SqueezeNet这种227x227的输入也可以支持。 对于NV12输入比较特别,要求HW都是偶数,是为了满足UV是Y的一半的要求。

对齐和有效数据

BPU对数据有对齐限制。有效数据排布和对齐数据排布用 hbDNNTensorProperties 中的 validShapestride 表示。

  • validShape 是有效数据的shape。
  • stride 表示 validShape 各维度的步长,描述跨越张量各个维度所需要经过的字节数。注意的是 hbDNNDataType 为NV12或Y类型输入的模型比较特殊,为兼容模型,其获取到的 stride 均为0,因为这些类型输入只要求W方向32对齐。

模型输入输出张量可以通过 validShapestride 获取正确的数据排布, 比如获取到的模型某输入属性 hbDNNDataType = HB_DNN_TENSOR_TYPE_U16validShape = [1, 3, 212, 212]stride = [301056, 100352, 448, 2] , 这里表示模型有效输入的大小为 1x3x212x212

  • stride[3] = 2 ,表示每个元素 16bit 大小。
  • stride[2] = 448 = 2 * 224 ,表示 index=3 的维度按照 224 对齐,因此 index=3 的维度步长为 448
  • stride[1] = 100352 = 448 * 224, ,表示 index=2 的维度也按照 224 对齐,因此 index=2 的维度步长为 100352
  • stride[0] = 301056 = 100352 * 3 ,表示 index=1 的维度按照 3 对齐,和有效尺寸一致,因此 index=1 的维度步长为 301056

在后续场景使用时,考虑到对齐要求,建议按照 alignedByteSize 大小来申请内存空间。