本文基本参照 PaddleX 官方部署方式, 只进行 paddlex 模型的 c# 端部署和验证,而不进行模型的训练相关操作。

目前已经具备的CUDA环境和cuDNN环境情况
1
2
3
4
5
6
C:\Users\cy\paddle_deploy>nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Tue_May__3_19:00:59_Pacific_Daylight_Time_2022
Cuda compilation tools, release 11.7, V11.7.64
Build cuda_11.7.r11.7/compiler.31294372_0

cudnn_version.h 中

1
2
3
#define CUDNN_MAJOR 8
#define CUDNN_MINOR 6
#define CUDNN_PATCHLEVEL 0

当前 CUDA 版本:11.7,cuDNN 版本:8.6.0

需要根据实际情况进行多 CUDA 环境部署

指定的版本 CUDA 11.0 Cudnn 8.0

CUDA 11.0 下载 2.62 GB

安装后有两个版本的 CUDA

image-20221230194636241

Cudnn 8.0 下载 482.82 MB

将 cudnn 压缩包中的文件复制到对应版本的 CUDA 安装目录

image-20221230194737571

CUDA 版本配置完毕

# 准备工作

下载所需要的各类环境:paddlex PPdeployTensorRT 7.2.3opencv 3.4.6, PaddleInference release2.3 版本cmake 3.18.5 可手动安装,以下为命令行安装方式。关于 windows 下如何命令行下载安装,请看这里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#下载paddlex和PPdeploy
git clone https://github.com/PaddlePaddle/PaddleX.git
git clone https://github.com/Deploy-Demo/PPdeploy.git

#下载opencv,自解压程序,需要手动安装
wget https://github.com/opencv/opencv/releases/download/3.4.6/opencv-3.4.6-vc14_vc15.exe


#下载paddle_inference
wget https://paddle-inference-lib.bj.bcebos.com/2.3.0/cxx_c/Windows/GPU/x86-64_vs2017_avx_mkl_cuda11.0_cudnn8/paddle_inference.zip
md paddle_inference
tar -xvf paddle_inference.zip -C paddle_inference

#下载TensorRT
#划去,无法wget下载
wget https://developer.nvidia.com/compute/machine-learning/tensorrt/secure/7.2.3/zip/TensorRT-7.2.3.4.Windows10.x86_64.cuda-11.0.cudnn8.1.zip

md TensorRT
tar -xvf TensorRT-7.0.0.11.Windows10.x86_64.cuda-10.2.cudnn7.6.zip -C TensorRT

#下载cmake
wget https://github.com/Kitware/CMake/releases/download/v3.18.5/cmake-3.18.5-win64-x64.zip
md cmake
tar -xvf cmake-3.18.5-win64-x64.zip -C cmake

运行 opencv 的自解压程序,解压 opencv 到当前路径,tree 得到当前目录树

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
C:\Users\cy\paddle_deploy>tree -L 1
.
|-- PPdeploy
|-- PaddleX
|-- TensorRT
|-- TensorRT-7.0.0.11.Windows10.x86_64.cuda-10.2.cudnn7.6.zip
|-- cmake
|-- cmake-3.5.2-win32-x86.zip
|-- opencv
|-- opencv-3.4.6-vc14_vc15.exe
|-- paddle_inference
|-- paddle_inference.zip
`-- tree

6 directories, 5 files

在 windows 环境变量中将 opencv 的路径 C:\Users\user_name\paddle_deploy\opencv\build\x64\vc15\bin 添加到 path

image-20221230190657424

# 开始编译

# 替换相关文件

替换 model_infer.cpp 预测代码

使用 PPdeploy/dlldemo 中的 model_infer.cppCMakeLists.txt 替换 PaddleX/deploy/cpp/demo/ 中的同名文件

替换相关头文件

PPdeploy/dlldemo 中的 logger.hmodel_infer.hthread_pool.htimer.h 头文件复制到 PaddleX/deploy/cpp/demo/ 目录下。

# 使用 CMake 编译

主要编译 PaddleX/deploy/cpp 中的代码,使用 out 承接编译生成的文件

运行 cmake\cmake-3.18.5-win64-x64\bin\cmake-gui.exe , 手动创建 PaddleX/deploy/cpp/out 目录。

源代码路径选择 PaddleX/deploy/cpp 目录

输出路径选择 PaddleX/deploy/cpp/out

image-20221229205304481

配置 configure

image-20221229205602211

直接进行编译会报错,需要补充一些 lib 库

image-20221229210258175

# GPU 版本

image-20221229211040602

分别填入 CUDA_LIB OPENCV_DIR PADDLE_DIR TENSORRT_DIR , 勾选上 WITH_GPU WITH_MKL WITH_PADDLE_TENSORRT WITH_STATIC_LIB ,点击 Generate 开始生成。

最终在 Paddle/deploy/cpp/out 目录下生成如下文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.
|-- ALL_BUILD.vcxproj
|-- ALL_BUILD.vcxproj.filters
|-- CMakeCache.txt
|-- CMakeFiles
|-- PaddleDeploy.sln
|-- ZERO_CHECK.vcxproj
|-- ZERO_CHECK.vcxproj.filters
|-- cmake_install.cmake
|-- demo
|-- ext
|-- ext-yaml-cpp.vcxproj
`-- ext-yaml-cpp.vcxproj.filters

3 directories, 9 files

可以看到,出现了 PaddleDeploy.sln 文件,则表示通过 cmake 生成成功了解决方案。

打开 PaddleDeploy.sln ,在 VS 解决方案管理器中可以看到一些项目

image-20221229211610640

其中,关键的是 model_infer ,也是后续 C# 工程需要直接调用的模块.

后续可能还会用到的几个模块:

批处理推理 batch_infer

多 GPU 推理(当前用不到) multi_gpu_model_infer

使用 TensorRT 推理 tensorrt_infer

可能由于版本管理问题,打开项目时会提示有错误,只需要将报错的几行代码注释即可,不影响使用

将项目版本调整成 release ,然后生成项目 model_infer

image-20221229215707366

最终在 PaddleX\deploy\cpp\out\paddle_deploy 目录下生成如下文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.
|-- Release
| |-- model_infer.dll
| |-- model_infer.exp
| `-- model_infer.lib
|-- libiomp5md.dll
|-- mkldnn.dll
|-- mklml.dll
|-- myelin64_1.dll
|-- nvinfer.dll
|-- nvinfer_plugin.dll
`-- paddle_inference.dll

1 directory, 10 files

这些文件之后都要复制到 c# 工程的 bin\ 目录下。

注意:如果编译生成过程中出现 无法打开 源文件 “yaml-cpp/yaml.h"(issues 4),

则需要在上一步生成之前勾选 YAML_BUILD_SHARED_LIBS ,再次生成解决方案。如果这样也不行,则需要自行下载 yaml-cpp.zip, 将其中的文件解压到 PaddleX\deploy\cpp\yaml-cpp\ 目录中。问题的原因是生成过程中需要下载 yaml-cpp 并且编译,如果在 Makefile 中将该路径引入而没有找到相应文件的话就会出现上述错误。

# CPU 版本

需要下载 cpu MKL 版本的推理库

编译的时候需要去掉 with GPU ,其他步骤同上,需要注意的是 PADDLE_DIR 的路径应该的 cpu 版本的推理库路径。

image-20230102230237984

使用 cpu 推理库时, out_cpu\paddle_deploy 下生成的文件略有不同

1
2
3
4
5
6
7
8
9
10
11
.
|-- Release
| |-- model_infer.dll
| |-- model_infer.exp
| `-- model_infer.lib
|-- libiomp5md.dll
|-- mkldnn.dll
|-- mklml.dll
`-- paddle_inference.dll

1 directory, 7 files

少了 nv 相关的文件,并且由于少了 GPU 的部分, paddle_inference.dll 文件的体积小了很多

# 使用 C# 项目调用 dll

# 使用官方的 Demo

官方给出了一个 C# 的 Demo,位于 PPdeploy\paddlex\deploy\csharpModelInferUI.sln , 选择 Debug X64 模式进行调试。调试之前需要确保 bin\x64\Debug 下包含以下 dll:

  • model_infer.dll , 位于上边 cmkae 编译的目录下: PaddleX\deploy\cpp\out\paddle_deploy\Release
  • 其余 dll, 位于以下目录: PaddleX\deploy\cpp\out\paddle_deploy
  • paddle2onnx.dllonnxruntime.dll ,位于 paddle_inference\third_party\install\paddle2onnx paddle_inference\third_party\install\onnxruntime 文件中
  • OpenCvSharp.Extensions.dll 位于 libs\opencvsharp453\NativeLib\x64 中,移动到 bin 目录下即可

如果调试的时候提示 cv 相关的引用报错,可能是由于项目中没有引入 opencvsharp 的包,需要在 Nuget包管理器 中添加 OpenCvSharp4OpenCvSharp4.runtime.win 版本号前缀为 4.5.3

image-20230101182936299

执行调试就可以看到官方 demo 的界面

image-20230101183015622

选择对应的模型文件目录和图片文件目录,模型类型根据模型实际情况选择,这里我选择的是 paddlex

image-20230101183153262

点击 Update Model 初始化模型,然后点击 start ,如果没有出现报错,模型就会开始执行推理

1
2
3
4
5
6
7
8
9
10
11
[Info] Finished 1 models warm up with 100 cycles.Warm up Total elapse: 21193 ms, Average elapse: 211 ms.
[Info]===== Cycle1 Start =====
[Info] predicted 1 images.
[Info] predicted 1 images.
[Info] predicted 1 images.
[Info] predicted 1 images.
[Info] predicted 1 images.
[Info] predicted 1 images.
[Info] Finished all 1 cycles.
[Info] Total images: 6, Total elapse: 1143 ms, Average elapse: [190] ms.
---------------------------------------------------------------------------

这里之所以推理耗时这么久是因为我修改了 model_infer 项目中的代码,导致现在使用的是 cpu 模式进行推理(稍后会提到如何修改 model_infer 中的相关代码来实现在自己的项目中部署 paddle)

使用 GPU 版本的推理库时,可以选择使用 GPU/CPU 来推理。

# 在自己的 C# 中调用 paddle

添加引用

首先在 nuget 包管理中添加 OpenCvSharp4OpenCvSharp4.runtime.win

添加程序集引用 PresentationCorePresentationFramework

PPdeploy\paddlex\deploy\csharp\ModelInferUI\libs\opencvsharp453 文件夹复制到当前项目的 lib\ 中,然后从文件添加引用 OpenCvSharp.Extensions (位于 paddle_cshap_demo\paddle_cshap_demo\libs\opencvsharp453\ManagedLib\net461\OpenCvSharp.Extensions.dll )

画出控件

image-20230103133831454

运行库安装

测试模型加载

测试模型推理

模型调用库 C# 再封装