paddle_hub_serving_deploy.md 7.2 KB
Newer Older
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39
# 基于PaddleHub Serving的服务部署

PaddleClas 支持通过 PaddleHub 快速进行服务化部署。

---

## 1. 简介

hubserving 服务部署配置服务包 `clas` 下包含 3 个必选文件,目录如下:

```
hubserving/clas/
  └─  __init__.py    空文件,必选
  └─  config.json    配置文件,可选,使用配置启动服务时作为参数传入
  └─  module.py      主模块,必选,包含服务的完整逻辑
  └─  params.py      参数文件,必选,包含模型路径、前后处理参数等参数
```

## 2. 准备环境
```shell
# 安装paddlehub,请安装2.0版本
pip3 install paddlehub==2.1.0 --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
```

## 3. 下载推理模型

安装服务模块前,需要准备推理模型并放到正确路径,默认模型路径为:

* 分类推理模型结构文件:`PaddleClas/inference/inference.pdmodel`
* 分类推理模型权重文件:`PaddleClas/inference/inference.pdiparams`

**注意**
* 模型文件路径可在 `PaddleClas/deploy/hubserving/clas/params.py` 中查看和修改:

  ```python
  "inference_model_dir": "../inference/"
  ```
需要注意,
  * 模型文件(包括 `.pdmodel``.pdiparams`)名称必须为`inference`
G
gaotingquan 已提交
40
  * 我们也提供了大量基于ImageNet-1k数据集的预训练模型,模型列表及下载地址详见[模型库概览](../models/models_intro.md),也可以使用自己训练转换好的模型。
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 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

## 4. 安装服务模块

针对 Linux 环境和 Windows 环境,安装命令如下。

* 在Linux环境下,安装示例如下:
```shell
cd PaddleClas/deploy
# 安装服务模块:
hub install hubserving/clas/
```

* 在Windows环境下(文件夹的分隔符为`\`),安装示例如下:

```shell
cd PaddleClas\deploy
# 安装服务模块:  
hub install hubserving\clas\
```

## 5. 启动服务

### 5.1 命令行命令启动

该方式仅支持使用 CPU 预测。启动命令:

```shell
$ hub serving start --modules Module1==Version1 \
                    --port XXXX \
                    --use_multiprocess \
                    --workers \
```  

**参数说明**:
|参数|用途|  
|-|-|  
|--modules/-m| [**必选**] PaddleHub Serving预安装模型,以多个Module==Version键值对的形式列出<br>*`当不指定Version时,默认选择最新版本`*|  
|--port/-p| [**可选**] 服务端口,默认为8866|  
|--use_multiprocess| [**可选**] 是否启用并发方式,默认为单进程方式,推荐多核CPU机器使用此方式<br>*`Windows操作系统只支持单进程方式`*|
|--workers| [**可选**] 在并发方式下指定的并发任务数,默认为`2*cpu_count-1`,其中`cpu_count`为CPU核数|  

如按默认参数启动服务:```hub serving start -m clas_system```  

这样就完成了一个服务化 API 的部署,使用默认端口号 8866。

### 5.2 配置文件启动

该方式仅支持使用 CPU 或 GPU 预测。启动命令:

```hub serving start -c config.json```  

其中,`config.json`格式如下:

```json
{
    "modules_info": {
        "clas_system": {
            "init_args": {
                "version": "1.0.0",
                "use_gpu": true,
                "enable_mkldnn": false
            },
            "predict_args": {
            }
        }
    },
    "port": 8866,
    "use_multiprocess": false,
    "workers": 2
}
```

**参数说明**:
* `init_args`中的可配参数与`module.py`中的`_initialize`函数接口一致。其中,
  - 当`use_gpu`为`true`时,表示使用GPU启动服务。
  - 当`enable_mkldnn`为`true`时,表示使用MKL-DNN加速。
* `predict_args`中的可配参数与`module.py`中的`predict`函数接口一致。

**注意**:
* 使用配置文件启动服务时,将使用配置文件中的参数设置,其他命令行参数将被忽略;
* 如果使用 GPU 预测(即,`use_gpu`置为`true`),则需要在启动服务之前,设置 `CUDA_VISIBLE_DEVICES` 环境变量来指定所使用的 GPU 卡号,如:`export CUDA_VISIBLE_DEVICES=0`;
* **`use_gpu` 不可与 `use_multiprocess` 同时为 `true`**;
* **`use_gpu` 与 `enable_mkldnn` 同时为 `true` 时,将忽略 `enable_mkldnn`,而使用 GPU**。

如使用 GPU 3号卡启动服务:

```shell
cd PaddleClas/deploy
export CUDA_VISIBLE_DEVICES=3
hub serving start -c hubserving/clas/config.json
```

## 6. 发送预测请求

配置好服务端后,可使用以下命令发送预测请求,获取预测结果:

```shell
cd PaddleClas/deploy
python hubserving/test_hubserving.py server_url image_path
```  

**脚本参数说明**:
* **server_url**:服务地址,格式为  
`http://[ip_address]:[port]/predict/[module_name]`  
* **image_path**:测试图像路径,可以是单张图片路径,也可以是图像集合目录路径。
* **batch_size**:[**可选**] 以`batch_size`大小为单位进行预测,默认为`1`。
* **resize_short**:[**可选**] 预处理时,按短边调整大小,默认为`256`。
* **crop_size**:[**可选**] 预处理时,居中裁剪的大小,默认为`224`。
* **normalize**:[**可选**] 预处理时,是否进行`normalize`,默认为`True`。
* **to_chw**:[**可选**] 预处理时,是否调整为`CHW`顺序,默认为`True`。

**注意**:如果使用`Transformer`系列模型,如`DeiT_***_384`, `ViT_***_384`等,请注意模型的输入数据尺寸,需要指定`--resize_short=384 --crop_size=384`。

访问示例:

```shell
python hubserving/test_hubserving.py --server_url http://127.0.0.1:8866/predict/clas_system --image_file ./hubserving/ILSVRC2012_val_00006666.JPEG --batch_size 8
```

**返回结果格式说明**:
返回结果为列表(list),包含 top-k 个分类结果,以及对应的得分,还有此图片预测耗时,具体如下:
```
list: 返回结果
└─ list: 第一张图片结果
   └─ list: 前k个分类结果,依score递减排序
   └─ list: 前k个分类结果对应的score,依score递减排序
   └─ float: 该图分类耗时,单位秒
```

## 7. 自定义修改服务模块

如果需要修改服务逻辑,需要进行以下操作:  

1. 停止服务  
```hub serving stop --port/-p XXXX```  

2. 到相应的`module.py`和`params.py`等文件中根据实际需求修改代码。`module.py`修改后需要重新安装(`hub install hubserving/clas/`)并部署。在进行部署前,可通过`python hubserving/clas/module.py`测试已安装服务模块。

3. 卸载旧服务包  
```hub uninstall clas_system```  

4. 安装修改后的新服务包  
```hub install hubserving/clas/```  

5.重新启动服务  
```hub serving start -m clas_system```  

**注意**:
G
gaotingquan 已提交
189
常用参数可在 `PaddleClas/deploy/hubserving/clas/params.py` 中修改:
190 191 192 193 194 195 196 197 198 199 200 201 202
  * 更换模型,需要修改模型文件路径参数:
    ```python
    "inference_model_dir":
    ```
  * 更改后处理时返回的`top-k`结果数量:
    ```python
    'topk':
    ```
  * 更改后处理时的lable与class id对应映射文件:
    ```python
    'class_id_map_file':
    ```

G
gaotingquan 已提交
203
为了避免不必要的延时以及能够以 batch_size 进行预测,数据预处理逻辑(包括 `resize`、`crop` 等操作)均在客户端完成,因此需要在 `PaddleClas/deploy/hubserving/test_hubserving.py#L35-L52`中修改。