diff --git a/docs/benchmark/benchmark.md b/docs/benchmark/benchmark.md index 2524f554586ff4152f5d51b26ad6a0305b260896..7ed1ae1f637d472a6d19ae4c44314268241810a3 100644 --- a/docs/benchmark/benchmark.md +++ b/docs/benchmark/benchmark.md @@ -2,7 +2,7 @@ 可以参考[benchmark_tools](benchmark_tools),推荐**一键benchmark**。 -## 测试环境 +## ARM测试环境 * 测试模型 * fp32模型 @@ -38,7 +38,7 @@ * 当线程数为1时,```DeviceInfo::Global().SetRunMode```设置LITE_POWER_HIGH,否者设置LITE_POWER_NO_BIND * 模型的输入图像的维度是{1, 3, 224, 224},输入图像的每一位数值是1 -## 测试数据 +## ARM测试数据 ### fp32模型测试数据 @@ -120,3 +120,46 @@ mobilenet_v2 |47.13 |25.62 |13.56 |41.87 |22.42 |11.72 | threads num|1 |2 |4 |1 |2 |4 | mobilenet_v1 |63.13 |32.63 |16.85 |58.92 |29.96 |15.42 | mobilenet_v2 |48.60 |25.43 |13.76 |43.06 |22.10 |12.09 | + + +## 华为麒麟NPU测试环境 + +* 测试模型 + * fp32模型 + * mobilenet_v1 + * mobilenet_v2 + * squeezenet_v1.1 + * mnasnet + +* 测试机器(android ndk ndk-r17c) + * 麒麟810 + * HUAWEI Nova5, Kirin 810 + * 2xCortex A76 2.27GHz + 6xCortex A55 1.88GHz + + * 麒麟990 + * HUAWEI Mate 30, Kirin 990 + * 2 x Cortex-A76 Based 2.86 GHz + 2 x Cortex-A76 Based 2.09 GHz + 4 x Cortex-A55 1.86 GHz + + * 麒麟990 5G + * HUAWEI P40, Kirin 990 5G + * 2 x Cortex-A76 Based 2.86GHz + 2 x Cortex-A76 Based 2.36GHz + 4 x Cortex-A55 1.95GHz + +* HIAI ddk 版本: 310 + +* 测试说明 + * branch: release/v2.6.1 + * warmup=10, repeats=30,统计平均时间,单位是ms + * 线程数为1,```DeviceInfo::Global().SetRunMode```设置LITE_POWER_HIGH + * 模型的输入图像的维度是{1, 3, 224, 224},输入图像的每一位数值是1 + +## 华为麒麟NPU测试数据 + +#### paddlepaddle model + +|Kirin |810||990||990 5G|| +|---|---|---|---|---|---|---| +||cpu(ms) | npu(ms) |cpu(ms) | npu(ms) |cpu(ms) | npu(ms) | +|mobilenet_v1| 33.84| 3.10| 31.91| 4.07| 33.97| 3.20| +|mobilenet_v2| 23.32| 3.51| 22.47| 5.61| 23.17| 3.51| +|squeezenet| 18.47| 4.35| 17.79| 5.05| 18.65| 3.47| +|mnasnet| 20.24| 3.28| 19.54| 5.17| 20.34| 3.32| diff --git a/docs/demo_guides/npu.md b/docs/demo_guides/npu.md index 7b37d13350c93c4c39e2970d23024d291f6edd2f..86774a956d0c8417a1cf6afabd2fd7428f9666cd 100644 --- a/docs/demo_guides/npu.md +++ b/docs/demo_guides/npu.md @@ -5,7 +5,7 @@ Paddle Lite是首款支持华为自研达芬奇架构NPU(Kirin 810/990 SoC搭 ## 已支持的设备 -- 华为nova5、nova5i pro、mate30、mate30 pro、mate30 5G、荣耀v30,以及即将推出的mate40、p40。据华为透露,今后上市的大部分手机都会搭载其自研达芬奇架构NPU。 +- 华为nova5、nova5i pro、mate30、mate30 pro、mate30 5G、荣耀v30、p40、p40 pro,以及即将推出的mate40、。据华为透露,今后上市的大部分手机都会搭载其自研达芬奇架构NPU。 ## 已支持的模型 @@ -13,9 +13,14 @@ Paddle Lite是首款支持华为自研达芬奇架构NPU(Kirin 810/990 SoC搭 - MobileNetV2 - ResNet-18/50 - ShuffleNetV2 +- squeezenet +- mnasnet +- yolov3 - CycleGAN (暂时需要华为内部rom的支持) - 百度内部业务模型(由于涉密,不方便透露具体细节) +*CPU/NPU混合调度在部分模型可以获得更佳的性能* + ## 已支持(或部分支持)的Paddle算子 - sigmoid @@ -64,8 +69,8 @@ Paddle Lite是首款支持华为自研达芬奇架构NPU(Kirin 810/990 SoC搭 ## 编译支持NPU的Paddle Lite库 -- 从https://developer.huawei.com/consumer/cn/hiai/下载华为HiAI DDK后解压到任意路径(注意:华为提供了多个版本的DDK,我们需要下载针对麒麟810/990芯片HiAI Foundation开发套件,例如最新的[DDK V310版本](https://obs.cn-north-2.myhwclouds.com/hms-ds-wf/sdk/hwhiai-ddk-100.310.011.010.zip))。 -- 将HiAI DDK中的ai_ddk_lib目录拷贝至Paddle Lite源码根目录后,使用[NPU编译脚本](https://github.com/PaddlePaddle/Paddle-Lite/blob/develop/lite/tools/build_npu.sh)编译full_publish和tiny_publish。 +- 从[华为HiAI平台](https://developer.huawei.com/consumer/cn/hiai)下载华为HiAI DDK后解压到任意路径(注意:华为提供了多个版本的DDK,我们需要下载针对麒麟810/990芯片HiAI Foundation开发套件,例如[DDK V310版本](https://obs.cn-north-2.myhwclouds.com/hms-ds-wf/sdk/hwhiai-ddk-100.310.011.010.zip))。 +- 将HiAI DDK中的ai_ddk_lib目录拷贝至Paddle Lite源码根目录后,使用[编译脚本](https://github.com/PaddlePaddle/Paddle-Lite/blob/develop/lite/tools/build_android.sh)编译 (需要指定NPU相关选项)。 注意:以下是HiAI DDK V310版解压后的目录结构,需要将ai_ddk_lib目录拷贝至Paddle Lite源码根目录。 ```shell @@ -79,16 +84,11 @@ Paddle Lite是首款支持华为自研达芬奇架构NPU(Kirin 810/990 SoC搭 - tools ``` -- full_publish and tiny_publish for armv8,由于HiAI DDK的armv7和armv8的so库均基于c++_shared构建,因此,建议使用c++_shared编译Paddle Lite。 -```shell -$ ./lite/tools/build_npu.sh --arm_os=android --arm_abi=armv8 --arm_lang=gcc --android_stl=c++_shared full_publish -$ ./lite/tools/build_npu.sh --arm_os=android --arm_abi=armv8 --arm_lang=gcc --android_stl=c++_shared tiny_publish -``` - -- full_publish and tiny_publish for armv7 +- 推荐编译命令。由于HiAI DDK的so库均基于c++_shared构建,因此,建议使用c++_shared编译Paddle Lite。 ```shell -$ ./lite/tools/build_npu.sh --arm_os=android --arm_abi=armv7 --arm_lang=gcc --android_stl=c++_shared full_publish -$ ./lite/tools/build_npu.sh --arm_os=android --arm_abi=armv7 --arm_lang=gcc --android_stl=c++_shared tiny_publish +# huawei_kirin_npu_sdk_root 需要指向 ai_ddk_lib 的路径 +$ ./lite/tools/build_android.sh --android_stl=c++_shared --with_huawei_kirin_npu=ON --huawei_kirin_npu_sdk_root= +# 其它选项可以通过 "./lite/tools/build_android.sh help" 查看,例如arm版本等 ``` 注意:为了保证编译环境一致,建议参考[源码编译](../user_guides/source_compile)中的Docker开发环境进行配置,然后再执行上述命令。 @@ -166,15 +166,15 @@ $ ./lite/tools/build_npu.sh --arm_os=android --arm_abi=armv7 --arm_lang=gcc --an - 2、初步分析 - 下图是ssd_mobilenet_v1中的部分结构。其中红色部分暂时不支持在NPU上运行,蓝色部分可能NPU上的性能不理想。此时,如果直接让预测库自动调度的话,可能会分成多个子图,而且整体性能不佳。因此,可以将蓝色部分和绿色部分整体指定在CPU上运行,让其他部分自动运行在NPU上(红色部分会自动在CPU上运行)。 - ![ssd_mobilenet_v1_example](https://user-images.githubusercontent.com/50474132/80453173-525b5280-895a-11ea-847f-c7dd5b5799de.png) + ![](https://user-images.githubusercontent.com/50474132/80453173-525b5280-895a-11ea-847f-c7dd5b5799de.png) - 3、使用opt转换模型 - opt转换过程中会打印log信息。在log中搜索```digraph G```和```// end G```可以找到优化后的模型图。 - ![image](https://user-images.githubusercontent.com/50474132/80454098-145f2e00-895c-11ea-9f16-dde1483a9beb.png) - ![image](https://user-images.githubusercontent.com/50474132/80454123-1de89600-895c-11ea-86b9-a62d78a6616d.png) + ![](https://user-images.githubusercontent.com/50474132/80454098-145f2e00-895c-11ea-9f16-dde1483a9beb.png) + ![](https://user-images.githubusercontent.com/50474132/80454123-1de89600-895c-11ea-86b9-a62d78a6616d.png) - 将从```digraph G```开始的,到```// end G```结束的整段模型图信息,保存到```.dot```格式的文件中。可以用```graphviz```打开查看,或者在[网页版](http://dreampuf.github.io/GraphvizOnline/)查看。 - ![image](https://user-images.githubusercontent.com/50474132/80454841-47ee8800-895d-11ea-9531-5689c5560fcb.png) + ![](https://user-images.githubusercontent.com/50474132/80454841-47ee8800-895d-11ea-9531-5689c5560fcb.png) - 在此处确认需要被指定的算子是否被优化了。(期望是被指定的算子都还独立存在,如果被融合为了一个算子,需要指定此时融合后的算子)。 - 4、写配置文件 diff --git a/lite/tools/build_linux.sh b/lite/tools/build_linux.sh index 7218faff6957d1ae014b33f2858efb23b2ebc0cd..5ed491cb7da7b33357b7e66ab8267e60815b5348 100755 --- a/lite/tools/build_linux.sh +++ b/lite/tools/build_linux.sh @@ -4,7 +4,7 @@ set -e ##################################################################################################### # 1. global variables, you can change them according to your requirements ##################################################################################################### -# armv7 or armv8 or armv7hf, default armv8. +# armv8 or armv7hf or armv7, default armv8. ARCH=armv8 # gcc or clang, default gcc. TOOLCHAIN=gcc @@ -203,11 +203,11 @@ function print_usage { echo -e "| ./lite/tools/build_linux.sh help |" echo -e "| |" echo -e "| optional argument: |" - echo -e "| --arch: (armv8|armv7), default is armv8 |" + echo -e "| --arch: (armv8|armv7hf|armv7), default is armv8 |" echo -e "| --toolchain: (gcc|clang), defalut is gcc |" echo -e "| --with_extra: (OFF|ON); controls whether to publish extra operators and kernels for (sequence-related model such as OCR or NLP), default is OFF |" echo -e "| --with_python: (OFF|ON); controls whether to build python lib or whl, default is OFF |" - echo -e "| --python_version: (2.7|3.5|3.7); controls python version to compile whl, default is None |" + echo -e "| --python_version: (2.7|3.5|3.7); controls python version to compile whl, default is None |" echo -e "| --with_cv: (OFF|ON); controls whether to compile cv functions into lib, default is OFF |" echo -e "| --with_log: (OFF|ON); controls whether to print log information, default is ON |" echo -e "| |" @@ -244,7 +244,7 @@ function main { # Parse command line. for i in "$@"; do case $i in - # armv7 or armv8, default armv8 + # armv8 or armv7hf or armv7, default armv8 --arch=*) ARCH="${i#*=}" shift