未验证 提交 48510577 编写于 作者: Z zhupengyang 提交者: GitHub

npu benchmark doc (#3748)

上级 15e7915d
......@@ -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|
......@@ -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=<path-to-ai_ddk_lib>
# 其它选项可以通过 "./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、写配置文件
......
......@@ -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,7 +203,7 @@ 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 |"
......@@ -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
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册