NEW_WEB_SERVICE_CN.md 2.0 KB
Newer Older
B
barrierye 已提交
1 2 3 4
# 如何开发一个新的Web Service?

(简体中文|[English](NEW_WEB_SERVICE.md))

M
fix doc  
MRXLT 已提交
5
本文档将以Imagenet图像分类服务为例,来介绍如何开发一个新的Web Service。您可以在[这里](../python/examples/imagenet/resnet50_web_service.py)查阅完整的代码。
B
barrierye 已提交
6 7 8 9 10 11 12 13

## WebService基类

Paddle Serving实现了[WebService](https://github.com/PaddlePaddle/Serving/blob/develop/python/paddle_serving_server/web_service.py#L23)基类,您需要重写它的`preprocess`方法和`postprocess`方法,默认实现如下:

```python
class WebService(object):
  
B
barrierye 已提交
14
    def preprocess(self, feed={}, fetch=[]):
B
barrierye 已提交
15 16 17 18 19
        return feed, fetch
    def postprocess(self, feed={}, fetch=[], fetch_map=None):
        return fetch_map
```

B
barrierye 已提交
20
### preprocess方法
B
barrierye 已提交
21 22 23

preprocess方法有两个输入参数,`feed``fetch`。对于一个HTTP请求`request`

B
barrierye 已提交
24
- `feed`的值为请求数据中的feed部分`request.json["feed"]`
B
barrierye 已提交
25 26 27 28
- `fetch`的值为请求数据中的fetch部分`request.json["fetch"]`

返回值分别是预测过程中用到的feed和fetch值。

B
barrierye 已提交
29
### postprocess方法
B
barrierye 已提交
30 31 32

postprocess方法有三个输入参数,`feed``fetch``fetch_map`

B
barrierye 已提交
33
- `feed`的值为请求数据中的feed部分`request.json["feed"]`
B
barrierye 已提交
34 35 36 37 38 39 40 41 42
- `fetch`的值为请求数据中的fetch部分`request.json["fetch"]`
- `fetch_map`的值为fetch到的模型输出值

返回值将会被处理成`{"reslut": fetch_map}`作为HTTP请求的返回。

## 开发ImageService类

```python
class ImageService(WebService):
B
barrierye 已提交
43

B
barrierye 已提交
44 45
    def preprocess(self, feed={}, fetch=[]):
        reader = ImageReader()
B
barrierye 已提交
46 47 48 49 50
        feed_batch = []
        for ins in feed:
            if "image" not in ins:
                raise ("feed data error!")
            sample = base64.b64decode(ins["image"])
B
barrierye 已提交
51
            img = reader.process_image(sample)
B
barrierye 已提交
52 53
            feed_batch.append({"image": img})
        return feed_batch, fetch
B
barrierye 已提交
54 55 56
```

对于上述的`ImageService`,只重写了前处理方法,将base64格式的图片数据处理成模型预测需要的数据格式。