昇腾社区首页
中文
注册

准备ONNX模型npy数据文件

本版本不提供ONNX模型npy数据生成功能,请自行安装ONNX环境并提前准备ONNX原始数据“*.npy”文件。我们仅提供生成符合精度比对要求的numpy格式ONNX原始数据“*.npy”文件的样例参考。

ONNX原始数据文件准备要求

  • 文件内容以 numpy格式保存。
  • 文件命名以op_name.output_index.timestamp.npy形式命名。设置numpy数据文件名包括output_index字段且值为0,确保转换生成的dump数据的output_index为0。因为,精度比对时默认从第一个output_index为0的数据开始,否则无比对结果。
  • 需要确保每个算子节点有名称,否则无法生成正确的文件名。没有名称的算子节点需要先生成名称。
  • 本参考示例以每个节点只有一个输出为例,多个输出的需要在文件名生成处适配output_index的获取。

代码参考示例

为输出符合精度比对要求的“*.npy”数据文件,需在推理结束后的代码中增加以下类似代码:

import onnx
import onnxruntime
import numpy as np
import time

from skl2onnx.helpers.onnx_helper import enumerate_model_node_outputs
from skl2onnx.helpers.onnx_helper import select_model_inputs_outputs
from skl2onnx.helpers.onnx_helper import save_onnx_model

#修改模型,增加输出节点
model_onnx = onnx.load("./resnet50.onnx")
output = []
for out in enumerate_model_node_outputs(model_onnx):
    output.append(out)

num_onnx = select_model_inputs_outputs(model_onnx,outputs=output)
save_onnx_model(num_onnx, "resnet50_dump.onnx")

#推理得到输出,本示例中采用随机数作为输入
input_data = np.random.random((1,3,224,224)).astype(np.float32)
input_data.tofile("test_data.bin")
sess = onnxruntime.InferenceSession("resnet50_dump.onnx")
input_name = sess.get_inputs()[0].name
output_name = [node.name for node in sess.get_outputs()]
res = sess.run(output_name, {input_name: input_data})

#获得输出名称,确保每个算子节点有对应名称
node_name = [node.name for node in model_onnx.graph.node]

#保存数据,针对多个输出的节点要适配output_index的循环
for idx,data in enumerate(res):
    file_name = node_name[idx] + "." + str(0) + "." + str( 
                        round(time.time() * 1000000)) + ".npy"
    output_dump_path = "./onnx_dump/"+file_name
    np.save(output_dump_path, data.astype(np.float16))