测试方法

    1. 一键Benchmark:适用于想快速获得常见模型性能的用户,下载预编译好的benchmark可执行文件;

    2. 逐步Benchmark:将一键Benchmark流程拆解讲解。

    3. 测试模型的精度和性能:使用PaddleLite快速测试单个模型在安卓端的精度。

    1. 电脑准备安装adb

    Linux系统安装adb:

    其他操作系统请自行安装adb。

    1. 检查手机与电脑连接。安卓手机USB连上电脑,打开设置 -> 开启开发者模式 -> 开启USB调试 -> 允许(授权)当前电脑调试手机。

    2. 在电脑终端输入命令,查看当前连接到的设备。

    1. adb devices

    命令成功执行,显示结果类似下面(序列码略有不同):

    1. List of devices attached
    2. 712QSDSEMMS7C device

    执行以下命令,完成Benchmark:

    run_benchmark.sh脚本会:

    1. 下载模型,并上传手机:包含mobilenetv1、mobilenetv2、shufflenetv2、squeezenetv1.1、mnasnet、mobilenetv1_int8、mobilenetv2_int8;

    2. 自动执行另一个脚本benchmark.sh(多台手机连接USB,请在benchmark.sh脚本中对adb命令后加上测试手机的serial number);

    3. 从手机下载benchmark结果result_armv7.txtresult_armv8.txt,到当前目录,并显示Benchmark结果。

    根据准备编译环境,建议使用Docker配置环境。

    拉取Paddle-Lite代码,切换到特定分支,然后在Paddle-Lite根目录下执行编译命令。

    1. # 拉取Paddle-Lite代码
    2. git clone https://github.com/PaddlePaddle/Paddle-Lite.git
    3. # 默认是develop分支,请拉取并切换到特定分支,比如切换到2.8分支
    4. git checkout -b release/v2.8 origin/release/v2.8
    5. ###########################################
    6. # Build benchmark_bin for android-armv7 #
    7. ###########################################
    8. ./lite/tools/build.sh \
    9. --arm_os=android \
    10. --arm_abi=armv7 \
    11. --arm_lang=gcc \
    12. --android_stl=c++_static \
    13. --build_extra=ON \
    14. full_publish
    15. # 编译好的`benchmark_bin` 在: <paddle-lite-repo>/build.lite.android.armv7.gcc/lite/api/benchmark_bin
    16. ###########################################
    17. # Build benchmark_bin for android-armv8 #
    18. ###########################################
    19. --arm_os=android \
    20. --arm_abi=armv8 \
    21. --arm_lang=gcc \
    22. --android_stl=c++_static \
    23. --build_extra=ON \
    24. --with_log=OFF \
    25. full_publish
    26. # 编译好的`benchmark_bin` 在: <paddle-lite-repo>/build.lite.android.armv8.gcc/lite/api/benchmark_bin

    PaddleLite为Benchmark准备好了常见Benchmark模型

    执行以下命令,下载常见Benchmark模型并解压:

    1. wget -c https://paddle-inference-dist.bj.bcebos.com/PaddleLite/benchmark_0/benchmark_models.tgz
    2. tar zxvf benchmark_models.tgz

    如果测试其他模型,请将模型文件放到 benchmark_models 文件夹中,同时保证模型的的权重是独立保存成不同文件。

    benchmark测试的执行脚本benchmark.sh 位于源码中的/PaddleLite/lite/tools/benchmark.sh位置,测试时需要将benchmark.shbenchmark_binbenchmark_models 文件复制到同一目录下。

    如果 benchmark_models 中所有模型文件都已经使用 opt工具 进行转换,则使用 benchmark.sh 脚本执行如下命令进行测试:

    如果 benchmark_models 中所有模型文件都没有使用 opt工具 进行转换,则执行下面的命令。benchmark_bin 会首先转换模型,然后加载模型进行测试。

    1. # Benchmark for android-armv7
    2. sh benchmark.sh ./benchmark_bin_v7 ./benchmark_models result_armv7.txt true
    3. # Benchmark for android-armv8
    4. sh benchmark.sh ./benchmark_bin_v8 ./benchmark_models result_armv8.txt true

    测试结束后,armv7和armv8的结果,分别保存在当前目录下的result_armv7.txtresult_armv8.txt文件中。

    查看测试结果

    在当前目录的result_armv7.txtresult_armv8.txt文件,查看测试结果,举例如下。

    1. run benchmark armv8
    2. --------------------------------------
    3. PaddleLite Benchmark
    4. Threads=1 Warmup=10 Repeats=30
    5. mnasnet min = 19.83500 max = 19.38500 average = 19.65503
    6. mobilenetv1 min = 32.00600 max = 31.56900 average = 31.81983
    7. mobilenetv2 min = 22.37900 max = 22.08700 average = 22.28623
    8. squeezenet min = 17.67400 max = 17.47900 average = 17.57677
    9. Threads=2 Warmup=10 Repeats=30
    10. mobilenetv1 min = 18.75000 max = 18.64300 average = 18.70593
    11. mobilenetv2 min = 14.05100 max = 13.59900 average = 13.71450
    12. shufflenetv2 min = 6.67200 max = 6.58300 average = 6.63400
    13. squeezenet min = 12.07100 max = 11.33400 average = 11.41253
    14. Threads=4 Warmup=10 Repeats=30
    15. mnasnet min = 7.19300 max = 7.02600 average = 7.08480
    16. mobilenetv1 min = 10.42000 max = 10.29100 average = 10.34267
    17. mobilenetv2 min = 8.61900 max = 8.46900 average = 8.54707
    18. shufflenetv2 min = 4.55200 max = 4.41900 average = 4.46477
    19. squeezenet min = 8.60000 max = 7.85200 average = 7.98407
    20. --------------------------------------
    21. run benchmark armv7
    22. --------------------------------------
    23. PaddleLite Benchmark
    24. Threads=1 Warmup=10 Repeats=30
    25. mnasnet min = 20.98300 max = 20.81400 average = 20.92527
    26. mobilenetv1 min = 33.19000 max = 32.81700 average = 33.08490
    27. mobilenetv2 min = 25.91400 max = 25.61700 average = 25.73097
    28. shufflenetv2 min = 11.14300 max = 10.97600 average = 11.06757
    29. squeezenet min = 19.31800 max = 19.20000 average = 19.26530
    30. Threads=2 Warmup=10 Repeats=30
    31. mnasnet min = 12.59900 max = 12.46600 average = 12.52207
    32. mobilenetv1 min = 19.05800 max = 18.94700 average = 18.97897
    33. mobilenetv2 min = 15.28400 max = 15.11300 average = 15.19843
    34. shufflenetv2 min = 6.97000 max = 6.81400 average = 6.90863
    35. squeezenet min = 12.87900 max = 12.12900 average = 12.22530
    36. Threads=4 Warmup=10 Repeats=30
    37. mnasnet min = 7.31400 max = 7.12900 average = 7.20357
    38. mobilenetv1 min = 11.44000 max = 10.86900 average = 10.94383
    39. mobilenetv2 min = 9.14900 max = 9.03800 average = 9.09907
    40. shufflenetv2 min = 4.60600 max = 4.49400 average = 4.53360

    三. 测试模型的精度和性能

    Paddle-Lite的预测流程可以参考,即是准备模型、模型优化、下载或编译预测库、开发应用程序。

    在准备模型阶段,请自行测试确保预测模型的精度。如果不确定模型精度准确,可以使用PaddlePaddle静态图模式下的load_inference_model(API使用方法请到Paddle官网搜索)加载,配置测试数据,使用executor执行,计算模型精度。

    在模型优化阶段,如果出现OP不支持、类型cast等错误,可以提Issue反馈给Paddle-Lite开发同学进行修复,或者参考开发者贡献文档自行修复。

    产出优化后的模型,通常可以下载预测库,开发应用程序了。