专栏算法工具链模型推理结果保存为bin文件

模型推理结果保存为bin文件

爱学习的班马10小时前
25
12

J6M OE包版本3.7

我们在通过C++推理模型结果的时候,如何直接将模型的推理结果保存为bin文件?

算法工具链
技术深度解析征程6
评论4
0/1000
  • Huanghui
    Lv.5
    这个就是拿到模型的输出tensor后使用C++的文件操作函数,把output tensors buffer指针和结构定义的长度写道文件中:如下你参考一下呢:
    // Step 5: 将每个输出 tensor 保存为 .bin 文件

    for (int i = 0; i < output_count; ++i) {

    hbUCPMemFlush(&output_tensors[i].sysMem, HB_SYS_MEM_CACHE_INVALIDATE);

    std::string bin_filename = "output_" + std::to_string(i) + ".bin";

    std::ofstream ofs(bin_filename, std::ios::binary);

    if (!ofs.is_open()) {

    std::cerr

    continue;

    }

    // 获取输出数据指针和大小

    void* data_ptr = output_tensors[i].sysMem.virAddr;

    size_t data_size = output_tensors[i].properties.alignedByteSize;

    // 写入原始字节流

    ofs.write(static_cast(data_ptr), data_size);

    ofs.close();

    std::cout

    }

    10小时前
    1
    0
  • Huanghui
    Lv.5
    需要注意:
    如果在模型编译时 未启用 output_no_padding=True,那么输出 tensor 的内存布局会包含 padding 字节(用于满足 BPU 内存对齐要求)。此时:
    • alignedByteSize 表示实际分配的物理内存大小(含 padding);
    • 而业务真正需要的有效数据,仅由 validShape(即逻辑 shape)决定;
    • 直接将整个 alignedByteSize 写入 .bin 文件会导致混入无效 padding 数据,影响后续解析或精度验证。
    因此,必须按有效 shape 遍历数据,并跳过 padding 部分,只提取有效区域。
    10小时前
    0
    0
  • Huanghui
    Lv.5
    10小时前
    0
    8
    • 爱学习的班马回复Huanghui:

      这个函数具体位置在哪里呀?我怎么没找到呢?

      6小时前
      0
    • 爱学习的班马回复Huanghui:
      5小时前
      0
    • 爱学习的班马回复Huanghui:

      为什么通过我下面这段代码进行输出保存的时候,维度是一样的,但是输出的数值都是0呢?

      5小时前
      0
    • Huanghui回复爱学习的班马:

      你的推理结果本来就是0,还是说你保存之后都是0,你需要注意以下,你保存时用的时字节流,读出之后还是要根据数据类型进行转换的哈

      5小时前
      0
    • 爱学习的班马回复爱学习的班马:

      且通过python中infer_hbir.py脚本对.bc进行推理的时候,是有结果的

      5小时前
      0
    • Huanghui回复爱学习的班马:

      如果BC有结果,那hbm应该页OK,你看看输出数据的类型把,如果remove了dequant,保存数据时也可以先做以下反量化,具体的,你参考一下啊quick_start样例

      5小时前
      1
    • 爱学习的班马回复Huanghui:
      python脚本推理是有数值的,但是C++保存到bin文件中读取的数值就是0.
      这个读出之后根据数据类型进行转换有相关操作吗?
      5小时前
      0
    • Huanghui回复爱学习的班马:
      操作就是:你通过tensore的properties看看数据事什么类型的,比如说是float32的,你存储的时候存的是char*的,存完了再读取出来后,记得把char*的buffer转成float就OK了,如下就是转换大的语法(C++常规语法)
      然后data就对应了输出的数据了。还是之前说的,记得考虑padding, 如果不想处理padding,就直接yaml的编译参数中配置:extra_params: {"output_no_padding": True}
      4小时前
      1
  • 澡堂白给怪
    Lv.1

    11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111112222222222222222222221111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

    7小时前
    0
    0