跳到主要内容

仿真测试

本章节主要介绍模型仿真测试工具的使用细节。通过仿真测试,您可以在 PC 端(当前仅限 x86 架构)模拟模型在进迭时空芯片上的运行情况,从而快速验证模型的功能和性能。

1 工具介绍

spine simulate提供 PC 端(当前仅限 x86 架构)的模型仿真测试功能。该功能基于 SDK 中预置的qemu - riscv64以及x86_64 - riscv64交叉编译工具,支持标准 ONNX 模型及进迭时空 AI 部署工具量化后的模型,并保证推理结果与芯片端运行结果完全一致。

1.1 使用说明

$ spine simulate -h
usage: spine simulate [-h] [--model_path MODEL_PATH] [--root_path ROOT_PATH] [--test_name TEST_NAME] [--output_dir OUTPUT_DIR] [--save_output]
[--inputs INPUTS] [--outputs OUTPUTS] [--verbose]

optional arguments:
-h, --help show this help message and exit
--model_path MODEL_PATH, -m MODEL_PATH
model path
--root_path ROOT_PATH, -r ROOT_PATH
root path for test data
--test_name TEST_NAME, -t TEST_NAME
test name
--output_dir OUTPUT_DIR, -o OUTPUT_DIR
output dir for test data
--save_output, -s save output
--inputs INPUTS, -i INPUTS
input tensor names with shapes(option)
--outputs OUTPUTS, -e OUTPUTS
output tensor names with shapes(option)
--verbose, -v verbose message, option is additive

1.2 参数说明

参数必要/可选默认值说明
-h, --help可选打印使用说明
--model_path, -m必要模型路径
--root_path, -r必要测试数据集根目录
--test_name, -t必要测试用例名称
--output_dir, -o可选测试数据输出目录(若未指定,则默认在--root_path下创建以--test_name命名的子目录)
--save_output, -s可选False是否保存 x86 测试输出结果
--inputs, -i可选None重新指定模型输入节点及 shape(可选),格式示例:input_1[n1,n2],input2[n3,n4],...
--outputs, -e可选None重新指定模型输出节点及 shape(可选),格式示例:input_1[n1,n2],input2[n3,n4],...
--verbose, -v可选0使能调试信息

2 测试数据

spine helper test提供创建标准 ONNX 测试数据集功能。

2.1 使用说明

$ spine helper test -h
usage: spine helper test [-h] [--model_path MODEL_PATH] [--root_path ROOT_PATH] [--test_name TEST_NAME] [--output_dir OUTPUT_DIR] [--save_output]
[--inputs INPUTS] [--outputs OUTPUTS] [--verbose] [--count COUNT] [--shape SHAPE]
[--input_names INPUT_NAMES [INPUT_NAMES...]] [--output_names OUTPUT_NAMES [OUTPUT_NAMES...]]

optional arguments:
-h, --help show this help message and exit
--model_path MODEL_PATH, -m MODEL_PATH
model path
--root_path ROOT_PATH, -r ROOT_PATH
root path for test data
--test_name TEST_NAME, -t TEST_NAME
test name
--output_dir OUTPUT_DIR, -o OUTPUT_DIR
output dir for test data
--save_output, -s save output
--inputs INPUTS, -i INPUTS
input tensor names with shapes(option)
--outputs OUTPUTS, -e OUTPUTS
output tensor names with shapes(option)
--verbose, -v verbose message, option is additive
--count COUNT, -c COUNT
test case count
--shape SHAPE, -f SHAPE
shape for dynamic dimension
--input_names INPUT_NAMES [INPUT_NAMES...], -in INPUT_NAMES [INPUT_NAMES...]
input names
--output_names OUTPUT_NAMES [OUTPUT_NAMES...], -on OUTPUT_NAMES [OUTPUT_NAMES...]
output names

2.2 参数说明

参数必要/可选默认值说明
-h, --help可选打印使用说明
--model_path, -m必要模型路径
--root_path, -r必要测试数据集根目录
--test_name, -t必要测试用例名称
--output_dir, -o可选测试数据输出目录(若未指定,则默认在--root_path下创建以--test_name命名的子目录)
--save_output, -s可选False是否保存 x86 测试输出结果
--inputs, -i可选None重新指定模型输入节点及 shape(可选),格式示例:input_1[n1,n2],input2[n3,n4],...
--outputs, -e可选None重新指定模型输出节点及 shape(可选),格式示例:input_1[n1,n2],input2[n3,n4],...
--verbose, -v可选0使能调试信息
--count, -c可选1测试用例数量
--shape, -f可选符号参数对应的shape,格式示例:p2o.DynamicDimension.0:1
--input_names, -in可选输入节点名称列表
--output_names, -on可选输出节点名称列表

2.3 数据构建

quick_start中的test_simulate_paddle_qemu函数及上述 Paddle 模型为例,在开发环境中运行下述命令:

$ spine helper test --model_path resnet50/inference.onnx --root_path test_data --test_name resnet50 -r 4 -f p2o.DynamicDimension.0:1 --save_output
[INFO] create random test data under /home/workspace/test_data/resnet50/test_data_set_0 done
[INFO] create random test data under /home/workspace/test_data/resnet50/test_data_set_1 done
[INFO] create random test data under /home/workspace/test_data/resnet50/test_data_set_2 done
[INFO] create random test data under /home/workspace/test_data/resnet50/test_data_set_3 done
$ tree test_data/resnet50/
test_data/resnet50/
├── inference.onnx
├── test_data_set_0
│ ├── input_0.pb
│ └── output_0.pb
├── test_data_set_1
│ ├── input_0.pb
│ └── output_0.pb
├── test_data_set_2
│ ├── input_0.pb
│ └── output_0.pb
└── test_data_set_3
├── input_0.pb
└── output_0.pb

4 directories, 9 files

说明--model_path指定 ONNX 模型路径,--root_path指定测试数据集根目录,--test_name指定测试用例名称,-r指定测试用例数量,-f指定符号参数对应的shape--save_output指定需要保存 x86 测试输出结果。

3 仿真运行

以上述生成的测试数据集为例:

$ spine simulate test_data/resnet50/
result:
Models: 1
Total test cases: 4
Succeeded: 4
Not implemented: 0
Failed: 0
Stats by Operator type:
Not implemented(0):
Failed:
Failed Test Cases:

说明spine simulate封装了 SDK 目录下的spacemit - ort/bin/onnx_test_runner测试工具。如果测试用例目录下存在标准输出结果(e.g. spine helper test构造测试数据时,通过--save_output指定保存 x86 输出结果),则spine simulate test_data命令还会对芯片端仿真测试输出结果进行精度比对(默认:相对误差1e - 5,绝对误差1e - 5)。更多参数细节,可以参阅 5.1.2 spine simulate章节内容。

4 常见问题(FAQ)

  1. 示例:仿真测试时出现错误或异常 答:请检查模型路径、测试数据集根目录、测试用例名称等参数是否正确设置,以及测试数据集是否完整。如果问题仍然存在,请提供详细的错误信息,以便我们更好地帮助您解决问题。