专栏算法工具链模型输出数据size疑问

模型输出数据size疑问

加利福尼亚不下雨2026-03-26
67
4

******************************************************start tensor : 0 **************************************************

output_tensor.sysMem.phyAddr is : 31916032

output_tensor.sysMem.virAddr is : -1989279744

output_tensor.sysMem.memSize is : 458752

[output_tensor.properties.validShape.dimensionSize] Dimension size (length: 10): [1, 64, 112, 10, 0, 0, 0, 0, 0, 0]
output_tensor.properties.validShape.numDimensions is : 4
output_tensor.properties.tensorType is : 0.000000
output_tensor.properties.scale.scaleLen is : 10
output_tensor.properties.scale.zeroPointLen is : 10

==========================================

[output_tensor.properties.scale] 量化尺度数据打印

==========================================

【ScaleData信息】

scaleLen: 10

scaleData: [0.000457, 0.000624, 0.000576, 0.000518, 0.000484, 0.000823, 0.000507, 0.000617, 0.001409, 0.000605]

【ZeroPointData信息】

zeroPointLen: 10

zeroPointData: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

output_tensor.properties.quantiType is : 1
output_tensor.properties.quantizeAxis is : 0.000000
output_tensor.properties.alignedByteSize is : 0.000000
[output_tensor.properties.stride] Dimension size (length: 10): [458752, 7168, 64, 4, 0, 0, 0, 0, 0, 0]

******************************************************end tensor : 0 **************************************************

output_tensor.sysMem.memSize 不应该等于 1 x 64 x 112 x 10 x sizeof(float) 吗? 为什么是458752, 这么奇怪的数字?
算法工具链
技术深度解析征程6
评论2
0/600
  • HuangHui
    Lv.5
    这是数据对齐后的结果,stride 和 shape一起看你就知道咋处理了。
    [458752, 7168, 64, 4, 0, 0, 0, 0, 0, 0] 这里的4是sizeof(float) = 4,然后64/4 = 16,但你的valid shpae dim3为10,说明最后一维padding了6(16-10)个sizeof(float),padding的原因是BPU属于硬件单元,每次计算的数据长度是确定的(J6EM上字节数需要是32的整数倍)。也就是实际上alignedShape是[1, 64, 112, 16],type为f32,所以结果为:1 x 64 x 112 x 16 x sizeof(float) =
    2026-03-26
    0
    2
    • 加利福尼亚不下雨回复HuangHui:

      看看这个,是否满足同样的规律??

      output_tensor.sysMem.phyAddr is : 33030144

      output_tensor.sysMem.virAddr is : -1990000640

      output_tensor.sysMem.memSize is : 32768

      [output_tensor.properties.validShape.dimensionSize] Dimension size (length: 10): [1, 64, 112, 1, 0, 0, 0, 0, 0, 0]
      output_tensor.properties.validShape.numDimensions is : 4
      output_tensor.properties.tensorType is : 0.000000
      output_tensor.properties.scale.scaleLen is : 1
      output_tensor.properties.scale.zeroPointLen is : 1

      ==========================================

      [output_tensor.properties.scale] 量化尺度数据打印

      ==========================================

      【ScaleData信息】

      scaleLen: 1

      scaleData: [0.000066]

      【ZeroPointData信息】

      zeroPointLen: 1

      zeroPointData: [0]

      output_tensor.properties.quantiType is : 1
      output_tensor.properties.quantizeAxis is : 0.000000
      output_tensor.properties.alignedByteSize is : 0.000000
      [output_tensor.properties.stride] Dimension size (length: 10): [32768, 512, 4, 4, 0, 0, 0, 0, 0, 0]
      2026-03-27
      0
    • HuangHui回复加利福尼亚不下雨:
      是的,从给出的stridex信息[32768, 512, 4, 4]可以计算出alignedShpa是[1, 64, 128, 1 ],数据类型为宽度4个字节的类型(f32,int32等),而你的validShape是[1, 64, 112, 1],112 padding到了128,应该是w维。
      2026-03-27
      0
  • DR_KAN
    Lv.5

    #对齐和有效数据

    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 大小来申请内存空间。

    您可以使用以下方式判断是否需要对模型的输入进行对齐,若公式不成立,您则需要额外对输入数据进行对齐操作。

    ∏i=1n−1validShape.dimensionSize[i]==stride[0],其中 n=validShape.numDimensions。
    2026-03-27
    0
    0