windows_cpp_inference.md 10.8 KB
Newer Older
1

2
安装与编译 Windows 预测库
D
dzhwinter 已提交
3 4
===========================

5
下载安装包与对应的测试环境
6 7
-------------

8
| 版本说明      |     预测库(1.7.2版本)     |       编译器        |    构建工具      |  cuDNN  |  CUDA  |
9
|:---------|:-------------------|:-------------------|:----------------|:--------|:-------|
10 11 12 13 14
|    cpu_avx_mkl | [fluid_inference.zip](https://paddle-wheel.bj.bcebos.com/1.7.2/win-infer/mkl/cpu/fluid_inference_install_dir.zip) | MSVC 2015 update 3|  CMake v3.16.0  |
|    cpu_avx_openblas | [fluid_inference.zip](https://paddle-wheel.bj.bcebos.com/1.7.2/win-infer/open/cpu/fluid_inference_install_dir.zip) | MSVC 2015 update 3|  CMake v3.16.0  |
|    cuda9.0_cudnn7_avx_mkl | [fluid_inference.zip](https://paddle-wheel.bj.bcebos.com/1.7.2/win-infer/mkl/post97/fluid_inference_install_dir.zip) |  MSVC 2015 update 3 |  CMake v3.16.0  |  7.4.1  |   9.0    |
|    cuda9.0_cudnn7_avx_openblas | [fluid_inference.zip](https://paddle-wheel.bj.bcebos.com/1.7.2/win-infer/open/post97/fluid_inference_install_dir.zip) | MSVC 2015 update 3 |  CMake v3.16.0  |  7.4.1  |   9.0    |
|    cuda10.0_cudnn7_avx_mkl | [fluid_inference.zip](https://paddle-wheel.bj.bcebos.com/1.7.2/win-infer/mkl/post107/fluid_inference_install_dir.zip) | MSVC 2015 update 3 |  CMake v3.16.0  |  7.5.0  |   10.0    |
15 16 17 18 19 20

### 硬件环境

测试环境硬件配置:

| CPU      |      I7-8700K      |
21
|:---------|:-------------------|
22 23 24 25 26
| 内存 | 16G               |
| 硬盘 | 1T hdd + 256G ssd |
| 显卡 | GTX1080 8G        |

测试环境操作系统使用 win10 家庭版本
27 28 29 30 31

从源码编译预测库
--------------
用户也可以从 PaddlePaddle 核心代码编译C++预测库,只需在编译时配制下面这些编译选项:

32 33 34 35
|选项       |说明               |   值     |
|:-------------|:-------|:------------|
|CMAKE_BUILD_TYPE |  配置生成器上的构建类型,windows预测库目前只支持Release          | Release    |
|ON_INFER |    是否生成预测库,编译预测库时必须设置为ON                | ON         |
36
|WITH_GPU |   是否支持GPU                  | ON/OFF     |
37 38 39 40
|WITH_MKL |   是否使用Intel MKL(数学核心库)                 | ON/OFF     |
|WITH_PYTHON | 是否内嵌PYTHON解释器                | OFF(推荐)        |
|MSVC_STATIC_CRT|是否使用/MT 模式进行编译,Windows默认使用 /MT 模式进行编译 |ON/OFF|
|CUDA_TOOKIT_ROOT_DIR|编译GPU预测库时,需设置CUDA的根目录|YOUR_CUDA_PATH|
41 42 43

请按照推荐值设置,以避免链接不必要的库。其它可选编译选项按需进行设定。

44 45
更多具体编译选项含义请参见[编译选项表](../../../beginners_guide/install/Tables.html/#Compile)

46 47
Windows下安装与编译预测库步骤:(在Windows命令提示符下执行以下指令)

48 49 50 51 52
1. 将PaddlePaddle的源码clone在当下目录的Paddle文件夹中,并进入Paddle目录:
   ```bash
   git clone https://github.com/PaddlePaddle/Paddle.git
   cd Paddle
   ```
53

54
2. 执行cmake:
55
   - 编译CPU预测
56
   ```bash
57
   # 创建并进入build目录
58 59
   mkdir build
   cd build
60

61
   cmake .. -G "Visual Studio 14 2015" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DWITH_MKL=OFF -DWITH_GPU=OFF -DON_INFER=ON -DWITH_PYTHON=OFF
62

63
   # Windows默认使用 /MT 模式进行编译,如果想使用 /MD 模式,请使用以下命令。如不清楚两者的区别,请使用上面的命令
64
   cmake .. -G "Visual Studio 14 2015" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DWITH_MKL=OFF -DWITH_GPU=OFF -DON_INFER=ON -DWITH_PYTHON=OFF -DMSVC_STATIC_CRT=OFF
65
   ```
66 67 68 69 70
   - 编译GPU预测库:
   ```bash
   # -DCUDA_TOOKIT_ROOT_DIR 为cuda根目录,例如-DCUDA_TOOKIT_ROOT_DIR="D:\\cuda"
   cmake .. -G "Visual Studio 14 2015" -A x64 -T host=x64 -DCMAKE_BUILD_TYPE=Release -DWITH_MKL=ON -DWITH_GPU=ON -DON_INFER=ON -DWITH_PYTHON=OFF -DCUDA_TOOKIT_ROOT_DIR=YOUR_CUDA_PATH
   ```
71

72
3. 使用Blend for Visual Studio 2015 打开 `paddle.sln` 文件,选择平台为`x64`,配置为`Release`,编译inference_lib_dist项目。
73
   操作方法:在Visual Studio中选择相应模块,右键选择"生成"(或者"build")
74

75
编译成功后,使用C++预测库所需的依赖(包括:(1)编译出的PaddlePaddle预测库和头文件;(2)第三方链接库和头文件;(3)版本信息与编译选项信息)
76
均会存放于`fluid_inference_install_dir`目录中。
77 78 79 80 81 82 83 84 85 86 87 88 89 90

version.txt 中记录了该预测库的版本信息,包括Git Commit ID、使用OpenBlas或MKL数学库、CUDA/CUDNN版本号,如:


     GIT COMMIT ID: cc9028b90ef50a825a722c55e5fda4b7cd26b0d6
     WITH_MKL: ON
     WITH_MKLDNN: ON
     WITH_GPU: ON
     CUDA version: 8.0
     CUDNN version: v7


编译预测demo
-------------
D
dzhwinter 已提交
91 92 93

### 硬件环境

T
tink2123 已提交
94
测试环境硬件配置:
D
dzhwinter 已提交
95

W
wopeizl 已提交
96 97 98 99 100
| CPU      |      I7-8700K      |
|:---------|:-------------------|
| 内存 | 16G               |
| 硬盘 | 1T hdd + 256G ssd |
| 显卡 | GTX1080 8G        |
D
dzhwinter 已提交
101

W
wopeizl 已提交
102
测试环境操作系统使用 win10 家庭版本。
D
dzhwinter 已提交
103

104
### 软件要求
D
dzhwinter 已提交
105

W
wopeizl 已提交
106
**请您严格按照以下步骤进行安装,否则可能会导致安装失败!**
D
dzhwinter 已提交
107

W
wopeizl 已提交
108
**安装Visual Studio 2015 update3**
D
dzhwinter 已提交
109

W
wopeizl 已提交
110
安装Visual Studio 2015,安装选项中选择安装内容时勾选自定义,选择安装全部关于c,c++,vc++的功能。
D
dzhwinter 已提交
111

112
### 其他要求
D
dzhwinter 已提交
113

114
1. 你需要直接下载Windows预测库或者从Paddle源码编译预测库,确保windows预测库存在。
D
dzhwinter 已提交
115

116 117 118
2. 你需要下载Paddle源码,确保demo文件和脚本文件存在:
```bash
git clone https://github.com/PaddlePaddle/Paddle.git
119
```
120
### 编译demo
121
Windows下编译预测demo步骤:(在Windows命令提示符下执行以下指令)
122
#### 使用脚本编译运行
123

124
进入到demo_ci目录,运行脚本`run_windows_demo.bat`,根据提示按需输入参数:
125 126
```dos
# path为下载Paddle的目录
127
cd path\Paddle\paddle\fluid\inference\api\demo_ci
128 129 130
run_windows_demo.bat
```

131
其中,run_windows_demo.bat 的部分选项如下:
132 133 134 135 136 137 138 139 140 141

```dos
gpu_inference=Y #是否使用GPU预测库,默认使用CPU预测库
use_mkl=Y #该预测库是否使用MKL,默认为Y
use_gpu=Y  #是否使用GPU进行预测,默认为N。使用GPU预测需要下载GPU版本预测库

paddle_inference_lib=path\fluid_inference_install_dir #设置paddle预测库的路径
cuda_lib_dir=path\lib\x64  #设置cuda库的路径
vcvarsall_dir=path\vc\vcvarsall.bat  #设置visual studio #本机工具命令提示符路径
```
142
#### 手动编译运行
143

144 145 146 147 148 149 150
1. 进入demo_ci目录,创建并进入build目录
   ```dos
   # path为下载Paddle的目录
   cd path\Paddle\paddle\fluid\inference\api\demo_ci
   mkdir build
   cd build
   ```
D
dzhwinter 已提交
151

152 153 154
2. 执行cmake(cmake可以在[官网进行下载](https://cmake.org/download/),并添加到环境变量中):
   - 使用CPU预测库编译demo
   ```dos
155
   # -DDEMO_NAME 是要编译的文件
156 157 158 159 160 161 162 163 164 165
   # -DDPADDLE_LIB是预测库目录,例如-DPADDLE_LIB=D:\fluid_inference_install_dir
   cmake .. -G "Visual Studio 14 2015" -A x64 -T host=x64 -DWITH_GPU=OFF -DWITH_MKL=ON -DWITH_STATIC_LIB=ON ^
   -DCMAKE_BUILD_TYPE=Release -DDEMO_NAME=simple_on_word2vec -DPADDLE_LIB=path_to_the_paddle_lib -DMSVC_STATIC_CRT=ON
   ```
   - 使用GPU预测库编译demo
   ```dos
   # -DCUDA_LIB CUDA的库目录,例如-DCUDA_LIB=D:\cuda\lib\x64
   cmake .. -G "Visual Studio 14 2015" -A x64 -T host=x64 -DWITH_GPU=ON -DWITH_MKL=ON -DWITH_STATIC_LIB=ON ^
   -DCMAKE_BUILD_TYPE=Release -DDEMO_NAME=simple_on_word2vec -DPADDLE_LIB=path_to_the_paddle_lib -DMSVC_STATIC_CRT=ON -DCUDA_LIB=YOUR_CUDA_LIB
   ```
166
3. 使用Blend for Visual Studio 2015 打开 `cpp_inference_demo.sln` 文件,选择平台为`x64`,配置为`Release`,编译simple_on_word2vec项目。
167 168 169 170 171 172 173 174 175
   操作方法: 在Visual Studio中选择相应模块,右键选择"生成"(或者"build")

4. [下载模型](http://paddle-inference-dist.bj.bcebos.com/word2vec.inference.model.tar.gz)并解压到当前目录,执行命令:
   ```dos
   # 开启GLOG
   set GLOG_v=100
   # 进行预测,path为模型解压后的目录
   Release\simple_on_word2vec.exe --dirname=path\word2vec.inference.model
   ```
D
dzhwinter 已提交
176

177
### 实现一个简单预测demo
178 179 180

[完整的代码示例](https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/inference/api/demo_ci/windows_mobilenet.cc)

181
本示例使用了AnalysisConfig管理AnalysisPredictor的预测配置,提供了模型路径设置、预测引擎运行设备选择以及使用ZeroCopyTensor管理输入/输出的设置。具体步骤如下:
182

183 184 185 186 187 188
1. 创建AnalysisConfig
   ```C++
   AnalysisConfig config;
   config->SwitchUseFeedFetchOps(false);  // 关闭feed和fetch OP使用,使用ZeroCopy接口必须设置此项
   // config->EnableUseGpu(100 /*设定GPU初始显存池为MB*/,  0 /*设定GPU ID为0*/); //开启GPU预测
   ```
189

190
2. 在config中设置模型和参数路径
191

192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
   从磁盘加载模型时,根据模型和参数文件存储方式不同,设置AnalysisConfig加载模型和参数的路径有两种形式,此处使用combined形式:
   - 非combined形式:模型文件夹`model_dir`下存在一个模型文件和多个参数文件时,传入模型文件夹路径,模型文件名默认为`__model__`
   ``` c++
   config->SetModel("path\\model_dir\\__model__")
   ```
   - combined形式:模型文件夹`model_dir`下只有一个模型文件`__model__`和一个参数文件`__params__`时,传入模型文件和参数文件路径。
   ```C++
   config->SetModel("path\\model_dir\\__model__", "path\\model_dir\\__params__");
   ```
3. 创建predictor,准备输入数据
   ```C++
   std::unique_ptr<PaddlePredictor> predictor = CreatePaddlePredictor(config);
   int batch_size = 1;
   int channels = 3; // channels,height,width三个参数必须与模型中对应输入的shape一致
   int height = 300;
   int width = 300;
   int nums = batch_size * channels * height * width;

   float* input = new float[nums];
   for (int i = 0; i < nums; ++i) input[i] = 0;
   ```
4. 使用ZeroCopyTensor管理输入
   ```C++
   // 通过创建的AnalysisPredictor获取输入Tensor,该Tensor为ZeroCopyTensor
   auto input_names = predictor->GetInputNames();
   auto input_t = predictor->GetInputTensor(input_names[0]);

   // 对Tensor进行reshape,将准备好的输入数据从CPU拷贝到ZeroCopyTensor中
   input_t->Reshape({batch_size, channels, height, width});
   input_t->copy_from_cpu(input);
   ```
223

224 225 226 227
5. 运行预测引擎
   ```C++
   predictor->ZeroCopyRun();
   ```
228

229 230 231 232 233 234 235 236
6. 使用ZeroCopyTensor管理输出
   ```C++
   auto output_names = predictor->GetOutputNames();
   auto output_t = predictor->GetOutputTensor(output_names[0]);
   std::vector<int> output_shape = output_t->shape();
   int out_num = std::accumulate(output_shape.begin(), output_shape.end(), 1,
                                 std::multiplies<int>());

237
   out_data.resize(out_num);
238 239 240
   output_t->copy_to_cpu(out_data.data()); // 将ZeroCopyTensor中数据拷贝到cpu中,得到输出数据
   delete[] input;
   ```
241
**Note:** 关于AnalysisPredictor的更多介绍,请参考[C++预测API介绍](./native_infer.html)