S100 OpenExplorer

# #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)进行转换编译的产出物。

## #使用方法

`Usage: hb_verifier [OPTIONS] Options: -h, --help Show this message and exit. --version Show the version and exit. -m, --model TEXT The types of parameters supported include onnx/bc/hbm models, comma-separated. [required] -i, --input TEXT Original model input files. [required] -c, --compare_digits INTEGER The number of decimal places to compare. --ip TEXT Board ip (comma-separated, number should match HBM model count). -u, --username TEXT Board username (comma-separated, number should match HBM model count). -p, --password TEXT Board password (comma-separated, number should match HBM model count). --port TEXT Board ssh port (comma-separated, number should match HBM model count).`

## #命令行参数

参数名称 | 参数说明
`-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`。多个输入需要使用英文逗号分隔。

## #使用示例

### #余弦相似度对比

#### #ONNX模型与ONNX模型

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

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

`hb_verifier -m googlenet_optimized_float_model.onnx,googlenet_calibrated_model.onnx \ -i input.npy`

#### #ONNX模型与HBIR模型

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

   以模型优化阶段模型 `optimized_float_model.onnx` 与浮点HBIR模型 `float_model.bc` 为例：

   `hb_verifier -m googlenet_optimized_float_model.onnx,googlenet_float_model.bc \ -i input1.npy,input2.npy`

2. ONNX模型与定点HBIR模型之间进行余弦相似度对比。

   - 若模型是来自于hb_compile编译，以模型优化阶段模型 `optimized_float_model.onnx` 与模型量化阶段定点模型 `quantized_model.bc` 为例：

     `hb_verifier -m googlenet_optimized_float_model.onnx,googlenet_quantized_model.bc \ -i input.npy`
     - 若模型是来自于hb_compile编译且存在多个输入数据，以模型优化阶段模型 `optimized_float_model.onnx` 与模型量化阶段定点模型 `quantized_model.bc` 为例：
     `hb_verifier -m googlenet_optimized_float_model.onnx,googlenet_quantized_model.bc \ -i input1.npy,input2.npy`

   - 若模型不是来自于hb_compile编译，以原始浮点模型 `original_float_model.onnx` 与定点模型 `quantized_model.bc` 为例：

     `hb_verifier -m googlenet_original_float_model.onnx,googlenet_quantized_model.bc \ -i input.npy \ -i runtime_input.npy`

   - 若模型不是来自于hb_compile编译且存在多个输入数据，以原始浮点模型 `original_float_model.onnx` 与定点模型 `quantized_model.bc` 为例：

     `hb_verifier -m googlenet_original_float_model.onnx,googlenet_quantized_model.bc \ -i input1.npy,input2.npy \ -i runtime_input1.npy,runtime_input2.npy`

#### #HBIR模型与HBIR模型

HBIR模型与HBIR模型之间进行余弦相似度对比。

- 若模型不是来自于hb_compile编译，以浮点模型 `float_model.bc` 与定点模型 `quantized_model.bc` 与为例：

  `hb_verifier -m googlenet_float_model.bc,googlenet_quantized_model.bc \ -i input.npy \ -i runtime_input.npy`

- 若模型不是来自于hb_compile编译且存在多个输入数据，以浮点模型 `float_model.bc` 与定点模型 `quantized_model.bc` 与为例：

  `hb_verifier -m googlenet_float_model.bc,googlenet_quantized_model.bc \ -i input1.npy,input2.npy -i runtime_input1.npy,runtime_input2.npy`

### #输出一致性对比

#### #HBIR模型与HBM模型

HBIR模型与HBM模型之间进行输出一致性对比。

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

  `hb_verifier -m googlenet_quantized_model.bc,googlenet.hbm \ -i runtime_input.npy`

- 以模型量化阶段定点模型 `quantized_model.bc` 与模型编译阶段模型 `googlenet.hbm`为例，`ip` 设置为 None 表示使用模拟器：

  `hb_verifier -m googlenet_quantized_model.bc,googlenet.hbm \ -i runtime_input.npy \ --ip None,10.10.10.10`

#### #HBM模型与HBM模型

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 代表最大相对误差。

页面目录