diff --git a/tutorials/mobilenetv3_prod/Step6/README.md b/tutorials/mobilenetv3_prod/Step6/README.md index 6726da7e26edf20ea410424df269668717edb5d3..a844be97b6a1cbdf07cec7aabc835da6ad2e7d8f 100644 --- a/tutorials/mobilenetv3_prod/Step6/README.md +++ b/tutorials/mobilenetv3_prod/Step6/README.md @@ -23,8 +23,6 @@ MobileNetV3 是 2019 年提出的一种基于 NAS 的新的轻量级网络,为了进一步提升效果,将 relu 和 sigmoid 激活函数分别替换为 hard_swish 与 hard_sigmoid 激活函数,同时引入了一些专门减小网络计算量的改进策略,最终性能超越了当时其他的轻量级骨干网络。 - - **论文:** [Searching for MobileNetV3](https://arxiv.org/abs/1905.02244) **参考repo:** [https://github.com/pytorch/vision](https://github.com/pytorch/vision) @@ -50,7 +48,8 @@ MobileNetV3 是 2019 年提出的一种基于 NAS 的新的轻量级网络,为 | 模型 | top1/5 acc (参考精度) | top1/5 acc (复现精度) | 下载链接 | |:---------:|:------:|:----------:|:----------:| -| MobileNetV3_small | 0.602/ | 0.601/0.826 | [预训练模型](https://paddle-model-ecology.bj.bcebos.com/model/mobilenetv3_reprod/mobilenet_v3_small_pretrained.pdparams) \| [Inference模型](https://paddle-model-ecology.bj.bcebos.com/model/mobilenetv3_reprod/mobilenet_v3_small_infer.tar) \| [日志](https://paddle-model-ecology.bj.bcebos.com/model/mobilenetv3_reprod/train_mobilenet_v3_small.log) | +| MobileNetV3_small | 0.602/- | 0.601/0.826 | [预训练模型](https://paddle-model-ecology.bj.bcebos.com/model/mobilenetv3_reprod/mobilenet_v3_small_pretrained.pdparams) \| [Inference模型](https://paddle-model-ecology.bj.bcebos.com/model/mobilenetv3_reprod/mobilenet_v3_small_infer.tar) \| [日志](https://paddle-model-ecology.bj.bcebos.com/model/mobilenetv3_reprod/train_mobilenet_v3_small.log) | + @@ -168,7 +167,14 @@ python3 -m paddle.distributed.launch --gpus="0,1,2,3" train.py --data-path="./IL 更多配置参数可以参考[train.py](./train.py)的`get_args_parser`函数。 -DCU运行需要设置环境变量 `export HIP_VISIBLE_DEVICES=0,1,2,3`,启动命令与Linux GPU完全相同。 +* 注意:本文档主要介绍Linux上的基础训练推理过程,如果希望获得更多方法的训练方法,可以参考: + * [混合精度训练教程](docs/train_amp_infer_python.md) + * [多机多卡训练教程](docs/train_fleet_infer_python.md) + * [PACT在线量化训练教程](docs/train_pact_infer_python.md) + * [Windows平台训练教程](docs/windows_train_infer_python.md) + * DCU设备上运行需要设置环境变量 `export HIP_VISIBLE_DEVICES=0,1,2,3`,其余训练评估预测命令与Linux GPU完全相同。 + + @@ -218,7 +224,14 @@ python tools/predict.py --pretrained=./mobilenet_v3_small_pretrained.pdparams -- ## 5. 模型推理部署 -coming soon! +* 基于Paddle Inference的推理过程可以参考:[MobilenetV3 的 Inference 推理教程](./deploy/inference_python/README.md)。 +* 基于Paddle Serving的服务化部署过程可以参考:[MobilenetV3 的 Serving 服务化部署](./deploy/serving_python/README.md)。 +* 基于Paddle Lite的推理过程可以参考[MobilenetV3 基于 ARM CPU 部署急教程](./deploy/lite_infer_cpp_arm_cpu/README.md)。 +* 基于Paddle2ONNX的推理过程可以参考:[MobilenetV3 基于 Paddle2ONNX 的推理教程](./deploy/onnx_python/README.md)。 +* 基于PaddleSlim的离线量化过程可以参考:[MobilenetV3 离线量化教程](./deploy/ptq_python/README.md) + + + diff --git a/tutorials/mobilenetv3_prod/Step6/deploy/lite_infer_cpp_arm_cpu/README.md b/tutorials/mobilenetv3_prod/Step6/deploy/lite_infer_cpp_arm_cpu/README.md index 5e62bf6fc2c440610d3e1f085f11b33ce1b91e50..ccff9968e2e14d805ea13c9baa3e2d7c4119324e 100644 --- a/tutorials/mobilenetv3_prod/Step6/deploy/lite_infer_cpp_arm_cpu/README.md +++ b/tutorials/mobilenetv3_prod/Step6/deploy/lite_infer_cpp_arm_cpu/README.md @@ -1,4 +1,4 @@ -# Mobilenet_v3 在 ARM CPU 上部署示例 +# Mobilenet_v3 基于 ARM CPU 部署 # 目录 @@ -10,11 +10,11 @@ ### 1 获取 inference model -提供以下两种方式获取 inference model +提供以下两种方式获取 inference model - 直接下载(推荐):[inference model](https://paddle-model-ecology.bj.bcebos.com/model/mobilenetv3_reprod/mobilenet_v3_small_infer.tar) -- 通过预训练模型获取 +- 通过预训练模型获取 首先获取[预训练模型](https://paddle-model-ecology.bj.bcebos.com/model/mobilenetv3_reprod/mobilenet_v3_small_pretrained.pdparams),在 ```models/tutorials/mobilenetv3_prod/Step6/tools``` 文件夹下提供了工具 export_model.py ,可以将预训练模型输出 为inference model ,运行如下命令即可获取 inference model。 ``` @@ -25,7 +25,7 @@ python ./tools/export_model.py --pretrained=./mobilenet_v3_small_pretrained.pdpa ### 2 准备模型转换工具并生成 Paddle Lite 的部署模型 -- python 脚本方式 +- python 脚本方式 适用于 ``` python == 3.5\3.6\3.7 ``` 首先 pip 安装 Paddle Lite: @@ -41,7 +41,7 @@ python export_lite_model.py --model-file=./mobilenet_v3_small_infer/inference.pd ``` 在当前文件夹下会生成mobilenet_v3_small.nb文件。 -- 终端命令方式 +- 终端命令方式 模型转换工具[opt_linux](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.10/opt_linux)、[opt_mac](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.10/opt_mac)。或者参考[文档](https://paddle-lite.readthedocs.io/zh/develop/user_guides/model_optimize_tool.html)编译您的模型转换工具,使用如下命令转换可以转换 inference model 到 Paddle Lite 的 nb 模型: @@ -65,9 +65,9 @@ python export_lite_model.py --model-file=./mobilenet_v3_small_infer/inference.pd - 准备编译环境 ``` -gcc、g++(推荐版本为 8.2.0) -git、make、wget、python、adb -Java Environment +gcc、g++(推荐版本为 8.2.0) +git、make、wget、python、adb +Java Environment CMake(请使用 3.10 版本,其他版本的 Cmake 可能有兼容性问题,导致编译不通过) Android NDK(支持 ndk-r17c 及之后的所有 NDK 版本, 注意从 ndk-r18 开始,NDK 交叉编译工具仅支持 Clang, 不支持 GCC) ``` @@ -105,7 +105,7 @@ Android NDK(支持 ndk-r17c 及之后的所有 NDK 版本, 注意从 ndk-r18 可以使用下面两种方式获得预测库。 -(1) 使用预编译包 +(1) 使用预编译包 推荐使用 Paddle Lite 仓库提供的 [release库](https://github.com/PaddlePaddle/Paddle-Lite/releases/tag/v2.10),在网页最下边选取要使用的库(注意本教程需要用 static 的库),例如这个[预编译库](https://github.com/PaddlePaddle/Paddle-Lite/releases/download/v2.10/inference_lite_lib.android.armv8.clang.c++_static.tar.gz)。 @@ -115,7 +115,7 @@ tar -xvzf inference_lite_lib.android.armv8.tar.gz ``` 即可获取编译好的库。注意,即使获取编译好的库依然要进行上述**环境安装**的步骤,因为下面编译 demo 时候会用到。 -(2) 编译预测库 +(2) 编译预测库 运行编译脚本之前,请先检查系统环境变量 ``NDK_ROOT`` 指向正确的 Android NDK 安装路径。 之后可以下载并构建 Paddle Lite 编译包。 @@ -205,7 +205,7 @@ adb devices 可以看到有输出 ``` List of devices attached -1ddcf602 device +1ddcf602 device ``` - 在手机上运行 mobilenet_v3 demo。 @@ -236,18 +236,18 @@ adb push ./demo.jpg /data/local/tmp/arm_cpu/ adb shell "export LD_LIBRARY_PATH=/data/local/tmp/arm_cpu/; \ /data/local/tmp/arm_cpu/mobilenet_v3 \ /data/local/tmp/arm_cpu/config.txt \ - /data/local/tmp/arm_cpu/demo.jpg" + /data/local/tmp/arm_cpu/demo.jpg" ``` 得到以下输出: ``` ===clas result for image: /data/local/tmp/arm_cpu/demo.jpg=== - Top-1, class_id: 8, class_name: hen, score: 0.901639 - Top-2, class_id: 7, class_name: cock, score: 0.0970001 - Top-3, class_id: 86, class_name: partridge, score: 0.000225853 - Top-4, class_id: 80, class_name: black grouse, score: 0.0001647 - Top-5, class_id: 21, class_name: kite, score: 0.000128394 + Top-1, class_id: 8, class_name: hen, score: 0.901639 + Top-2, class_id: 7, class_name: cock, score: 0.0970001 + Top-3, class_id: 86, class_name: partridge, score: 0.000225853 + Top-4, class_id: 80, class_name: black grouse, score: 0.0001647 + Top-5, class_id: 21, class_name: kite, score: 0.000128394 ``` 代表在 Android 手机上推理部署完成。 diff --git a/tutorials/mobilenetv3_prod/Step6/deploy/onnx_python/README.md b/tutorials/mobilenetv3_prod/Step6/deploy/onnx_python/README.md index 1752b25c2dbdca1fc132394ae0216c78dffb2148..084e986a8a75cb767e0630b95aca21ec177a3c56 100644 --- a/tutorials/mobilenetv3_prod/Step6/deploy/onnx_python/README.md +++ b/tutorials/mobilenetv3_prod/Step6/deploy/onnx_python/README.md @@ -66,15 +66,15 @@ mobilenet_v3_small_infer 使用 Paddle2ONNX 将Paddle静态图模型转换为ONNX模型格式: ``` -paddle2onnx --model_dir=./mobilenetv3_model/ \ ---model_filename=inference.pdmodel \ ---params_filename=inference.pdiparams \ ---save_file=./inference/mobilenetv3_model/model.onnx \ ---opset_version=10 \ ---enable_onnx_checker=True +paddle2onnx --model_dir=./mobilenet_v3_small_infer/ \ + --model_filename=inference.pdmodel \ + --params_filename=inference.pdiparams \ + --save_file=./inference/mobilenetv3_model/model.onnx \ + --opset_version=10 \ + --enable_onnx_checker=True ``` -执行完毕后,ONNX 模型会被保存在 `./inference/mobilenetv3_model/` 路径下 +执行完毕后,ONNX 模型会被保存在 `./inference/mobilenetv3_model/` 路径下,文件名为`model.onnx`。 更多关于参数的用法,可参考 [Paddle2ONNX官方教程](https://github.com/PaddlePaddle/Paddle2ONNX/blob/develop/README_zh.md) @@ -94,11 +94,10 @@ ONNX模型测试步骤如下: 执行如下命令: -``` +```bash python3 deploy/onnx_python/infer.py \ ---onnx_file ./inference/mobilenetv3_model/model.onnx \ ---params_file ./mobilenet_v3_small_pretrained.pdparams \ ---img_path ./images/demo.jpg + --onnx_file ./inference/mobilenetv3_model/model.onnx \ + --img_path ./images/demo.jpg ``` 在`ONNXRuntime`输出结果如下。 @@ -109,18 +108,6 @@ ONNXRuntime predict: class_id: 8, prob: 0.9091270565986633 ``` -表示预测的类别ID是`8`,置信度为`0.909`,该结果与基于训练引擎的结果完全一致 - -`ONNXRuntime`预测结果和`Paddle Inference`预测结果对比,如下。 - -``` -ONNXRuntime and Paddle Inference result diff: - -The difference of results between ONNXRuntime and Paddle looks good! -max_abs_diff: 1.5646219e-07 -``` - -从`ONNXRuntime`和`Paddle Inference`的预测结果diff可见,两者的结果几乎完全一致 - +表示预测的类别ID是`8`,置信度为`0.909`,该结果与基于推理引擎的结果完全一致。 ## 3. FAQ diff --git a/tutorials/mobilenetv3_prod/Step6/deploy/onnx_python/infer.py b/tutorials/mobilenetv3_prod/Step6/deploy/onnx_python/infer.py index aad3e7ab9b1b3e8f625b28aed6cb02e82d64a5d5..f3fd1efd3b1520c2bd7eb6826154575145473b4a 100644 --- a/tutorials/mobilenetv3_prod/Step6/deploy/onnx_python/infer.py +++ b/tutorials/mobilenetv3_prod/Step6/deploy/onnx_python/infer.py @@ -13,6 +13,8 @@ # limitations under the License. import os +import sys +sys.path.insert(0, ".") import argparse import numpy as np from PIL import Image @@ -52,37 +54,6 @@ def infer(): print("ONNXRuntime predict: ") print(f"class_id: {class_id}, prob: {prob}") - # Step2:ONNXRuntime预测结果和Paddle Inference预测结果对比 - # 实例化 Paddle 模型 - model = mobilenet_v3_small(pretrained=FLAGS.params_file) - model = nn.Sequential(model, nn.Softmax()) - - # 将模型设置为推理状态 - model.eval() - - # 对比ONNXRuntime和Paddle预测的结果 - paddle_outs = model(paddle.to_tensor(img)) - - diff = ort_outs[0] - paddle_outs.numpy() - max_abs_diff = np.fabs(diff).max() - print("ONNXRuntime and Paddle Inference result diff: ") - if max_abs_diff < 1e-05: - print( - "The difference of results between ONNXRuntime and Paddle looks good!" - ) - else: - relative_diff = max_abs_diff / np.fabs(paddle_outs.numpy()).max() - if relative_diff < 1e-05: - print( - "The difference of results between ONNXRuntime and Paddle looks good!" - ) - else: - print( - "The difference of results between ONNXRuntime and Paddle looks bad!" - ) - print('relative_diff: ', relative_diff) - print('max_abs_diff: ', max_abs_diff) - if __name__ == '__main__': parser = argparse.ArgumentParser(description=__doc__) @@ -91,11 +62,6 @@ if __name__ == '__main__': type=str, default="model.onnx", help="onnx model filename") - parser.add_argument( - '--params_file', - type=str, - default="model.pdparams", - help="params filename") parser.add_argument( '--img_path', type=str, default="image.jpg", help="image filename") parser.add_argument('--crop_size', default=256, help='crop_szie')