serving.md 6.6 KB
Newer Older
T
Ting Wang 已提交
1
# 基于MindSpore部署推理服务
D
dinghao 已提交
2

J
JunYuLiu 已提交
3
`Ascend` `环境准备` `企业` `高级`
D
dinghao 已提交
4 5

<!-- TOC -->
T
Ting Wang 已提交
6 7 8 9 10 11 12

- [基于MindSpore部署推理服务](#基于mindspore部署推理服务)
    - [概述](#概述)
    - [启动Serving服务](#启动serving服务)
    - [应用示例](#应用示例)
        - [导出模型](#导出模型)
        - [启动Serving推理服务](#启动serving推理服务)
H
hexia 已提交
13
        - [gRPC客户端示例](#gRPC客户端示例)
X
xuyongfei 已提交
14 15
            - [Python客户端示例](#python客户端示例)
            - [C++客户端示例](#cpp客户端示例)
H
hexia 已提交
16
        - [REST API客户端示例](#restapi客户端示例)
D
dinghao 已提交
17 18 19 20 21 22 23

<!-- /TOC -->
<a href="https://gitee.com/mindspore/docs/blob/master/tutorials/source_zh_cn/advanced_use/serving.md" target="_blank"><img src="../_static/logo_source.png"></a>


## 概述

T
Ting Wang 已提交
24
MindSpore Serving是一个轻量级、高性能的服务模块,旨在帮助MindSpore开发者在生产环境中高效部署在线推理服务。当用户使用MindSpore完成模型训练后,导出MindSpore模型,即可使用MindSpore Serving创建该模型的推理服务。当前Serving仅支持Ascend 910。
D
dinghao 已提交
25 26 27 28 29 30 31 32 33 34 35 36 37 38


## 启动Serving服务
通过pip安装MindSpore后,Serving可执行程序位于`/{your python path}/lib/python3.7/site-packages/mindspore/ms_serving`
启动Serving服务命令如下
```bash
ms_serving [--help] [--model_path <MODEL_PATH>] [--model_name <MODEL_NAME>]
                  [--port <PORT>] [--device_id <DEVICE_ID>]
```
参数含义如下

|参数名|属性|功能描述|参数类型|默认值|取值范围|
|---|---|---|---|---|---|
|`--help`|可选|显示启动命令的帮助信息。|-|-|-|
X
xuyongfei 已提交
39 40
|`--model_path=<MODEL_PATH>`|必选|指定待加载模型的存放路径。|String|空|-|
|`--model_name=<MODEL_NAME>`|必选|指定待加载模型的文件名。|String|空|-|
H
hexia 已提交
41 42
|`--port=<PORT>`|可选|指定Serving对外的gRPC端口号。|Integer|5500|1~65535|
|`--rest_api_port=<PORT>`|可选|指定Serving对外的REST API端口号。|Integer|5501|1~65535|
X
xuyongfei 已提交
43
|`--device_id=<DEVICE_ID>`|可选|指定使用的设备号|Integer|0|0~7|
D
dinghao 已提交
44 45

 > 执行启动命令前,需将`/{your python path}/lib:/{your python path}/lib/python3.7/site-packages/mindspore/lib`对应的路径加入到环境变量LD_LIBRARY_PATH中 。
H
hexia 已提交
46
 > port与rest_api_port不可相同。
D
dinghao 已提交
47 48 49 50 51 52 53 54 55 56

## 应用示例
下面以一个简单的网络为例,演示MindSpore Serving如何使用。

### 导出模型
使用[add_model.py](https://gitee.com/mindspore/mindspore/blob/master/serving/example/export_model/add_model.py),构造一个只有Add算子的网络,并导出MindSpore推理部署模型。

```python
python add_model.py
```
X
xuyongfei 已提交
57
执行脚本,生成`tensor_add.mindir`文件,该模型的输入为两个shape为[2,2]的二维Tensor,输出结果是两个输入Tensor之和。
D
dinghao 已提交
58 59 60

### 启动Serving推理服务
```bash
X
xuyongfei 已提交
61
ms_serving --model_path={model directory} --model_name=tensor_add.mindir
D
dinghao 已提交
62
```
H
hexia 已提交
63 64
当服务端打印日志`MS Serving grpc Listening on 0.0.0.0:5500`时,表示Serving gRPC服务已加载推理模型完毕。
当服务端打印日志`MS Serving restful Listening on 0.0.0.0:5501`时,表示Serving REST服务已加载推理模型完毕。
D
dinghao 已提交
65

H
hexia 已提交
66
### gRPC客户端示例
X
xuyongfei 已提交
67 68
#### <span name="python客户端示例">Python客户端示例</span>
获取[ms_client.py](https://gitee.com/mindspore/mindspore/blob/master/serving/example/python_client/ms_client.py),启动Python客户端。
D
dinghao 已提交
69
```bash
X
xuyongfei 已提交
70
python ms_client.py
D
dinghao 已提交
71
```
X
xuyongfei 已提交
72

D
dinghao 已提交
73 74
显示如下返回值说明Serving服务已正确执行Add网络的推理。
```
X
xuyongfei 已提交
75
ms client received:
X
xuyongfei 已提交
76 77
[[2. 2.]
 [2. 2.]]
D
dinghao 已提交
78
```
X
xuyongfei 已提交
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97

#### <span name="cpp客户端示例">C++客户端示例</span>
1. 获取客户端示例执行程序

    首先需要下载[MindSpore源码](https://gitee.com/mindspore/mindspore)。有两种方式编译并获取客户端示例程序:
    + 从源码编译MindSpore时候,将会编译产生Serving C++客户端示例程序,可在`build/mindspore/serving/example/cpp_client`目录下找到`ms_client`可执行程序。
    + 独立编译:

        需要先预装[gRPC](https://gRPC.io)。

        然后,在MindSpore源码路径中执行如下命令,编译一个客户端示例程序。
        ```bash
        cd mindspore/serving/example/cpp_client
        mkdir build && cd build
        cmake -D GRPC_PATH={grpc_install_dir} ..
        make
        ```
        其中`{grpc_install_dir}`为gRPC安装时的路径,请替换为实际gRPC安装路径。

H
hexia 已提交
98
2. 启动gRPC客户端
X
xuyongfei 已提交
99 100 101 102 103 104 105

    执行ms_client,向Serving服务发送推理请求:
    ```bash
    ./ms_client --target=localhost:5500
    ```
    显示如下返回值说明Serving服务已正确执行Add网络的推理。
    ```
X
xuyongfei 已提交
106 107
    Compute [[1, 2], [3, 4]] + [[1, 2], [3, 4]]
    Add result is 2 4 6 8
X
xuyongfei 已提交
108 109
    client received: RPC OK
    ```
D
dinghao 已提交
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

客户端代码主要包含以下几个部分:

1. 基于MSService::Stub实现Client,并创建Client实例。
    ```
    class MSClient {
     public:
      explicit MSClient(std::shared_ptr<Channel> channel) :  stub_(MSService::NewStub(channel)) {}
     private:
      std::unique_ptr<MSService::Stub> stub_;
    };MSClient client(grpc::CreateChannel(target_str, grpc::InsecureChannelCredentials()));
    
    MSClient client(grpc::CreateChannel(target_str, grpc::InsecureChannelCredentials()));
    
    ```
2. 根据网络的实际输入构造请求的入参Request、出参Reply和gRPC的客户端Context。
    ```
    PredictRequest request;
    PredictReply reply;
    ClientContext context;
    
    //construct tensor
    Tensor data;
    
    //set shape
    TensorShape shape;
H
hexia 已提交
136 137
    shape.add_dims(2);
    shape.add_dims(2);
D
dinghao 已提交
138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
    *data.mutable_tensor_shape() = shape;
    
    //set type
    data.set_tensor_type(ms_serving::MS_FLOAT32);
    std::vector<float> input_data{1, 2, 3, 4};
    
    //set datas
    data.set_data(input_data.data(), input_data.size());
    
    //add tensor to request
    *request.add_data() = data;
    *request.add_data() = data;
    ```
3. 调用gRPC接口和已经启动的Serving服务通信,并取回返回值。
    ```
    Status status = stub_->Predict(&context, request, &reply);
    ```

完整代码参考[ms_client](https://gitee.com/mindspore/mindspore/blob/master/serving/example/cpp_client/ms_client.cc)

H
hexia 已提交
158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
### REST API客户端示例
以data形式发送数据:
```
curl -X POST -d '{"data": [[1.0, 2.0, 3.0, 4.0], [1.0, 2.0, 3.0, 4.0]]"}' http://127.0.0.1:5501
```

显示如下返回值,说明Serving服务已正确执行Add网络的推理:
```
{"data":[[2,4], [6,8]]}
```

以tensor形式发送数据:
```
curl -X POST -d '{"tensor": [[[1.0, 2.0], [3.0, 4.0]], [[1.0, 2.0], [3.0, 4.0]]]"}' http://127.0.0.1:5501
```

显示如下返回值,说明Serving服务已正确执行Add网络的推理:
```
{"tensor":[[2,4], [6,8]]}
```