Support Python deployment on Huawei Ascend NPU

This commit is contained in:
yunyaoXYY
2022-12-07 13:15:26 +00:00
parent e791c5e8b7
commit a4dcef9f66
10 changed files with 130 additions and 7 deletions

View File

@@ -66,6 +66,7 @@ option(ENABLE_TEXT "Whether to enable text models usage." OFF)
option(ENABLE_FLYCV "Whether to enable flycv to boost image preprocess." OFF)
option(ENABLE_TIMVX "Whether to compile for TIMVX deploy." OFF)
option(WITH_CANN "Whether to compile for Huawei Ascend deploy with CANN." OFF)
option(WITH_CANN_PY "Whether to compile for Huawei Ascend deploy with CANN using python." OFF)
option(WITH_TESTING "Whether to compile with unittest." OFF)
############################# Options for Android cross compiling #########################
option(WITH_OPENCV_STATIC "Use OpenCV static lib for Android." OFF)
@@ -143,7 +144,6 @@ if (ENABLE_TIMVX)
include(${PROJECT_SOURCE_DIR}/cmake/timvx.cmake)
endif()
if (WITH_CANN)
if(NOT ${ENABLE_LITE_BACKEND})
message(WARNING "While compiling with -DWITH_CANN=ON, will force to set -DENABLE_LITE_BACKEND=ON")
@@ -151,6 +151,22 @@ if (WITH_CANN)
endif()
endif()
if (WITH_CANN_PY)
message(WARNING "This is only for CANN python version")
if(NOT ${ENABLE_LITE_BACKEND})
set(ENABLE_LITE_BACKEND ON)
endif()
execute_process(COMMAND sh -c "ls *.so*" WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/third_libs/install/paddlelite/lib
COMMAND sh -c "xargs ${PATCHELF_EXE} --set-rpath '$ORIGIN'" WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/third_libs/install/paddlelite/lib
RESULT_VARIABLE result
OUTPUT_VARIABLE curr_out
ERROR_VARIABLE curr_out)
if(ret EQUAL "1")
message(FATAL_ERROR "Failed to patchelf tensorrt libraries.")
endif()
message(STATUS "result:${result} out:${curr_out}")
endif()
if(ANDROID OR IOS)
if(ENABLE_ORT_BACKEND)

View File

@@ -60,8 +60,11 @@ else() # Linux
if(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "aarch64")
if(WITH_CANN)
set(PADDLELITE_URL "https://bj.bcebos.com/fastdeploy/test/lite-linux_arm64_huawei_ascend_npu_1121.tgz")
elseif(WITH_CANN_PY)
set(PADDLELITE_URL "https://bj.bcebos.com/fastdeploy/test/lite-linux_arm64_huawei_ascend_npu_python_1207.tgz")
else()
set(PADDLELITE_URL "${PADDLELITE_URL_PREFIX}/lite-linux-arm64-20220920.tgz")
endif()
else()
if(ENABLE_TIMVX)
set(PADDLELITE_URL "https://bj.bcebos.com/fastdeploy/test/lite-linux_armhf_1130.tgz")

View File

@@ -37,6 +37,8 @@ function(fastdeploy_summary)
message(STATUS " ENABLE_POROS_BACKEND : ${ENABLE_POROS_BACKEND}")
message(STATUS " ENABLE_TRT_BACKEND : ${ENABLE_TRT_BACKEND}")
message(STATUS " ENABLE_OPENVINO_BACKEND : ${ENABLE_OPENVINO_BACKEND}")
message(STATUS " WITH_CANN : ${WITH_CANN}")
message(STATUS " WITH_CANN_PY : ${WITH_CANN_PY}")
if(ENABLE_ORT_BACKEND)
message(STATUS " ONNXRuntime version : ${ONNXRUNTIME_VERSION}")
endif()

View File

@@ -22,6 +22,7 @@
| ENABLE_PADDLE_BACKEND | 默认OFF是否编译集成Paddle Inference后端(CPU/GPU上推荐打开) |
| ENABLE_LITE_BACKEND | 默认OFF是否编译集成Paddle Lite后端(编译Android库时需要设置为ON) |
| ENABLE_RKNPU2_BACKEND | 默认OFF是否编译集成RKNPU2后端(RK3588/RK3568/RK3566上推荐打开) |
| WITH_CANN | 默认OFF当在华为昇腾NPU上部署时, 需要设置为ON |
| ENABLE_TIMVX | 默认OFF需要在RV1126/RV1109上部署时需设置为ON |
| ENABLE_TRT_BACKEND | 默认OFF是否编译集成TensorRT后端(GPU上推荐打开) |
| ENABLE_OPENVINO_BACKEND | 默认OFF是否编译集成OpenVINO后端(CPU上推荐打开) |

View File

@@ -3,7 +3,7 @@
FastDeploy基于 Paddle-Lite 后端支持在华为昇腾NPU上进行部署推理。
更多详细的信息请参考:[PaddleLite部署示例](https://github.com/PaddlePaddle/Paddle-Lite/blob/develop/docs/demo_guides/huawei_ascend_npu.md)。
本文档介绍如何在ARM Linux操作系统环境下, 编译基于 PaddleLite 的 C++ FastDeploy 源码, 生成目标硬件为华为昇腾NPU的预测库。
本文档介绍如何在ARM Linux操作系统环境下, 编译基于 PaddleLite 的 C++ 与 Python 的FastDeploy源码, 生成目标硬件为华为昇腾NPU的预测库。
更多编译选项请参考[FastDeploy编译选项说明](./README.md)
@@ -60,7 +60,7 @@ $ npu-smi info
- 如果用户在Docker内想使用其他的CANN版本,请自行更新 Dockerfile 文件内的 CANN 下载路径, 同时更新相应的驱动和固件. 当前Dockerfile内默认为[CANN 5.1.RC2](https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/CANN/CANN%205.1.RC2/Ascend-cann-toolkit_5.1.RC2_linux-aarch64.run).
- 如果用户不想使用docker可以参考由PaddleLite提供的[ARM Linux环境下的编译环境准备](https://github.com/PaddlePaddle/Paddle-Lite/blob/develop/docs/source_compile/arm_linux_compile_arm_linux.rst)自行配置编译环境, 之后再自行下载并安装相应的CANN软件包来完成配置.
## 三.基于 PaddleLite 的 FastDeploy 库编译
## 三.基于 PaddleLite 的 C++ FastDeploy 库编译
搭建好编译环境之后,编译命令如下:
```bash
# Download the latest source code
@@ -80,4 +80,20 @@ make install
```
编译完成之后会在当前的build目录下生成 fastdeploy-cann 目录,表示基于 PadddleLite CANN 的 FastDeploy 库编译完成。
华为昇腾NPU 上部署 PaddleClas 分类模型请参考:[PaddleClas 华为升腾NPU C++ 部署示例](../../../examples/vision/classification/paddleclas/ascend/README.md)
## 四.基于 PaddleLite 的 Python FastDeploy 库编译
搭建好编译环境之后,编译命令如下:
```bash
# Download the latest source code
git clone https://github.com/PaddlePaddle/FastDeploy.git
cd FastDeploy/python
export WITH_CANN_PY=ON
export ENABLE_VISION=ON
python setup.py build
python setup.py bdist_wheel
#编译完成后,请用户自行安装当前目录的dist文件夹内的whl包.
```
华为昇腾NPU 上使用C++部署 PaddleClas 分类模型请参考:[PaddleClas 华为升腾NPU C++ 部署示例](../../../examples/vision/classification/paddleclas/ascend/cpp/README.md)
华为昇腾NPU 上使用Python部署 PaddleClas 分类模型请参考:[PaddleClas 华为升腾NPU Python 部署示例](../../../examples/vision/classification/paddleclas/ascend/python/README.md)

View File

@@ -0,0 +1,9 @@
# PaddleClas 分类模型在华为昇腾NPU 上的部署
目前 FastDeploy 已经支持在华为昇腾 NPU 上, 基于 PaddleLite 部署 PaddleClas 模型.
## 详细部署文档
在华为昇腾NPU 上支持 Python 和 C++ 的部署。
- [C++部署](./cpp)
- [Python部署](./python)

View File

@@ -1,14 +1,14 @@
# PaddleClas Ascend NPU C++ 部署示例
# PaddleClas 华为昇腾 NPU C++ 部署示例
本目录下提供的 `infer.cc`,可以帮助用户快速完成 PaddleClas 模型在华为昇腾NPU上的部署.
本例在鲲鹏920+Atlas 300I Pro的硬件平台下完成测试.(目前暂不支持 X86 CPU的Linux系统部署)
## 部署准备
### 华为昇腾NPU 部署环境编译准备
- 1. 软硬件环境满足要求以及华为昇腾NPU的部署编译环境的准备请参考[FastDeploy 华为昇腾NPU部署环境编译准备](../../../../../../docs/cn/build_and_install/ascend.md)
- 1. 软硬件环境满足要求以及华为昇腾NPU的部署编译环境的准备请参考[FastDeploy 华为昇腾NPU部署环境编译准备](../../../../../../docs/cn/build_and_install/huawei_ascend.md.md)
## 在 华为昇腾NPU 上部署ResNet50_Vd分类模型
请按照以下步骤完成在 华为昇腾NPU 上部署 ResNet50_Vd 模型:
1. 完成[华为昇腾NPU 部署环境编译准备](../../../../../../docs/cn/build_and_install/ascend.md)
1. 完成[华为昇腾NPU 部署环境编译准备](../../../../../../docs/cn/build_and_install/huawei_ascend.md.md)
2. 编译当前demo, 并完成部署:
```bash

View File

@@ -0,0 +1,32 @@
# PaddleClas 华为昇腾 NPU Python 部署示例
本目录下提供的 `infer.py`,可以帮助用户快速完成 PaddleClas 模型在华为昇腾NPU上的部署.
本例在鲲鹏920+Atlas 300I Pro的硬件平台下完成测试.(目前暂不支持 X86 CPU的Linux系统部署)
## 部署准备
### 华为昇腾 NPU 部署环境编译准备
- 1. 软硬件环境满足要求以及华为昇腾NPU的部署编译环境的准备请参考[FastDeploy 华为昇腾NPU部署环境编译准备](../../../../../../docs/cn/build_and_install/huawei_ascend.md.md)
## 在 华为昇腾NPU 上部署ResNet50_Vd分类模型
请按照以下步骤完成在 华为昇腾NPU 上部署 ResNet50_Vd 模型:
1. 完成[华为昇腾NPU 部署环境编译准备](../../../../../../docs/cn/build_and_install/huawei_ascend.md.md)
2. 运行以下命令完成部署:
```bash
# 下载模型
wget https://bj.bcebos.com/paddlehub/fastdeploy/ResNet50_vd_infer.tgz
tar -xvf ResNet50_vd_infer.tgz
# 下载图片
wget https://gitee.com/paddlepaddle/PaddleClas/raw/release/2.4/deploy/images/ImageNet/ILSVRC2012_val_00000010.jpeg
# 运行程序
python infer.py --model ResNet50_vd_infer --image ILSVRC2012_val_00000010.jpeg
```
部署成功后输出结果如下:
```bash
ClassifyResult(
label_ids: 153,
scores: 0.685547,
)
#此结果出现后,前后还会出现一些华为昇腾自带的log信息,属正常现象.
```

View File

@@ -0,0 +1,43 @@
from pickletools import optimize
import fastdeploy as fd
import cv2
import os
def parse_arguments():
import argparse
import ast
parser = argparse.ArgumentParser()
parser.add_argument(
"--model", required=True, help="Path of PaddleClas model.")
parser.add_argument(
"--image", type=str, required=True, help="Path of test image file.")
parser.add_argument(
"--topk", type=int, default=1, help="Return topk results.")
return parser.parse_args()
def build_option():
option = fd.RuntimeOption()
option.use_cann()
option.set_lite_nnadapter_device_names(["huawei_ascend_npu"])
return option
args = parse_arguments()
# 配置runtime加载模型
runtime_option = build_option()
model_file = os.path.join(args.model, "inference.pdmodel")
params_file = os.path.join(args.model, "inference.pdiparams")
config_file = os.path.join(args.model, "inference_cls.yaml")
model = fd.vision.classification.PaddleClasModel(
model_file, params_file, config_file, runtime_option=runtime_option)
# 预测图片分类结果
im = cv2.imread(args.image)
result = model.predict(im, args.topk)
print(result)

View File

@@ -57,6 +57,7 @@ setup_configs = dict()
setup_configs["ENABLE_RKNPU2_BACKEND"] = os.getenv("ENABLE_RKNPU2_BACKEND",
"OFF")
setup_configs["WITH_CANN"] = os.getenv("WITH_CANN", "OFF")
setup_configs["WITH_CANN_PY"] = os.getenv("WITH_CANN_PY", "OFF")
setup_configs["ENABLE_ORT_BACKEND"] = os.getenv("ENABLE_ORT_BACKEND", "OFF")
setup_configs["ENABLE_OPENVINO_BACKEND"] = os.getenv("ENABLE_OPENVINO_BACKEND",
"OFF")