10. 模型评测工具使用说明
为了方便用户测评模型,在开发板上预制了 ax_run_model
工具,此工具有若干参数,可以很方便地测试模型速度和精度。
root@~# ax_run_model usage: ax_run_model --model=string [options] ... options: -m, --model path to a model file (string) -r, --repeat repeat times running a model (int [=1]) -w, --warmup repeat times before running a model to warming up (int [=1]) -a, --affinity npu affinity when running a model (int [=1]) -v, --vnpu type of Visual-NPU inited {0=Disable, 1=STD, 2=BigLittle} (int [=0]) -b, --batch the batch will running (int [=0]) -i, --input-folder the folder of each inputs (folders) located (string [=]) -o, --output-folder the folder of each outputs (folders) will saved in (string [=]) -l, --list the list of inputs which will test (string [=]) --inputs-is-folder each time model running needs inputs stored in each standalone input folders --outputs-is-folder each time model running saved outputs stored in each standalone output folders --use-tensor-name using tensor names instead of using tensor indexes when loading & saving io files --verify verify outputs after running model --save-benchmark save benchmark result(min, max, avg) as a json file -?, --help print this message
10.1. 参数说明
测评工具参数主要有两部分.
第一部分是与测速有关的参数:
- ax_run_model 参数解释
- --model
数据类型:string
是否必选:是
描述:指定测试模型的路径
- --repeat
数据类型:int
是否必选:否
描述:指定要测试的循环次数,然后显示 min/max/avg 的速度
- --warmup
数据类型:int
是否必选:否
描述:循环测试前,预热的次数
- --affinity
数据类型:int
是否必选:否
描述:亲和性的 mask 值,大于 1(0b001),小于 7(0b111)
- --vnpu
数据类型:int
是否必选:否
描述:虚拟npu模式;0 禁用虚拟 npu;1 标准切分模式;2 大小核模式
- --batch
数据类型:int
是否必选:否
描述:指定测试的batch
- --input-folder
数据类型:string
是否必选:否
描述:指定用于精度测试的输入文件夹
- --output-folder
数据类型:string
是否必选:否
描述:指定用于精度测试的输出文件夹
- --list
数据类型:string
是否必选:否
描述:指定测试列表
- --inputs-is-folder
数据类型:string
是否必选:否
描述:指定输入路径 –input-folder 是由文件夹组成的,参数不指定也默认生效,后续废弃
- --outputs-is-folder
数据类型:string
是否必选:否
描述:指定输出径 –out-folder 是由文件夹组成的,参数不指定也默认生效,后续废弃
- --use-tensor-name
数据类型:string
是否必选:否
描述:指定按模型输入输出名字查找激励文件,不设置是按索引查找,参数不指定也默认生效,后续废弃
- --verify
数据类型:string
是否必选:否
描述:指定不保存模型输出且指定的目录输出文件已存在,进行逐 byte 比较
10.2. 使用示例
以测速需求为例,假设已经转换完成了一个单核心的 YOLOv5s
模型,现在想要知道上板子运行的速度,那么可以参考运行如下命令:
root@~# ax_run_model -m /opt/data/npu/models/yolov5s.axmodel -w 10 -r 100 Run AxModel: model: /opt/data/npu/models/yolov5s.axmodel type: NPU1 vnpu: Disable affinity: 0b001 repeat: 100 warmup: 10 batch: 1 pulsar2 ver: 1.2-patch2 7e6b2b5f engine ver: V1.13.0 Apr 26 2023 16:48:53 1.1.0 tool ver: 1.0.0 cmm size: 12730188 Bytes ------------------------------------------------------ min = 7.658 ms max = 7.672 ms avg = 7.662 ms ------------------------------------------------------
从打印的 log 可以看出,VNPU 被初始化成 standard 模式,此时 NPU 被分作三份;并且这次测速时亲和性设置为亲和序号最大的那个模型。
通过设置亲和性,可以很方便地在不编写代码的情况下,同时跑多个模型进行测速。
比如,在一个 SSH 终端窗口里,运行模型 a 数万次,然后在另一个 SSH 终端里,设置不同的亲和性,观察模型 b 速度相较于没有运行模型a时的速度下降,就可以得知极高负载情况下,模型b受模型 a 运行的影响(这可能比真实情况更严苛)。需要注意的是,两个 SSH 里, -v
参数需要是一致的。
另一个很常见的需求是转完了模型,想要知道板子上的精度如何,这可以通过精度的参数进行测试。
以分类模型为例,说明目录结构和参数的使用,这里以典型的一个目录结构举例:
root@~# tree /opt/data/npu/temp/ /opt/data/npu/temp/ |-- input | `-- 0 | `-- data.bin |-- list.txt |-- mobilenet_v1.axmodel `-- output `-- 0 `-- prob.bin 4 directories, 4 files
测试精度时必须的参数是 -m -i -o -l
,分别指定模型、输入文件夹、输出文件夹、和待测试的输入列表。
此外,这三个模式的输出文件夹都非空,在运行命令时输出文件夹的已有文件会被覆盖;但如果是已经从 Pulsar2
仿真拿到的输出 golden
文件,
则可以通过附加 --verify
参数不覆写输出文件,而是读取输出文件夹的已有文件,和当前模型的输出在内存中进行逐位比较,这个模式在怀疑仿真和上板精度不对齐时特别有用。
参数 -l
指定激励文件夹列表:
root@~# cat /opt/data/npu/temp/list.txt 0 root@~#
也就是在示例中,指定的是唯一一个激励文件夹。这个参数在数据集很大时非常有用,比如输入文件夹是完整的 ImageNet
数据集,文件非常多;
但这次测试时只希望测 10 个文件验证一下,如果没有异常再跑全量的测试,那么这样的需求可以通过创建两个 list.txt
完成,一个list里保存的只有 10 行激励,一个list文件里是全部的激励。
以下是 verify
的需求进行举例, ax_run_model
参数运行示例如下:
root@~# ax_run_model -m /opt/data/npu/temp/mobilenet_v1.axmodel -i /opt/data/npu/temp/input/ -o /opt/data/npu/temp/output/ -l /opt/data/npu/temp/list.txt --verify total found {1} input drive folders. infer model, total 1/1. Done. ------------------------------------------------------ min = 3.347 ms max = 3.347 ms avg = 3.347 ms ------------------------------------------------------ root@~#
可以看出,这个模型在这组输入输出 binary 文件下,输出是逐位对齐的。如果没有对齐,打印会报告没有对齐的 byte
偏移量。