本节内容介绍使用BPU的对齐限制规则。
BPU不限制模型输入大小或者奇偶。既像YOLO这种416x416的输入可以支持,对于像SqueezeNet这种227x227的输入也可以支持。 对于NV12输入比较特别,要求HW都是偶数,是为了满足UV是Y的一半的要求。
BPU对数据有对齐限制。有效数据排布和对齐数据排布用 hbDNNTensorProperties
中的 validShape
和 stride
表示。
validShape
是有效数据的shape。stride
表示 validShape
各维度的步长,描述跨越张量各个维度所需要经过的字节数。需要注意,NV12或Y类型输入的模型比较特殊,这些类型的输入只要求W方向满足固定的对齐约束即可,其获取到的 stride
均为-1,详细规则可参考 动态输入介绍 章节的描述。模型输入输出张量可以通过 validShape
和 stride
获取正确的数据排布,
比如获取到的模型某输入属性 hbDNNDataType = HB_DNN_TENSOR_TYPE_U16
, validShape = [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 > 0
时,建议按照 alignedByteSize
大小来申请内存空间。
您可以使用以下方式判断是否需要对模型的输入进行对齐,若公式不成立,您则需要额外对输入数据进行对齐操作。
,其中 n=validShape.numDimensions
。
BPU对模型输入输出内存首地址有对齐限制,要求输入与输出内存的首地址 32
或者 64
对齐,对应不同的计算平台。
使用 hbUCPMalloc 与 hbUCPMallocCached 接口申请的内存首地址默认 64
对齐。
当您申请一块内存,并使用偏移地址作为模型的输入或输出时,请检查偏移后的首地址是否满足对齐要求。