GRPC_IMPL_CN.md 3.8 KB
Newer Older
S
shaohua.zhang 已提交
1 2
# gRPC接口使用介绍

S
shaohua.zhang 已提交
3
{:toc}
B
add doc  
barrierye 已提交
4 5 6

gRPC 接口实现形式类似 Web Service:

S
shaohua.zhang 已提交
7 8 9
![](https://github.com/PaddlePaddle/Serving/blob/develop/doc/grpc_impl.png)

## 1. 与bRPC接口对比
B
add doc  
barrierye 已提交
10

S
shaohua.zhang 已提交
11
#### 1.1 服务端对比
B
add doc  
barrierye 已提交
12

S
shaohua.zhang 已提交
13
* gRPC Server 端 `load_model_config` 函数添加 `client_config_path` 参数:
B
add doc  
barrierye 已提交
14

S
shaohua.zhang 已提交
15
   ```
B
add doc  
barrierye 已提交
16 17
   def load_model_config(self, server_config_paths, client_config_path=None)
   ```
S
shaohua.zhang 已提交
18 19
    在一些例子中 bRPC Server 端与 bRPC Client 端的配置文件可能不同(如 在cube local 中,Client 端的数据先交给 cube,经过 cube 处理后再交给预测库),此时 gRPC Server 端需要手动设置 gRPC Client 端的配置`client_config_path`
    **`client_config_path` 默认为 `<server_config_path>/serving_server_conf.prototxt`。**
B
add doc  
barrierye 已提交
20

S
shaohua.zhang 已提交
21
#### 1.2 客服端对比
B
add doc  
barrierye 已提交
22

S
shaohua.zhang 已提交
23
* gRPC Client 端取消 `load_client_config` 步骤:
B
add doc  
barrierye 已提交
24 25 26

`connect` 步骤通过 RPC 获取相应的 prototxt(从任意一个 endpoint 获取即可)。

S
shaohua.zhang 已提交
27
* gRPC Client 需要通过 RPC 方式设置 timeout 时间(调用形式与 bRPC Client保持一致)
B
add doc  
barrierye 已提交
28

B
barrierye 已提交
29
   因为 bRPC Client 在 `connect` 后无法更改 timeout 时间,所以当 gRPC Server 收到变更 timeout 的调用请求时会重新创建 bRPC Client 实例以变更 bRPC Client timeout时间,同时 gRPC Client 会设置 gRPC 的 deadline 时间。
B
add doc  
barrierye 已提交
30

B
barrierye 已提交
31
   **注意,设置 timeout 接口和 Inference 接口不能同时调用(非线程安全),出于性能考虑暂时不加锁。**
B
add doc  
barrierye 已提交
32

S
shaohua.zhang 已提交
33
* gRPC Client 端 `predict` 函数添加 `asyn``is_python` 参数:
B
add doc  
barrierye 已提交
34

S
shaohua.zhang 已提交
35
   ```
B
add doc  
barrierye 已提交
36 37 38
   def predict(self, feed, fetch, need_variant_tag=False, asyn=False, is_python=True)
   ```

S
shaohua.zhang 已提交
39 40 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
1.    `asyn` 为异步调用选项。当 `asyn=True` 时为异步调用,返回 `MultiLangPredictFuture` 对象,通过 `MultiLangPredictFuture.result()` 阻塞获取预测值;当 `asyn=Fasle` 为同步调用。

2.    `is_python` 为 proto 格式选项。当 `is_python=True` 时,基于 numpy bytes 格式进行数据传输,目前只适用于 Python;当 `is_python=False` 时,以普通数据格式传输,更加通用。使用 numpy bytes 格式传输耗时比普通数据格式小很多(详见 [#654](https://github.com/PaddlePaddle/Serving/pull/654))。

#### 1.3 其他

* 异常处理:当 gRPC Server 端的 bRPC Client 预测失败(返回 `None`)时,gRPC Client 端同样返回None。其他 gRPC 异常会在 Client 内部捕获,并在返回的 fetch_map 中添加一个 "status_code" 字段来区分是否预测正常(参考 timeout 样例)。

* 由于 gRPC 只支持 pick_first 和 round_robin 负载均衡策略,ABTEST 特性还未打齐。

* 系统兼容性:
    * [x]  CentOS
    * [x]  macOS
    * [x]  Windows

* 已经支持的客户端语言:

   -  Python
   -  Java
   -  Go
   
   
## 2.示例:线性回归预测服务 
以下是采用gRPC实现的关于线性回归预测的一个示例,具体代码详见此[链接](https://github.com/PaddlePaddle/Serving/tree/develop/python/examples/grpc_impl_example/fit_a_line)
#### 获取数据

```shell
sh get_data.sh
```

#### 开启 gRPC 服务端

``` shell
python test_server.py uci_housing_model/
```

也可以通过下面的一行代码开启默认 gRPC 服务:

```shell
python -m paddle_serving_server.serve --model uci_housing_model --thread 10 --port 9393 --use_multilang
```

### 客户端预测

#### 同步预测

``` shell
python test_sync_client.py
```

#### 异步预测

``` shell
python test_asyn_client.py
```

#### Batch 预测
B
add doc  
barrierye 已提交
96

S
shaohua.zhang 已提交
97 98 99
``` shell
python test_batch_client.py
```
B
add doc  
barrierye 已提交
100

S
shaohua.zhang 已提交
101
#### 通用 pb 预测
B
add doc  
barrierye 已提交
102

S
shaohua.zhang 已提交
103 104 105
``` shell
python test_general_pb_client.py
```
B
add doc  
barrierye 已提交
106

S
shaohua.zhang 已提交
107
#### 预测超时
B
add doc  
barrierye 已提交
108

S
shaohua.zhang 已提交
109 110 111
``` shell
python test_timeout_client.py
```
B
add doc  
barrierye 已提交
112

S
shaohua.zhang 已提交
113
#### List 输入
B
add doc  
barrierye 已提交
114

S
shaohua.zhang 已提交
115 116 117 118 119
``` shell
python test_list_input_client.py
```
 
## 3. 更多示例
B
add doc  
barrierye 已提交
120

S
shaohua.zhang 已提交
121
详见[`python/examples/grpc_impl_example`](https://github.com/PaddlePaddle/Serving/tree/develop/python/examples/grpc_impl_example)下的示例文件。