Skip to content

Latest commit

 

History

History
195 lines (144 loc) · 9.77 KB

cpp_inference_windows_cn.md

File metadata and controls

195 lines (144 loc) · 9.77 KB

简体中文 | English

Paddle Inference在Windows上部署(C++)

1. 说明

本文档介绍使用Paddle Inference的C++接口在Windows 10部署语义分割模型的示例,主要步骤包括:

  • 准备环境
  • 准备模型和图片
  • 编译、执行

飞桨针对不同场景,提供了多个预测引擎部署模型(如下图),详细使用方法请参考文档

inference_ecosystem

2. 准备环境

2.1 准备基础环境

模型部署的基础环境要求如下:

下面所有示例以工作目录为D:\projects进行演示。

2.2 准备 CUDA/CUDNN/TensorRT 环境

模型部署的环境和需要准备的库对应如下表:

部署环境
CPU -
GPU CUDA/CUDNN
GPU_TRT CUDA/CUDNN/TensorRT

使用GPU进行推理的用户需要参考如下说明准备CUDA和CUDNN,使用CPU推理的用户可以跳过。

CUDA安装请参考官方教程
CUDA的默认安装路径为C:\Program Files\NVIDIA GPU Computing Toolkit,将C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\Vx.y\bin添加到环境变量中。

CUDNN安装请参考官方教程
将cudnn的binincludelib文件夹内的文件复制到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\Vx.ybinincludelib文件夹。(Vx.y中的x.y表示cuda版本)

如果在CUDA下使用TensorRT进行推理加速,还需要准备TensorRT,具体请参考官方教程
将安装目录lib文件夹的.dll文件复制到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\Vx.y\bin

2.3 准备Paddle Inference C++预测库

Paddle Inference C++ 预测库针对不同的CPU和CUDA版本提供了不同的预编译版本,大家根据自己的环境选择合适的预编译库:C++预测库下载链接

如果提供的预编译库不满足需求,可以自己编译Paddle Inference C++预测库,参考文档 ,此处不再赘述。

本文档以CUDA=11.6,CUDNN=8.4.1.5,TensorRT=8.4.1.5为例进行介绍。

Paddle Inference目录结构:

D:\projects\paddle_inference
  ├── paddle
  ├── third_party
  ├── CMakeCache.txt
  └── version.txt

2.4 安装OpenCV

本示例使用OpenCV读取图片,所以需要安装OpenCV。在其他的项目中,大家视需要安装。

  1. 在OpenCV官网下载适用于Windows平台的4.6.0版本,下载地址
  2. 运行下载的可执行文件,将OpenCV解压至指定目录,如D:\projects\opencv
  3. 配置环境变量,如下流程所示(如果使用全局绝对路径,可以不用设置环境变量)
    • 我的电脑->属性->高级系统设置->环境变量
    • 在系统变量中找到Path(如没有,自行创建),并双击编辑
    • 新建,将opencv路径填入并保存,如D:\projects\opencv\build\x64\vc15\bin

3. 准备模型和图片

大家可以下载准备好的预测模型到本地,用于后续测试。 如果需要测试其他模型,请参考文档导出预测模型。

预测模型文件格式如下:

pp_liteseg_infer_model
  ├── deploy.yaml            # 部署相关的配置文件,主要说明数据预处理方式等信息
  ├── model.pdmodel          # 预测模型的拓扑结构文件
  ├── model.pdiparams        # 预测模型的权重文件
  └── model.pdiparams.info   # 参数额外信息,一般无需关注

model.pdmodel可以通过Netron 打开进行模型可视化,点击输入节点即可看到预测模型的输入输出的个数、数据类型(比如int32_t, int64_t, float等)。 如果模型的输出数据类型不是int32_t,执行默认的代码后会报错。此时需要大家手动修改deploy/cpp/src/test_seg.cc文件中的下面代码,改为输出对应的数据类别:

std::vector<int32_t> out_data(out_num);

下载cityscapes验证集中的一张图片 到本地,用于后续测试。

4. 编译

工程整体目录结构如下:

D:\projects
  ├── opencv
  ├── paddle_inference
  └── PaddleSeg

4.1 使用CMake生成项目文件

编译参数的说明如下,其中带*表示仅在使用GPU版本预测库时指定,带#表示仅在使用TensorRT时指定。

参数名 含义
*WITH_GPU 是否使用GPU,默认为OFF;
*CUDA_LIB CUDA的库路径;
*USE_TENSORRT 是否使用TensorRT,默认为OFF;
#TENSORRT_DLL TensorRT的.dll文件存放路径;
WITH_MKL 是否使用MKL,默认为ON,表示使用MKL,若设为OFF,则表示使用Openblas;
CMAKE_BUILD_TYPE 指定编译时使用Release或Debug;
PADDLE_LIB_NAME Paddle预测库名称;
OPENCV_DIR OpenCV的安装路径;
PADDLE_LIB Paddle预测库的安装路径;
DEMO_NAME 可执行文件名;

进入cpp目录下:

cd D:\projects\PaddleSeg\deploy\cpp

创建build文件夹,并进入其目录:

mkdir build
cd build

执行编译命令的格式如下:

(注意:若路径中包含空格,需使用引号括起来。)

cmake .. -G "Visual Studio 16 2019" -A x64 -T host=x64 -DUSE_TENSORRT=ON -DWITH_GPU=ON -DWITH_MKL=ON -DCMAKE_BUILD_TYPE=Release -DPADDLE_LIB_NAME=paddle_inference -DCUDA_LIB=path_to_cuda_lib -DOPENCV_DIR=path_to_opencv -DPADDLE_LIB=path_to_paddle_dir -DTENSORRT_DLL=path_to_tensorrt_.dll -DDEMO_NAME=test_seg

例如,GPU不使用TensorRT推理,命令如下:

cmake .. -G "Visual Studio 16 2019" -A x64 -T host=x64 -DUSE_TENSORRT=OFF -DWITH_GPU=ON -DWITH_MKL=ON -DCMAKE_BUILD_TYPE=Release -DPADDLE_LIB_NAME=paddle_inference -DCUDA_LIB="C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\lib\x64" -DOPENCV_DIR=D:\projects\opencv -DPADDLE_LIB=D:\projects\paddle_inference -DDEMO_NAME=test_seg

GPU使用TensorRT推理,命令如下:

cmake .. -G "Visual Studio 16 2019" -A x64 -T host=x64 -DUSE_TENSORRT=ON -DWITH_GPU=ON -DWITH_MKL=ON -DCMAKE_BUILD_TYPE=Release -DPADDLE_LIB_NAME=paddle_inference -DCUDA_LIB="C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\lib\x64" -DOPENCV_DIR=D:\projects\opencv -DPADDLE_LIB=D:\projects\paddle_inference -DTENSORRT_DLL="C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\bin" -DDEMO_NAME=test_seg

CPU使用MKL推理,命令如下:

cmake .. -G "Visual Studio 16 2019" -A x64 -T host=x64 -DWITH_GPU=OFF -DWITH_MKL=ON -DCMAKE_BUILD_TYPE=Release -DPADDLE_LIB_NAME=paddle_inference -DOPENCV_DIR=D:\projects\opencv -DPADDLE_LIB=D:\projects\paddle_inference -DDEMO_NAME=test_seg

CPU使用OpenBlas推理,命令如下:

cmake .. -G "Visual Studio 16 2019" -A x64 -T host=x64 -DWITH_GPU=OFF -DWITH_MKL=OFF -DCMAKE_BUILD_TYPE=Release -DPADDLE_LIB_NAME=paddle_inference -DOPENCV_DIR=D:\projects\opencv -DPADDLE_LIB=D:\projects\paddle_inference -DDEMO_NAME=test_seg

4.2 编译

Visual Studio 2019打开cpp\build\cpp_inference_demo.sln,将编译模式设置为Release,点击生成->生成解决方案,在cpp\build\Release文件夹内生成test_seg.exe

5、执行

进入到build/Release目录下,将准备的模型和图片放到test_seg.exe同级目录,build/Release目录结构如下:

Release
├──test_seg.exe                # 可执行文件
├──cityscapes_demo.png         # 测试图片
├──pp_liteseg_infer_model      # 推理用到的模型
    ├── deploy.yaml            # 部署相关的配置文件,主要说明数据预处理方式等信息
    ├── model.pdmodel          # 预测模型的拓扑结构文件
    ├── model.pdiparams        # 预测模型的权重文件
    └── model.pdiparams.info   # 参数额外信息,一般无需关注
├──*.dll                       # dll文件

运行以下命令进行推理,GPU推理:

test_seg.exe --model_dir=./pp_liteseg_infer_model --img_path=./cityscapes_demo.png --devices=GPU

CPU推理:

test_seg.exe --model_dir=./pp_liteseg_infer_model --img_path=./cityscapes_demo.png --devices=CPU

预测结果保存为out_img.jpg,该图片使用了直方图均衡化,便于可视化,如下图:

out_img