使用cmake编译时,build目录下的产物也包含测试使用的工具集,下面逐项说明。
MNNV2Basic.out
功能
测试性能、输出结果,可检查与Caffe / Tensorflow的预期结果是否匹配。
注意:对非CPU后端来说,只有总耗时是准确的,单个op耗时和op耗时占比都是不准确的
参数
./MNNV2Basic.out temp.mnn 10 0 0 4 1x3x224x224
- 第一个参数指定 待测试模型的二进制文件。
- 第二个参数指定 性能测试的循环次数,10就表示循环推理10次。
- 第三个参数指定 是否输出推理中间结果,0为不输出,1为只输出每个算子的输出结果({opname}.txt),2为输出每个算子的输入(Input{op_name}.txt)和输出({op_name}.txt)结果; 默认输出当前目录的output目录下(使用工具之前要自己建好output目录)。
- 第四个参数指定 执行推理的计算设备,有效值为 0(CPU)、1(Metal)、2(CUDA)、3(OpenCL)、6(OpenGL),7(Vulkan) ,9 (TensorRT)
- 第五个参数为线程数,默认为4,仅对CPU有效
- 第六个参数指定 输入tensor的大小,一般不需要指定。
- 其他
默认输入与输出
只支持单一输入、单一输出。输入为运行目录下的input_0.txt;输出为推理完成后的第一个输出tensor,转换为文本后,输出到output.txt中。
ModuleBasic.out
功能
类似 MNNV2Basic.out ,对于带控制流模型,或者多输入多输出的模型,建议采用这个工具
参数
./ModuleBasic.out ${test.mnn} ${Dir} [dump] [forwardType] [runLoops] [numberThread] [precision] [cacheFile]
- 第一个参数指定 待测试模型的二进制文件。
- 第二个参数指定 输入输出信息文件夹,可使用 fastTestOnnx.py / fastTestTf.py / fastTestTflite.py 等脚本生成,参考模型转换的正确性校验部分。
- 第三个参数指定 是否输出推理中间结果,0为不输出,1为输出每个算子的输出结果({op_name}.txt), 默认输出当前目录的output目录下(使用工具之前要自己建好output目录)。
- 第四个参数指定 执行推理的计算设备,有效值为 0(CPU)、1(Metal)、2(CUDA)、3(OpenCL)、6(OpenGL),7(Vulkan) ,9 (TensorRT)
- 第五个参数指定性能测试的循环次数默认为 0 ,即不做性能测试
- 第六个参数为线程数或GPU的mode,默认为1
第七个参数指定精度类似,0 为 normal, 1 为high ,2 为 low。
默认输出
在当前目录 output 文件夹下,依次打印输出为 0.txt , 1.txt , 2.txt , etc
Example:
./ModuleBasic.out transformer.mnn tr 0 0 10
Test transformer.mnn from input info: tr
NmtModel/Placeholder
NmtModel/Placeholder_1
output: NmtModel/transpose_2
Use extra forward type: 0
NmtModel/transpose_2: (7, 1, 1, )
Write NmtModel/transpose_2 output to output/0.txt
Avg= 30.970499 ms, min= 30.288002 ms, max= 33.014000 ms
SequenceModuleTest.out
功能
类似 ModuleBasic.out ,适用于多份输入输出数据的校验
参数
./SequenceModuleTest.out ${test.mnn} [forwardType] [shapeMutable] ${Dir} ${Dir1} ……
- 第一个参数指定 待测试模型的二进制文件。
- 第三个参数指定 执行推理的计算设备,有效值为 0(CPU)、1(Metal)、2(CUDA)、3(OpenCL)、6(OpenGL),7(Vulkan) ,9 (TensorRT)
- 第四个参数指定 输入输出信息文件夹,可使用 fastTestOnnx.py / fastTestTf.py / fastTestTflite.py 等脚本生成,参考模型转换的正确性校验部分。
- 后续参数类型同第四个参数,指定需要测试的其他文件夹
示例
./SequenceModuleTest.out transformer.mnn 0 1 tr tr1 tr2 tr3 tr4 > error.txt
然后打开 error.txt 观察是否出现结果错误
checkFile.out
功能
检查两个tensor文本文件是否一致。
参数
./checkFile.out XXX.txt YYY.txt 0.1
- 0.1 表示绝对阈值,不输入则为 0.0001
- 比对值超过绝对阈值时,会直接输出到控制台
checkDir.out
功能
比对两个文件夹下同名文件是否一致。
参数
./checkDir.out output android_output 1
- 1 表示绝对阈值,不输入则为 0.0001
- 比对值超过绝对阈值时,会直接输出到控制台
timeProfile.out
功能
Op 总耗时统计工具和模型运算量估计。
注意:不要用这个工具测非CPU后端的性能,需要的话请用MNNV2Basic工具
参数
./timeProfile.out temp.mnn 10 0 1x3x448x448 4
- 第一个参数 指定模型文件名
- 第二个参数 指定运行次数,默认 100
- 第三个参数 指定 执行推理的计算设备,有效值为 0(浮点 CPU)、1(Metal)、3(浮点OpenCL)、6(OpenGL),7(Vulkan)。(当执行推理的计算设备不为 CPU 时,Op 平均耗时和耗时占比可能不准)
- 第四个参数 指定输入大小,可不设
- 第五个参数 指定线程数,可不设,默认为 4
输出
- 第一列为 Op类型
- 第二列为 平均耗时
- 第三列为 耗时占比
- 示例:
Node Type Avg(ms) % Called times
Softmax 0.018100 0.022775 1.000000
Pooling 0.080800 0.101671 1.000000
ConvolutionDepthwise 14.968399 18.834826 13.000000
Convolution 64.404617 81.040726 15.000000
total time : 79.471924 ms, total mflops : 2271.889404
backendTest.out
功能
这个工具可以对比指定计算设备和CPU执行推理的结果。
参数
./backendTest.out temp.mnn 3 0.15 1
- 该工具默认读取当前目录下的 input_0.txt 作为输入
- 第一个参数:模型文件
- 第二个参数:执行推理的计算设备
- 第三个参数:误差容忍率
- 第四个参数:精度,0 表示 normal ,1 为high,2 为low
Android 中使用
先编译相关的库和可执行文件,然后 push 到 Android 手机上,用 adb 执行命令,参考 project/android/testCommon.sh
参考方式:
1、cd project/android
2、mkdir build_64
3、cd build_64 && ../build_64.sh
4、../updateTest.sh
5、../testCommon.sh ./backendTest.out temp.mnn 3 0.15 1