hb_verifier工具

hb_verifier 是一致性验证工具,支持进行ONNX模型之间、ONNX模型与HBIR模型、HBIR模型与HBIR模型之间的余弦相似度对比, HBIR与HBM模型之间的输出一致性对比。

余弦相似度表示不同阶段量化模型之间的一致性,余弦相似度越接近1,说明对比的两个量化模型的输出越接近。

一致性对比则会打印对比模型的输出一致性信息,包括输出名称、一致性、不一致元素数量、最大绝对误差、最大相对误差。

支持范围

  • Fbc代表浮点HBIR模型,指通过PTQ API方式进行模型转换或QAT链路转换后导出的convert之前的HBIR模型。

  • Qbc代表定点HBIR模型。

对比模型对比场景模型是否来自 hb_compile输入数据要求
Onnx vs Onnx余弦相似度对比不关注一份原始数据
Onnx vs Fbc余弦相似度对比两份分别对应 Onnx 和 Fbc 模型的数据
Onnx vs Qbc
余弦相似度对比
一份原始数据
Onnx vs Qbc余弦相似度对比一份原始数据
一份 runtime 数据
Fbc vs Qbc余弦相似度对比
一份原始数据
一份 runtime 数据
Qbc vs Hbm输出一致性对比一份 runtime 数据
Qbc vs Hbm输出一致性对比一份 runtime 数据
Hbm vs Hbm输出一致性对比不关注一份 runtime 数据
注意
  1. 对于 Fbc(浮点HBIR模型),若已插入预处理节点,则需要修改原始数据为符合模型输入的数据。

  2. hb_verifier工具目前暂不支持对模型量化编译时配置了separate_batch或separate_name后过程中生成的ptq_model.onnx模型的余弦相似度对比。

  3. 所有涉及对比的模型,必须为来自同一链路(PTQ/QAT)进行转换编译的产出物。

使用方式

# onnx vs bc, model from hb_compile hb_verifier -m ${model.onnx},${model.bc} \ -i ${raw_input_data_1.npy} # fbc vs qbc, model not from hb_compile hb_verifier -m ${float_model.bc},${quantized_model.bc} \ -i ${raw_input_data_1.npy} \ -i ${runtime_input_data_1.npy} # multi input model verification for onnx vs bc, model from hb_compile hb_verifier -m ${model.onnx},${model.bc} \ -i ${raw_input_data_1.npy},${raw_input_data_2.npy} # multi input model verification for fbc vs qbc, model not from hb_compile hb_verifier -m ${model.bc},${model.bc} \ -i ${raw_input_data_1.npy},${raw_input_data_2.npy} -i ${runtime_input_data_1.npy},${runtime_input_data_2.npy} # qbc vs hbm, run on simulator hb_verifier -m ${quantized_model.bc},${model.hbm} \ -i ${runtime_input_data_1.npy} # qbc vs hbm, run on board hb_verifier -m ${quantized_model.bc},${model.hbm} \ -i ${runtime_input_data_1.npy} \ --ip None,10.10.10.10 # hbm vs hbm, simulator vs board hb_verifier -m ${model.hbm},${model.hbm} \ -i ${runtime_input_data_1.npy} \ --ip None,10.10.10.10

命令行参数

参数名称参数说明
-h, --help显示帮助信息。
--version显示版本并退出。
-m, --model

指定模型输入,支持ONNX模型(*.onnx)、HBIR模型(*.bc)文件、HBM模型(*.hbm)文件。
两个模型地址之间用“,”分割:-m model1,model2

-i, --input

指定推理测试时使用的数据,仅支持*.npy文件。
多输入模型添加输入数据有以下两种传参方式,多个数据之间用“,”分割:

  • input_name1:input_data_1.npy,input_name2:input_data_2.npy, …
  • input_data_1.npy,input_data_2.npy…
如需输入两份不同模型所需的数据,请使用两个-i参数传入。

注意

  • 输入数据输入需要包含前处理操作,即色彩转换/mean/scale等配置需在准备输入时在外部完成。
  • 如无特殊要求,原始数据使用校准数据集作为输入即可,runtime数据需要与定点模型的输入保持一致
  • 输入数据的名称顺序需要与模型实际输入一致。

-c, --compare_digits设置比较推理结果的数值精确度(即比较数值小数点后的位数),若不进行指定则工具会默认比较至小数点后五位。
--ip指定开发板 IP 地址,默认为空。多个输入需要使用英文逗号分隔。
-u, --usename指定开发板用户名称,默认为 root。多个输入需要使用英文逗号分隔。
-p, --password指定开发板用户密码,默认为空。多个输入需要使用英文逗号分隔。
--port指定开发板 SSH 端口,默认为 22。多个输入需要使用英文逗号分隔。

参考使用场景样例

  1. ONNX模型与ONNX模型之间进行余弦相似度对比。

以模型优化阶段模型 optimized_float_model.onnx 与模型校准阶段模型 calibrated_model.onnx 为例:

hb_verifier -m googlenet_optimized_float_model.onnx,googlenet_calibrated_model.onnx -i input.npy
  1. ONNX模型与HBIR模型之间进行余弦相似度对比。

以模型优化阶段模型 optimized_float_model.onnx 与模型量化阶段定点模型 quantized_model.bc 为例:

hb_verifier -m googlenet_optimized_float_model.onnx,googlenet_quantized_model.bc -i input.npy
  1. HBIR模型与HBM模型之间进行输出一致性对比。

以模型量化阶段定点模型 quantized_model.bc 与模型编译阶段模型 googlenet.hbm为例:

hb_verifier -m googlenet_quantized_model.bc,googlenet.hbm -i runtime_input.npy
  1. HBM模型与HBM模型之间进行模拟器和开发板的输出一致性对比。

以模型编译阶段模型 googlenet.hbm为例, ip 设置为 None 表示使用模拟器:

hb_verifier -m googlenet.hbm,googlenet.hbm -i runtime_input.npy --ip None,10.10.10.10

输出内容说明

余弦相似度对比

所对比模型的余弦相似度信息会打印在终端内,如下示例所示:

+-----------------------------------+----------------------------+-------------------+ | NodeName | TensorName | ConsineSimilarity | +-----------------------------------+----------------------------+-------------------+ | Conv_0 | 365 | 0.999978 | | Relu_2 | 367 | 0.999976 | | MaxPool_3 | 368 | 0.999901 | | Conv_4 | 369 | 0.999112 | | Relu_6 | 371 | 0.999212 | | ... | ... | ... | | Conv_189 | 554 | 0.984707 | | Relu_191 | 556 | 0.989554 | | Concat_192 | 557 | 0.989221 | | GlobalAveragePool_193 | 558 | 0.995896 | | Gemm_195 | transposed_replaced_output | 0.995836 | | Gemm_195_transpose_output_reshape | output | 0.995836 | +-----------------------------------+----------------------------+-------------------+

其中:

  • NodeName代表算子名称。

  • TensorName代表该算子的第一个输出的Tensor名称。

  • ConsineSimilarity代表计算出的余弦相似度。

输出一致性对比

+------------+-------------+---------------------+--------------+--------------+ | OutputName | Consistency | Mismatched Elements | Max Abs Diff | Max Rel Diff | +------------+-------------+---------------------+--------------+--------------+ | output | True | 0/1000 (0.00%) | 0.0 | 0.0 | +------------+-------------+---------------------+--------------+--------------+

其中:

  • OutputName代表输出名称。

  • Consistency代表该输出是否一致。

  • Mismatched Elements 代表不一致元素数量和占比。

  • Max Abs Diff 代表最大绝对误差。

  • Max Rel Diff 代表最大相对误差。