diff --git a/deploy/lite/export_lite.py b/deploy/lite/export_lite.py new file mode 100644 index 0000000000000000000000000000000000000000..b56aee9ee803b943473178b67f38c0f8d41a00da --- /dev/null +++ b/deploy/lite/export_lite.py @@ -0,0 +1,48 @@ +#copyright (c) 2020 PaddlePaddle Authors. All Rights Reserve. +# +#Licensed under the Apache License, Version 2.0 (the "License"); +#you may not use this file except in compliance with the License. +#You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +#Unless required by applicable law or agreed to in writing, software +#distributed under the License is distributed on an "AS IS" BASIS, +#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +#See the License for the specific language governing permissions and +#limitations under the License. + +import paddlelite.lite as lite +import os +import argparse + + +def export_lite(): + opt = lite.Opt() + model_file = os.path.join(FLAGS.model_path, '__model__') + params_file = os.path.join(FLAGS.model_path, '__params__') + opt.run_optimize("", model_file, params_file, FLAGS.place, FLAGS.save_dir) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument( + "--model_path", + type=str, + default="", + help="model path.", + required=True) + parser.add_argument( + "--place", + type=str, + default="arm", + help="preprocess config path.", + required=True) + parser.add_argument( + "--save_dir", + type=str, + default="paddlex.onnx", + help="Directory for storing the output visualization files.", + required=True) + FLAGS = parser.parse_args() + export_lite() diff --git a/docs/tutorials/deploy/deploy_lite.md b/docs/tutorials/deploy/deploy_lite.md new file mode 100644 index 0000000000000000000000000000000000000000..392e945dea2465ca4f6f40f2a131f7cad19db03a --- /dev/null +++ b/docs/tutorials/deploy/deploy_lite.md @@ -0,0 +1,23 @@ +# 移动端部署 + +step 1: 安装PaddleLite + +``` +pip install paddlelite +``` + +step 2: 将PaddleX模型导出为inference模型 + +参考[导出inference模型](deploy_server/deploy_python.html#inference)将模型导出为inference格式模型。 + +step 3: 将inference模型转换成PaddleLite模型 + +``` +python /path/to/PaddleX/deploy/lite/export_lite.py --model_path /path/to/inference_model --save_dir /path/to/onnx_model +``` + +`--model_path`用于指定inference模型的路径,`--save_dir`用于指定Lite模型的保存路径。 + +step 4: 预测 + +Lite模型预测正在集成中,即将开源... diff --git a/docs/tutorials/deploy/depoly_openvino.md b/docs/tutorials/deploy/deploy_openvino.md similarity index 68% rename from docs/tutorials/deploy/depoly_openvino.md rename to docs/tutorials/deploy/deploy_openvino.md index 30a0c3fee0a8a1052a601b0dddea3d7886a1e063..49e2cbf0fa3d98370ec8496eb555683aaeb1118d 100644 --- a/docs/tutorials/deploy/depoly_openvino.md +++ b/docs/tutorials/deploy/deploy_openvino.md @@ -1,16 +1,43 @@ -# OpenVINO 分类demo编译 - -## 说明 +# OpenVINO部署 + +## 方案简介 +OpenVINO部署方案位于目录`deploy/openvino/`下,且独立于PaddleX其他模块,该方案目前支持在 **Linux** 完成编译和部署运行。 + +PaddleX到OpenVINO的部署流程如下: + +>> PaddleX --> ONNX --> OpenVINO IR --> OpenVINO Inference Engine + +|目前支持OpenVINO部署的PaddleX模型| +|-----| +|ResNet18| +|ResNet34| +|ResNet50| +|ResNet101| +|ResNet50_vd| +|ResNet101_vd| +|ResNet50_vd_ssld| +|ResNet101_vd_ssld +|DarkNet53| +|MobileNetV1| +|MobileNetV2| +|DenseNet121| +|DenseNet161| +|DenseNet201| + +## 部署流程 +### 说明 本文档在 `Ubuntu`使用`GCC 4.8.5` 进行了验证,如果需要使用更多G++版本和平台的OpenVino编译,请参考: [OpenVINO](https://github.com/openvinotoolkit/openvino/blob/2020/build-instruction.md)。 -## 验证环境 +### 验证环境 * Ubuntu* 16.04 (64-bit) with GCC* 4.8.5 * CMake 3.12 * Python 2.7 or higher 请确保系统已经安装好上述基本软件,**下面所有示例以工作目录 `/root/projects/`演示**。 - `git clone https://github.com/PaddlePaddle/PaddleX.git` +``` + git clone https://github.com/PaddlePaddle/PaddleX.git +``` **说明**:其中`C++`预测代码在`/root/projects/PaddleX/deploy/openvino` 目录,该目录不依赖任何`PaddleX`下其他目录。 @@ -51,7 +78,7 @@ cmake .. \ -DOPENCV_DIR=${OPENCV_DIR} \ -DGFLAGS_DIR=${GFLAGS_DIR} \ -DOPENVINO_DIR=${OPENVINO_DIR} \ - -DNGRAPH_LIB=${NGRAPH_LIB} + -DNGRAPH_LIB=${NGRAPH_LIB} make ``` @@ -62,10 +89,16 @@ make ### Step3: 模型转换 -将[]()生成的onnx文件转换为OpencVINO支持的格式,请参考:[Model Optimizer文档](https://docs.openvinotoolkit.org/latest/_docs_MO_DG_Deep_Learning_Model_Optimizer_DevGuide.html) +将PaddleX模型转换成ONNX模型 + +``` +paddlex --export_onnx --model_dir=/path/to/xiaoduxiong_epoch_12 --save_dir=/path/to/onnx_model +``` + +将生成的onnx模型转换为OpencVINO支持的格式,请参考:[Model Optimizer文档](https://docs.openvinotoolkit.org/latest/_docs_MO_DG_Deep_Learning_Model_Optimizer_DevGuide.html) ### Step4: 预测 -编译成功后,预测demo的可执行程序分别为`build/classifer`,其主要命令参数说明如下: +编译成功后,预测demo的可执行程序分别为`build/detector`,其主要命令参数说明如下: | 参数 | 说明 | | ---- | ---- | @@ -75,9 +108,9 @@ make | --device | 运行的平台, 默认值为"CPU" | -## 样例 +### 样例 -可使用[小度熊识别模型](deploy.md#导出inference模型)中导出的`inference_model`和测试图片进行预测。 +可使用[小度熊识别模型](deploy_server/deploy_python.html#inference)中导出的`inference_model`和测试图片进行预测。 `样例一`: @@ -100,4 +133,3 @@ make ```shell ./build/classifier --model_dir=/path/to/models/inference_model --image_list=/root/projects/images_list.txt - ``` - diff --git a/docs/tutorials/deploy/deploy_cpp_linux.md b/docs/tutorials/deploy/deploy_server/deploy_cpp/deploy_cpp_linux.md similarity index 96% rename from docs/tutorials/deploy/deploy_cpp_linux.md rename to docs/tutorials/deploy/deploy_server/deploy_cpp/deploy_cpp_linux.md index dbce8580534fa68f8836bd2660937de8dbb5f5d0..b4edf3510ae992d72ea60e1078f22e12d54357c2 100755 --- a/docs/tutorials/deploy/deploy_cpp_linux.md +++ b/docs/tutorials/deploy/deploy_server/deploy_cpp/deploy_cpp_linux.md @@ -1,4 +1,4 @@ -# Linux平台编译指南 +# Linux平台部署 ## 说明 本文档在 `Linux`平台使用`GCC 4.8.5` 和 `GCC 4.9.4`测试过,如果需要使用更高G++版本编译使用,则需要重新编译Paddle预测库,请参考: [从源码编译Paddle预测库](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/advanced_guide/inference_deployment/inference/build_and_install_lib_cn.html#id12)。 @@ -103,6 +103,9 @@ make ``` ### Step5: 预测及可视化 + +参考[导出inference模型](../deploy_python.html#inference)将模型导出为inference格式模型。 + 编译成功后,预测demo的可执行程序分别为`build/demo/detector`,`build/demo/classifer`,`build/demo/segmenter`,用户可根据自己的模型类型选择,其主要命令参数说明如下: | 参数 | 说明 | @@ -117,7 +120,7 @@ make ## 样例 -可使用[小度熊识别模型](deploy.md#导出inference模型)中导出的`inference_model`和测试图片进行预测。 +可使用[小度熊识别模型](../deploy_python.html#inference)中导出的`inference_model`和测试图片进行预测。 `样例一`: diff --git a/docs/tutorials/deploy/deploy_cpp_win_vs2019.md b/docs/tutorials/deploy/deploy_server/deploy_cpp/deploy_cpp_win_vs2019.md similarity index 85% rename from docs/tutorials/deploy/deploy_cpp_win_vs2019.md rename to docs/tutorials/deploy/deploy_server/deploy_cpp/deploy_cpp_win_vs2019.md index 2572236c5113fa7552bf13929391bc6538d61edd..2f7c62766291410ec8e48a77b7e814edeb1523bb 100755 --- a/docs/tutorials/deploy/deploy_cpp_win_vs2019.md +++ b/docs/tutorials/deploy/deploy_server/deploy_cpp/deploy_cpp_win_vs2019.md @@ -1,4 +1,4 @@ -# Visual Studio 2019 Community CMake 编译指南 +# Windows平台部署 ## 说明 Windows 平台下,我们使用`Visual Studio 2019 Community` 进行了测试。微软从`Visual Studio 2017`开始即支持直接管理`CMake`跨平台编译项目,但是直到`2019`才提供了稳定和完全的支持,所以如果你想使用CMake管理项目编译构建,我们推荐你使用`Visual Studio 2019`环境下构建。 @@ -62,19 +62,19 @@ PaddlePaddle C++ 预测库针对不同的`CPU`,`CUDA`,以及是否支持Tens 1. 打开Visual Studio 2019 Community,点击`继续但无需代码` -![step2](images/vs2019_step1.png) +![step2](../../images/vs2019_step1.png) 2. 点击: `文件`->`打开`->`CMake` -![step2.1](images/vs2019_step2.png) +![step2.1](../../images/vs2019_step2.png) 选择项目代码所在路径,并打开`CMakeList.txt`: -![step2.2](images/vs2019_step3.png) +![step2.2](../../images/vs2019_step3.png) 3. 点击:`项目`->`PADDLEX_INFERENCE的CMake设置` -![step3](images/vs2019_step4.png) +![step3](../../images/vs2019_step4.png) 4. 点击`浏览`,分别设置编译选项指定`CUDA`、`OpenCV`、`Paddle预测库`的路径 @@ -88,17 +88,19 @@ PaddlePaddle C++ 预测库针对不同的`CPU`,`CUDA`,以及是否支持Tens **注意:** 1. 使用`CPU`版预测库,请把`WITH_GPU`的`值`去掉勾 2. 如果使用的是`openblas`版本,请把`WITH_MKL`的`值`去掉勾 -![step4](images/vs2019_step5.png) +![step4](../../images/vs2019_step5.png) **设置完成后**, 点击上图中`保存并生成CMake缓存以加载变量`。 5. 点击`生成`->`全部生成` -![step6](images/vs2019_step6.png) +![step6](../../images/vs2019_step6.png) ### Step5: 预测及可视化 +参考[导出inference模型](../deploy_python.html#inference)将模型导出为inference格式模型。 + 上述`Visual Studio 2019`编译产出的可执行文件在`out\build\x64-Release`目录下,打开`cmd`,并切换到该目录: ``` @@ -106,7 +108,7 @@ d: cd D:\projects\PaddleX\deploy\cpp\out\build\x64-Release ``` -编译成功后,预测demo的入口程序为`demo\detector`,`demo\classifer`,`demo\segmenter`,用户可根据自己的模型类型选择,其主要命令参数说明如下: +编译成功后,预测demo的入口程序为`paddlex_inference\detector.exe`,`paddlex_inference\classifer.exe`,`paddlex_inference\segmenter.exe`,用户可根据自己的模型类型选择,其主要命令参数说明如下: | 参数 | 说明 | | ---- | ---- | @@ -120,14 +122,14 @@ cd D:\projects\PaddleX\deploy\cpp\out\build\x64-Release ## 样例 -可使用[小度熊识别模型](deploy.md#导出inference模型)中导出的`inference_model`和测试图片进行预测。 +可使用[小度熊识别模型](../deploy_python.html#inference)中导出的`inference_model`和测试图片进行预测。 `样例一`: 不使用`GPU`测试图片 `\\path\\to\\xiaoduxiong.jpeg` ```shell -.\detector --model_dir=\\path\\to\\inference_model --image=D:\\images\\xiaoduxiong.jpeg --save_dir=output +.\\paddlex_inference\\detector.exe --model_dir=\\path\\to\\inference_model --image=D:\\images\\xiaoduxiong.jpeg --save_dir=output ``` 图片文件`可视化预测结果`会保存在`save_dir`参数设置的目录下。 @@ -143,6 +145,6 @@ cd D:\projects\PaddleX\deploy\cpp\out\build\x64-Release \\path\\to\\images\\xiaoduxiongn.jpeg ``` ```shell -.\detector --model_dir=\\path\\to\\inference_model --image_list=\\path\\to\\images_list.txt --use_gpu=1 --save_dir=output +.\\paddlex_inference\\detector.exe --model_dir=\\path\\to\\inference_model --image_list=\\path\\to\\images_list.txt --use_gpu=1 --save_dir=output ``` 图片文件`可视化预测结果`会保存在`save_dir`参数设置的目录下。 diff --git a/docs/tutorials/deploy/encryption.md b/docs/tutorials/deploy/deploy_server/deploy_cpp/encryption.md similarity index 82% rename from docs/tutorials/deploy/encryption.md rename to docs/tutorials/deploy/deploy_server/deploy_cpp/encryption.md index 74d4dd450e5b1920989d807f073abc76bb923f22..1551693a64321452619617824a74410352a3b9d0 100644 --- a/docs/tutorials/deploy/encryption.md +++ b/docs/tutorials/deploy/deploy_server/deploy_cpp/encryption.md @@ -1,4 +1,4 @@ -# Paddle模型加密方案 +# 模型加密 飞桨团队推出模型加密方案,使用业内主流的AES加密技术对最终模型进行加密。飞桨用户可以通过PaddleX导出模型后,使用该方案对模型进行加密,预测时使用解密SDK进行模型解密并完成推理,大大提升AI应用安全性和开发效率。 @@ -29,8 +29,8 @@ paddlex-encryption ./paddlex-encryption/tool/paddlex_encrypt_tool -model_dir /path/to/paddlex_inference_model -save_dir /path/to/paddlex_encrypted_model ``` -`-model_dir`用于指定inference模型路径,可使用[导出小度熊识别模型](deploy.md#导出inference模型)中导出的`inference_model`。加密完成后,加密过的模型会保存至指定的`-save_dir`下,包含`__model__.encrypted`、`__params__.encrypted`和`model.yml`三个文件,同时生成密钥信息,命令输出如下图所示,密钥为`kLAl1qOs5uRbFt0/RrIDTZW2+tOf5bzvUIaHGF8lJ1c=` -![](images/encryt.png) +`-model_dir`用于指定inference模型路径(参考[导出inference模型](../deploy_python.html#inference)将模型导出为inference格式模型),可使用[导出小度熊识别模型](../deploy_python.html#inference)中导出的`inference_model`。加密完成后,加密过的模型会保存至指定的`-save_dir`下,包含`__model__.encrypted`、`__params__.encrypted`和`model.yml`三个文件,同时生成密钥信息,命令输出如下图所示,密钥为`kLAl1qOs5uRbFt0/RrIDTZW2+tOf5bzvUIaHGF8lJ1c=` +![](../../images/encrypt.png) ## 2. PaddleX C++加密部署 @@ -50,7 +50,7 @@ paddlex-encryption ## 样例 -可使用[导出小度熊识别模型](deploy.md#导出inference模型)中的测试图片进行预测。 +可使用[导出小度熊识别模型](../deploy_python.html#inference)中的测试图片进行预测。 `样例一`: diff --git a/docs/tutorials/deploy/deploy_server/deploy_cpp/index.rst b/docs/tutorials/deploy/deploy_server/deploy_cpp/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..9bbb1134825908c2aa215aad97aca0d184759589 --- /dev/null +++ b/docs/tutorials/deploy/deploy_server/deploy_cpp/index.rst @@ -0,0 +1,12 @@ +C++部署 +============== + + +C++部署方案位于目录PaddleX/deploy/cpp/下,且独立于PaddleX其他模块。该方案支持在 Windows 和 Linux 完成编译、二次开发集成和部署运行,支持在Linux上完成加密部署。 + +.. toctree:: + :maxdepth: 1 + + deploy_cpp_win_vs2019.md + deploy_cpp_linux.md + encryption.md diff --git a/docs/tutorials/deploy/deploy.md b/docs/tutorials/deploy/deploy_server/deploy_python.md old mode 100755 new mode 100644 similarity index 55% rename from docs/tutorials/deploy/deploy.md rename to docs/tutorials/deploy/deploy_server/deploy_python.md index 7193dc3de315b43c85f3aa3d8ff24c7b02f98f3b..c597f87cdbbc208ad2b72a8305642da41b9be5cd --- a/docs/tutorials/deploy/deploy.md +++ b/docs/tutorials/deploy/deploy_server/deploy_python.md @@ -1,10 +1,7 @@ -# 模型预测部署 +# Python部署 +PaddleX已经集成了基于Python的高性能预测接口,在安装PaddleX后,可参照如下代码示例,进行预测。相关的接口文档可参考[paddlex.deploy](../../../apis/deploy.md) -本文档指引用户如何采用更高性能地方式来部署使用PaddleX训练的模型。使用本文档模型部署方式,会在模型运算过程中,对模型计算图进行优化,同时减少内存操作,相对比普通的paddlepaddle模型加载和预测方式,预测速度平均可提升1倍,具体各模型性能对比见[预测性能对比](#预测性能对比) - -## 服务端部署 - -### 导出inference模型 +## 导出inference模型 在服务端部署的模型需要首先将模型导出为inference格式模型,导出的模型将包括`__model__`、`__params__`和`model.yml`三个文名,分别为模型的网络结构,模型权重和模型的配置文件(包括数据预处理参数等等)。在安装完PaddleX后,在命令行终端使用如下命令导出模型到当前目录`inferece_model`下。 > 可直接下载小度熊分拣模型测试本文档的流程[xiaoduxiong_epoch_12.tar.gz](https://bj.bcebos.com/paddlex/models/xiaoduxiong_epoch_12.tar.gz) @@ -22,59 +19,17 @@ paddlex --export_inference --model_dir=./xiaoduxiong_epoch_12 --save_dir=./infer paddlex --export_inference --model_dir=./xiaoduxiong_epoch_12 --save_dir=./inference_model --fixed_input_shape=[640,960] ``` -### Python部署 -PaddleX已经集成了基于Python的高性能预测接口,在安装PaddleX后,可参照如下代码示例,进行预测。相关的接口文档可参考[paddlex.deploy](apis/deploy.md) +## 预测部署 > 点击下载测试图片 [xiaoduxiong_test_image.tar.gz](https://bj.bcebos.com/paddlex/datasets/xiaoduxiong_test_image.tar.gz) ``` import paddlex as pdx -predictor = pdx.deploy.create_predictor('./inference_model') +predictor = pdx.deploy.Predictor('./inference_model') result = predictor.predict(image='xiaoduxiong_test_image/JPEGImages/WeChatIMG110.jpeg') ``` -### C++部署 - -C++部署方案位于目录`deploy/cpp/`下,且独立于PaddleX其他模块。该方案支持在 Windows 和 Linux 完成编译、二次开发集成和部署运行。具体使用方法和编译: - -- Linux平台:[linux](deploy_cpp_linux.md) -- window平台:[windows](deploy_cpp_win_vs2019.md) - -### OpenVINO部署demo - -OpenVINO部署demo位于目录`deploy/openvino/`下,且独立于PaddleX其他模块,该demo目前支持在 Linux 完成编译和部署运行。目前PaddleX到OpenVINO的部署流程如下: - -graph LR - PaddleX --> ONNX --> OpenVINO IR --> OpenVINO Inference Engine -#### step1 - -PaddleX输出ONNX模型方法如下: - -``` -paddlex --export_onnx --model_dir=./xiaoduxiong_epoch_12 --save_dir=./onnx_model -``` - -|目前支持的模型| -|-----| -|ResNet18| -|ResNet34| -|ResNet50| -|ResNet101| -|ResNet50_vd| -|ResNet101_vd| -|ResNet50_vd_ssld| -|ResNet101_vd_ssld -|DarkNet53| -|MobileNetV1| -|MobileNetV2| -|DenseNet121| -|DenseNet161| -|DenseNet201| - -得到ONNX模型后,OpenVINO的部署参考:[OpenVINO部署](deploy_openvino.md) - -### 预测性能对比 - -#### 测试环境 +## 预测性能对比 +### 测试环境 - CUDA 9.0 - CUDNN 7.5 @@ -84,6 +39,9 @@ paddlex --export_onnx --model_dir=./xiaoduxiong_epoch_12 --save_dir=./onnx_model - Executor 指采用paddlepaddle普通的python预测方式 - Batch Size均为1,耗时单位为ms/image,只计算模型运行时间,不包括数据的预处理和后处理 +### 性能对比 + + | 模型 | AnalysisPredictor耗时 | Executor耗时 | 输入图像大小 | | :---- | :--------------------- | :------------ | :------------ | | resnet50 | 4.84 | 7.57 | 224*224 | @@ -95,7 +53,3 @@ paddlex --export_onnx --model_dir=./xiaoduxiong_epoch_12 --save_dir=./onnx_model | faster_rcnn_r50_1x | 326.11 | 347.22 | 800*1067 | | mask_rcnn_r50_fpn_1x | 67.49 | 91.02 | 800*1088 | | mask_rcnn_r50_1x | 326.11 | 350.94 | 800*1067 | - -## 移动端部署 - -> Lite模型导出正在集成中,即将开源... diff --git a/docs/tutorials/deploy/deploy_server/index.rst b/docs/tutorials/deploy/deploy_server/index.rst new file mode 100644 index 0000000000000000000000000000000000000000..e9635c0532bc56f3073a78f615c21019a699c68f --- /dev/null +++ b/docs/tutorials/deploy/deploy_server/index.rst @@ -0,0 +1,9 @@ +服务端部署 +============== + +.. toctree:: + :maxdepth: 2 + + deploy_python.md + deploy_cpp/index.rst + encryption.md diff --git a/docs/tutorials/deploy/images/vs2019_step4.png b/docs/tutorials/deploy/images/vs2019_step4.png old mode 100755 new mode 100644 index 102cb81ac911c810bdf24e86b42ece307ffd1f8a..74fe7b224dc9b3533066111ab2a9cd877a5bbc68 Binary files a/docs/tutorials/deploy/images/vs2019_step4.png and b/docs/tutorials/deploy/images/vs2019_step4.png differ diff --git a/docs/tutorials/deploy/index.rst b/docs/tutorials/deploy/index.rst index 2aa5e1d61db4fa3901da833b2b3c2bb112fce491..084447c9506ac956e18ecbf40d158c89b80e300c 100644 --- a/docs/tutorials/deploy/index.rst +++ b/docs/tutorials/deploy/index.rst @@ -1,8 +1,11 @@ 多端部署 ============== +本文档指引用户如何采用更高性能地方式来部署使用PaddleX训练的模型。使用本文档模型部署方式,会在模型运算过程中,对模型计算图进行优化,同时减少内存操作,相对比普通的paddlepaddle模型加载和预测方式,预测速度平均可提升1倍,具体各模型性能对比见服务端Python部署的预测性能对比章节。 + .. toctree:: :maxdepth: 2 - :caption: 文档目录: - + deploy_server/index.rst + deploy_openvino.md + deploy_lite.md