x86.md 6.6 KB
Newer Older
1
# PaddleLite使用X86预测部署
2

3 4
## 一、Docker或者Linux环境

5
Paddle-Lite 支持在Docker或Linux环境编译x86预测库。环境搭建参考[环境准备](../user_guides/source_compile)
6

7 8 9
(注意:非docker Linux环境需要是Ubuntu16.04)

### 编译
10 11 12

1、 下载代码
```bash
13
# 下载Paddle-Lite源码
14
git clone https://github.com/PaddlePaddle/Paddle-Lite.git
15
# 切换到release分支
16
git checkout release/v2.6.0
17 18 19 20 21 22 23
```

2、 源码编译

```bash
cd Paddle-Lite
./lite/tools/build.sh x86
24 25 26

# 其他可选择编译选项
# --with_log=OFF 关闭LOG信息输出
27 28
```

29
### 编译结果说明
30 31 32 33 34 35 36 37 38 39

x86编译结果位于 `build.lite.x86/inference_lite_lib`
**具体内容**说明:

1、 `bin`文件夹:可执行工具文件 `test_model_bin`

2、 `cxx`文件夹:包含c++的库文件与相应的头文件

- `include`  : 头文件
- `lib` : 库文件
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
  - 静态库文件:
    - `libpaddle_api_full_bundled.a`  :full_api 静态库
    - `libpaddle_api_light_bundled.a` :light_api 静态库
  - 动态库文件:
    - `libpaddle_full_api_shared.so` :full_api 动态库
    - `libpaddle_light_api_shared.so`:light_api 动态库

3、 `third_party` 文件夹:依赖的第三方预测库mklml

- mklml : Paddle-Lite预测库依赖的mklml数学库

4、 `demo/cxx`文件夹:x86预测库的C++ 示例demo

- `mobilenetv1_full` :使用full_api 执行mobilenet_v1预测的C++ demo
- `mobilenetv1_light` :使用light_api 执行mobilenet_v1预测的C++ demo


57 58


59
### x86预测API使用示例
60

61
1、`mobilenetv1_full`目录结构
62

63 64 65 66 67 68
```bash
mobilenetv1_full/
|-- CMakeLists.txt
|-- build.sh
`-- mobilenet_full_api.cc
```
69

70
本demo使用cmake构建`CMakeLists.txt`为cmake脚本,`mobilenet_full_api.cc`是x86示例的源代码、`build.sh`为编译的脚本。
71

72
2、demo使用方法
73 74 75

``` bash
# 1、编译
76
cd mobilenetv1_full
77 78 79 80 81
sh build.sh
```
编译结果为当前目录下的 `mobilenet_full_api `
``` bash
# 2、执行预测
82
./mobilenet_full_api ./mobilenet_v1
83
```
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
下载并解压模型[`mobilenet_v1`](http://paddle-inference-dist.bj.bcebos.com/mobilenet_v1.tar.gz)到当前目录,执行以上命令进行预测。

```bash
# 3、执行demo后输出结果如下,全一输入下mobilenet_v1的预测结果
Output shape 1000
Output[0]: 0.000191312
Output[100]: 0.000159713
Output[200]: 0.000264313
Output[300]: 0.000210793
Output[400]: 0.00103236
Output[500]: 0.000110071
Output[600]: 0.00482924
Output[700]: 0.00184533
Output[800]: 0.000202116
Output[900]: 0.000585591
```


102 103 104

3、示例源码`mobilenet_full_api.cc`

105 106 107
```c++
#include <iostream>
#include <vector>
108
#include "paddle_api.h"
109 110


111
using namespace paddle::lite_api;  // NOLINT
112 113 114 115 116 117 118

int64_t ShapeProduction(const shape_t& shape) {
  int64_t res = 1;
  for (auto i : shape) res *= i;
  return res;
}

119 120 121 122 123 124 125 126
void RunModel(std::string model_dir) {
   // 1. Create CxxConfig
   CxxConfig config;
   config.set_model_dir(model_dir);
   config.set_valid_places({
     Place{TARGET(kX86), PRECISION(kFloat)},
     Place{TARGET(kHost), PRECISION(kFloat)}
   });
127 128 129 130 131 132
  // 2. Create PaddlePredictor by CxxConfig
  std::shared_ptr<PaddlePredictor> predictor =
      CreatePaddlePredictor<CxxConfig>(config);

  // 3. Prepare input data
  std::unique_ptr<Tensor> input_tensor(std::move(predictor->GetInput(0)));
133
  input_tensor->Resize({1, 3, 224, 224});
134 135 136 137 138 139 140 141 142 143 144
  auto* data = input_tensor->mutable_data<float>();
  for (int i = 0; i < ShapeProduction(input_tensor->shape()); ++i) {
    data[i] = 1;
  }

  // 4. Run predictor
  predictor->Run();

  // 5. Get output
  std::unique_ptr<const Tensor> output_tensor(
      std::move(predictor->GetOutput(0)));
145
  std::cout << "Output shape " << output_tensor->shape()[1] << std::endl;
146
  for (int i = 0; i < ShapeProduction(output_tensor->shape()); i += 100) {
147 148
    std::cout << "Output[" << i << "]: " << output_tensor->data<float>()[i]
              << std::endl;
149 150 151 152
  }
}

int main(int argc, char** argv) {
153 154 155 156 157 158
  if (argc < 2) {
    std::cerr << "[ERROR] usage: ./" << argv[0] << " naive_buffer_model_dir\n";
    exit(1);
  }
  std::string model_dir = argv[1];
  RunModel(model_dir);
159 160
  return 0;
}
161

162
```
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 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 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242

## 二、Windows环境

### 环境准备

#### 编译环境需求

- Windows 10 专业版
  - 目前Windows暂不支持GPU模式
- *Python 版本 2.7/3.5.1+/3.6/3.7 (64 bit)*
- *pip 或 pip3 版本 9.0.1+ (64 bit)*
- *Visual Studio 2015 Update3*

#### 安装步骤

1. cmake 需要3.15版本, 可在官网[下载](https://cmake.org/download/),并添加到环境变量中。

2. python 需要2.7 及以上版本, 可在官网[下载](https://www.python.org/download/releases/2.7/)

3. git可以在官网[下载](https://gitforwindows.org/),并添加到环境变量中

### 编译

1、 下载代码
```bash
git clone https://github.com/PaddlePaddle/Paddle-Lite.git
# 切换到release分支
git checkout release/v2.3
```
2、 源码编译

```bash
cd Paddle-Lite
lite/tools/build_windows.bat with_extra with_python with_profile
```
编译脚本`lite/tools/build.bat`,追加参数说明:

|   参数     |     介绍     |     值     |
|-----------|-------------|-------------|
|  with_extra | 可选,是否编译全量预测库(默认为OFF)。详情可参考[预测库说明](./library.html)。 | `ON``OFF` |
|  with_python | 可选,是否编译python预测库(默认为OFF) 。 | `ON``OFF` |
|  with_profile | 可选,是否支持分析器模式(默认为OFF) 。 | `ON``OFF` |

### 编译结果

x86编译结果位于 `build.lite.x86/inference_lite_lib`
**具体内容**说明:

1、 `bin`文件夹:可执行工具文件 `test_model_bin`

2、 `cxx`文件夹:包含c++的库文件与相应的头文件

- `include`  : 头文件
- `lib` : 库文件
  - 打包的静态库文件:
    - `libpaddle_api_full_bundled.lib`  :full_api 静态库
    - `libpaddle_api_light_bundled.lib` :light_api 静态库

3、 `third_party` 文件夹:第三方库文件

### x86预测API使用示例

1、我们提供Windows环境下x86 API运行mobilenet_v1的示例:[mobilenet_full_x86demo](https://paddlelite-data.bj.bcebos.com/x86/mobilenet_full_x86demo.zip)。下载解压后内容如下>:

![](https://paddlelite-data.bj.bcebos.com/x86/x86-doc/demo.png)

`mobilenet_v1`为模型文件、`lib``include`分别是Paddle-Lite的预测库和头文件、`third_party`下是编译时依赖的第三方库`mklml``mobilenet_full_api.cc`是x86示例的源代码、`build.bat`为编译的脚本。

2、demo内容与使用方法

``` bash
# 1、编译(需在vs2015的命令窗口执行该脚本)
build.bat
```
编译结果为当前目录下的 `Release\\mobilenet_full_api.exe`
``` bash
# 2、执行预测
Release\\mobilenet_full_api.exe ..\mobilenet_v1
```
`mobilenet_v1`为模型路径,`mobilenet_full_api.exe`为第一步编译出的可执行文件。