Serving Predictor

介绍目前支持的 Predictor 以及其编写方式

最后更新于

目前 OpenBayes 模型部署支持两种部署模式:

  1. ONNX 模型的部署
  2. Python 通用模型部署

其中 ONNX 格式模型部署对 *.onnx 格式模型在其所使用的 ONNXPredictor 做了封装,省去了 *.onnx 模型加载的一些通用代码。Python 则支持所有格式和框架的模型部署。

目录结构

模型部署必须包含两部分内容:

  1. predictor.py 以及其所依赖的文件,用于模型请求的处理
  2. 模型文件

其中 predictor.py 的在不同的模式下其结构略有区别,下文会一一介绍。模型文件的导出在模型导出有详细的介绍。

任何需要在 predictor.py 中引用的文件都需要放同目录或者其子目录下,比如需要一个 classes.json 的文件用于存放分类的信息,则可以以如下方式在 predictor.py 文件中访问:

import json

class PythonPredictor:
    def __init__(self, config):
        with open('classes.json', 'r') as f:
            values = json.load(f)
        self.values = values

    ...

pytorch/image-classifier-resnet50 中包含完整的项目示例。

PythonPredictor

模板

PythonPredictor 的模板如下所示:

class PythonPredictor:
    def __init__(self):
        """
        负责加载相应的模型以及对元数据的初始化
        """
        pass

    def predict(self, payload, query_params, headers):
        """
        在每次请求都会被调用
        接受 HTTP 请求的内容(`payload`、`query_params`、`headers`)
        进行必要的预处理(preprocess)后预测结果,
        最终将结果进行后处理(postprocess)并返回给调用方

        Args:
            payload: 请求的 requestBody (支持格式在下文有解释) (optional).
            query_params: query parameters 的字典 (optional).
            headers: 请求头(Header)的字典 (optional).

        Returns:
            预测结果
        """
        pass

其中 payload 参数会依据 HTTP 请求的 Content-Type 头进行解析:

  • 对于 Content-Type: application/json payload 将按照 JSON 格式做解析为字典(Dict)
  • 对于 Content-Type: multipart/formContent-Type: application/x-www-form-urlencoded payload 会被解析为 starlette.datastructures.FormData 类型(也是键值对,通过 value = payload[key] 的方式获取内容。其中 key 一定是字符串,value 对一般的文本内容是字符串,对上传的文件则是 starlette.datastructures.UploadFile
  • 对于其他 Content-Typepayload 统一解析为 bytes

这里UploadFile 类型以及其方法做了详细的解释。

样例

这里提供 pytorch/object-detectorpredictor.py 文件:

from io import BytesIO

import requests
import torch
from PIL import Image
from torchvision import models
from torchvision import transforms


class PythonPredictor:
    def __init__(self):
        self.device = "cuda" if torch.cuda.is_available() else "cpu"
        print(f"using device: {self.device}")

        model = models.detection.fasterrcnn_resnet50_fpn(pretrained=False, pretrained_backbone=False)
        model.load_state_dict(torch.load("fasterrcnn_resnet50_fpn_coco-258fb6c6.pth"))
        model = model.to(self.device)
        model.eval()

        self.preprocess = transforms.Compose([transforms.ToTensor()])

        with open("coco_labels.txt") as f:
            self.coco_labels = f.read().splitlines()

        self.model = model

    def predict(self, payload):
        # 只使用了 payload 参数,其内容为 Dict 格式,直接通过 payload[key] 的形式获取内容即可
        threshold = float(payload["threshold"])
        image = requests.get(payload["url"]).content
        img_pil = Image.open(BytesIO(image))
        img_tensor = self.preprocess(img_pil).to(self.device)
        img_tensor.unsqueeze_(0)

        with torch.no_grad():
            pred = self.model(img_tensor)

        predicted_class = [self.coco_labels[i] for i in pred[0]["labels"].cpu().tolist()]
        predicted_boxes = [
            [(i[0], i[1]), (i[2], i[3])] for i in pred[0]["boxes"].detach().cpu().tolist()
        ]
        predicted_score = pred[0]["scores"].detach().cpu().tolist()
        predicted_t = [predicted_score.index(x) for x in predicted_score if x > threshold]
        if len(predicted_t) == 0:
            return [], []

        predicted_t = predicted_t[-1]
        predicted_boxes = predicted_boxes[: predicted_t + 1]
        predicted_class = predicted_class[: predicted_t + 1]
        return predicted_boxes, predicted_class

依赖

预装依赖列表如下:

# packages in environment at /usr/local:
#
# Name                    Version                   Build  Channel
_libgcc_mutex             0.1                        main    defaults
absl-py                   0.10.0                   pypi_0    pypi
argon2-cffi               20.1.0                   pypi_0    pypi
astor                     0.8.1                    pypi_0    pypi
attrs                     20.2.0                   pypi_0    pypi
autograd                  1.3                      pypi_0    pypi
backcall                  0.2.0                    pypi_0    pypi
bleach                    3.1.5                    pypi_0    pypi
blis                      0.4.1                    pypi_0    pypi
boost                     1.71.0                   py36_0    https://conda.anaconda.org/anaconda
boto3                     1.14.56                  pypi_0    pypi
botocore                  1.17.56                  pypi_0    pypi
brotlipy                  0.7.0           py36h7b6447c_1000    defaults
bzip2                     1.0.8                h7b6447c_0    https://conda.anaconda.org/anaconda
ca-certificates           2020.7.22                     0    https://conda.anaconda.org/anaconda
cachetools                4.1.1                    pypi_0    pypi
catalogue                 1.0.0                    pypi_0    pypi
certifi                   2020.6.20                py36_0    https://conda.anaconda.org/anaconda
cffi                      1.14.0           py36he30daa8_1    defaults
chardet                   3.0.4                 py36_1003    defaults
click                     7.1.2                    pypi_0    pypi
cloudpickle               1.5.0                    pypi_0    pypi
conda                     4.8.4                    py36_0    https://conda.anaconda.org/anaconda
conda-package-handling    1.6.1            py36h7b6447c_0    defaults
cryptography              2.9.2            py36h1ba5d50_0    defaults
cupy-cuda101              8.0.0rc1                 pypi_0    pypi
cycler                    0.10.0                   pypi_0    pypi
cymem                     2.0.3                    pypi_0    pypi
cython                    0.29.21                  pypi_0    pypi
dataclasses               0.7                      pypi_0    pypi
decorator                 4.4.2                    pypi_0    pypi
defusedxml                0.6.0                    pypi_0    pypi
dill                      0.3.2                    pypi_0    pypi
dlib                      19.20            py36h292bde3_1    conda-forge
docutils                  0.15.2                   pypi_0    pypi
entrypoints               0.3                      pypi_0    pypi
enum34                    1.1.10                   pypi_0    pypi
fastai                    2.0.8                    pypi_0    pypi
fastapi                   0.61.0                   pypi_0    pypi
fastcore                  1.0.1                    pypi_0    pypi
fastprogress              1.0.0                    pypi_0    pypi
fastrlock                 0.5                      pypi_0    pypi
ffmpeg-python             0.2.0                    pypi_0    pypi
future                    0.18.2                   pypi_0    pypi
gast                      0.2.2                    pypi_0    pypi
gdal                      3.0.4                    pypi_0    pypi
google-auth               1.21.1                   pypi_0    pypi
google-auth-oauthlib      0.4.1                    pypi_0    pypi
google-pasta              0.2.0                    pypi_0    pypi
grpcio                    1.31.0                   pypi_0    pypi
h11                       0.9.0                    pypi_0    pypi
h5py                      2.10.0                   pypi_0    pypi
horovod                   0.20.0                   pypi_0    pypi
httptools                 0.1.1                    pypi_0    pypi
icu                       58.2                 he6710b0_3    https://conda.anaconda.org/anaconda
idna                      2.10                       py_0    defaults
imageio                   2.9.0                    pypi_0    pypi
imageio-ffmpeg            0.4.2                    pypi_0    pypi
importlib-metadata        1.7.0                    pypi_0    pypi
ipykernel                 5.3.4                    pypi_0    pypi
ipython                   7.16.1                   pypi_0    pypi
ipython-genutils          0.2.0                    pypi_0    pypi
ipywidgets                7.5.1                    pypi_0    pypi
jedi                      0.17.2                   pypi_0    pypi
jieba                     0.42.1                   pypi_0    pypi
jinja2                    2.11.2                   pypi_0    pypi
jmespath                  0.10.0                   pypi_0    pypi
joblib                    0.16.0                   pypi_0    pypi
jpeg                      9d                   h516909a_0    conda-forge
json5                     0.9.5                    pypi_0    pypi
jsonschema                3.2.0                    pypi_0    pypi
jupyter                   1.0.0                    pypi_0    pypi
jupyter-client            6.1.7                    pypi_0    pypi
jupyter-console           6.2.0                    pypi_0    pypi
jupyter-core              4.6.3                    pypi_0    pypi
jupyterlab                2.0.2                    pypi_0    pypi
jupyterlab-server         1.0.9                    pypi_0    pypi
keras                     2.3.1                    pypi_0    pypi
keras-applications        1.0.8                    pypi_0    pypi
keras-preprocessing       1.1.0                    pypi_0    pypi
kiwisolver                1.2.0                    pypi_0    pypi
ld_impl_linux-64          2.33.1               h53a641e_7    defaults
libblas                   3.8.0               17_openblas    conda-forge
libboost                  1.71.0               h97c9712_0    https://conda.anaconda.org/anaconda
libcblas                  3.8.0               17_openblas    conda-forge
libedit                   3.1.20191231         h7b6447c_0    defaults
libffi                    3.3                  he6710b0_2    defaults
libgcc-ng                 9.1.0                hdf63c60_0    defaults
libgfortran-ng            7.5.0               hdf63c60_13    conda-forge
liblapack                 3.8.0               17_openblas    conda-forge
libopenblas               0.3.10          pthreads_hb3c22a3_4    conda-forge
libpng                    1.6.37               hed695b0_1    conda-forge
libstdcxx-ng              9.1.0                hdf63c60_0    defaults
lightgbm                  2.3.1                    pypi_0    pypi
markdown                  3.2.2                    pypi_0    pypi
markupsafe                1.1.1                    pypi_0    pypi
matplotlib                3.3.0                    pypi_0    pypi
mistune                   0.8.4                    pypi_0    pypi
msgpack                   1.0.0                    pypi_0    pypi
murmurhash                1.0.2                    pypi_0    pypi
nbconvert                 5.6.1                    pypi_0    pypi
nbformat                  5.0.7                    pypi_0    pypi
ncurses                   6.2                  he6710b0_1    defaults
networkx                  2.4                      pypi_0    pypi
notebook                  6.1.3                    pypi_0    pypi
numpy                     1.19.1           py36h7314795_0    conda-forge
oauthlib                  3.1.0                    pypi_0    pypi
onnx                      1.7.0                    pypi_0    pypi
onnxruntime               1.4.0                    pypi_0    pypi
openbayestool             0.2.8                    pypi_0    pypi
opencv-python             4.1.1.100                pypi_0    pypi
opencv-python-headless    4.1.1.100                pypi_0    pypi
openssl                   1.1.1g               h7b6447c_0    https://conda.anaconda.org/anaconda
opt-einsum                3.3.0                    pypi_0    pypi
packaging                 20.4                     pypi_0    pypi
pandas                    1.1.0                    pypi_0    pypi
pandocfilters             1.4.2                    pypi_0    pypi
parso                     0.7.1                    pypi_0    pypi
pexpect                   4.8.0                    pypi_0    pypi
pickleshare               0.7.5                    pypi_0    pypi
pillow                    6.2.2                    pypi_0    pypi
pip                       20.1.1                   py36_1    defaults
plac                      1.1.3                    pypi_0    pypi
preshed                   3.0.2                    pypi_0    pypi
prometheus-client         0.8.0                    pypi_0    pypi
prompt-toolkit            3.0.5                    pypi_0    pypi
protobuf                  3.13.0                   pypi_0    pypi
psutil                    5.7.2                    pypi_0    pypi
ptyprocess                0.6.0                    pypi_0    pypi
py-boost                  1.71.0           py36h0573a6f_0    https://conda.anaconda.org/anaconda
pyasn1                    0.4.8                    pypi_0    pypi
pyasn1-modules            0.2.8                    pypi_0    pypi
pycosat                   0.6.3            py36h7b6447c_0    defaults
pycparser                 2.20                       py_0    defaults
pydantic                  1.6.1                    pypi_0    pypi
pygments                  2.6.1                    pypi_0    pypi
pyopenssl                 19.1.0                   py36_0    defaults
pyparsing                 2.4.7                    pypi_0    pypi
pyrsistent                0.16.0                   pypi_0    pypi
pysocks                   1.7.1                    py36_0    defaults
python                    3.6.10               h7579374_2    defaults
python-dateutil           2.8.1                    pypi_0    pypi
python-graphviz           0.14.1                   pypi_0    pypi
python-multipart          0.0.5                    pypi_0    pypi
python_abi                3.6                     1_cp36m    conda-forge
pytorch-ignite            0.4.1                    pypi_0    pypi
pytz                      2020.1                   pypi_0    pypi
pywavelets                1.1.1                    pypi_0    pypi
pyyaml                    5.3.1                    pypi_0    pypi
pyzmq                     19.0.2                   pypi_0    pypi
qtconsole                 4.7.7                    pypi_0    pypi
qtpy                      1.9.0                    pypi_0    pypi
readline                  8.0                  h7b6447c_0    defaults
requests                  2.24.0                     py_0    defaults
requests-oauthlib         1.3.0                    pypi_0    pypi
rsa                       4.6                      pypi_0    pypi
ruamel_yaml               0.15.87          py36h7b6447c_1    defaults
s3transfer                0.3.3                    pypi_0    pypi
scikit-image              0.17.2                   pypi_0    pypi
scikit-learn              0.23.1                   pypi_0    pypi
scipy                     1.4.1                    pypi_0    pypi
send2trash                1.5.0                    pypi_0    pypi
setuptools                49.2.0                   pypi_0    pypi
six                       1.15.0                     py_0    defaults
spacy                     2.3.2                    pypi_0    pypi
sqlite                    3.32.3               h62c20be_0    defaults
srsly                     1.0.2                    pypi_0    pypi
starlette                 0.13.6                   pypi_0    pypi
tensorboard               2.1.1                    pypi_0    pypi
tensorflow                2.1.0.100                pypi_0    pypi
tensorflow-estimator      2.1.0                    pypi_0    pypi
tensorflow-gpu            2.1.0                    pypi_0    pypi
tensorflow-serving-api    2.1.0                    pypi_0    pypi
termcolor                 1.1.0                    pypi_0    pypi
terminado                 0.8.3                    pypi_0    pypi
testpath                  0.4.4                    pypi_0    pypi
thinc                     7.4.1                    pypi_0    pypi
threadpoolctl             2.1.0                    pypi_0    pypi
tifffile                  2020.7.24                pypi_0    pypi
tk                        8.6.10               hbc83047_0    defaults
torch                     1.6.0+cu101              pypi_0    pypi
torchvision               0.7.0+cu101              pypi_0    pypi
tornado                   6.0.4                    pypi_0    pypi
tqdm                      4.47.0                     py_0    defaults
traitlets                 4.3.3                    pypi_0    pypi
typing                    3.7.4.3                  pypi_0    pypi
typing-extensions         3.7.4.3                  pypi_0    pypi
urllib3                   1.25.9                     py_0    defaults
uvicorn                   0.11.8                   pypi_0    pypi
uvloop                    0.14.0                   pypi_0    pypi
wasabi                    0.8.0                    pypi_0    pypi
wcwidth                   0.2.5                    pypi_0    pypi
webencodings              0.5.1                    pypi_0    pypi
websockets                8.1                      pypi_0    pypi
werkzeug                  1.0.1                    pypi_0    pypi
wheel                     0.34.2                   py36_0    defaults
widgetsnbextension        3.5.1                    pypi_0    pypi
wrapt                     1.12.1                   pypi_0    pypi
xgboost                   1.2.0                    pypi_0    pypi
xlrd                      1.2.0                    pypi_0    pypi
xz                        5.2.5                h7b6447c_0    defaults
yaml                      0.2.5                h7b6447c_0    defaults
zipp                      3.1.0                    pypi_0    pypi
zlib                      1.2.11               h7b6447c_3    defaults
zstd                      1.3.7                h0b5b093_0    https://conda.anaconda.org/anaconda

ONNXPredictor

模板

class ONNXPredictor:
    def __init__(self, onnx_client):
        """
        负责加载相应的模型以及对元数据的初始化

        Args:
            onnx_client: ONNX 客户端.
        """
        self.client = onnx_client

    def predict(self, payload, query_params, headers):
        """
        在每次请求都会被调用
        接受 HTTP 请求的内容(`payload`、`query_params`、`headers`)
        进行必要的预处理(preprocess)后预测结果,
        最终将结果进行后处理(postprocess)并返回给调用方

        Args:
            payload: 请求的 requestBody (支持格式在下文有解释) (optional).
            query_params: query parameters 的字典 (optional).
            headers: 请求头(Header)的字典 (optional).

        Returns:
            预测结果
        """
        pass

ONNXPredictor 初始化时会传递一个 onnx_client 参数,它是 ONNXClient 的一个实例,负责管理 onnx 模型加载和调用。在 def predict 方法里可以通过 self.client.predict(<model_input>) 方法获取推理结果,其中 self.client.predict 所传递的参数为 numpy.array 类型。

其中 payload 参数会依据 HTTP 请求的 Content-Type 头进行解析:

  • 对于 Content-Type: application/json payload 将按照 JSON 格式做解析为字典(Dict)
  • 对于 Content-Type: multipart/formContent-Type: application/x-www-form-urlencoded payload 会被解析为 starlette.datastructures.FormData 类型(也是键值对,通过 value = payload[key] 的方式获取内容。其中 key 一定是字符串,value 对一般的文本内容是字符串,对上传的文件则是 starlette.datastructures.UploadFile
  • 对于其他 Content-Typepayload 统一解析为 bytes

这里UploadFile 类型以及其方法做了详细的解释。

样例

这里提供 onnx/image-classifier-mobilenetv2/predictor.py 中的 predictor.py 作为示例:

class ONNXPredictor:
    def __init__(self, onnx_client, config):
        # onnx client
        self.client = onnx_client

        # for image classifiers
        classes = json.load(open('imagenet_class_index.json'))
        self.image_classes = [classes[str(k)][1] for k in range(len(classes))]
        self.resize_value = 224

    def predict(self, payload, query_params):
        # get request params
        img_url = payload["url"]

        # process the input
        img = get_url_image(img_url)
        img = image_resize(img, height=self.resize_value, width=self.resize_value)
        img = preprocess(img)

        # predict
        results = self.client.predict(img)[0]

        # interpret result
        result = postprocess(results)
        predicted_label = self.image_classes[result]

        return {"label": predicted_label}

依赖

预装依赖如下:

# packages in environment at /usr/local:
#
# Name                    Version                   Build  Channel
_libgcc_mutex             0.1                        main    defaults
absl-py                   0.10.0                   pypi_0    pypi
argon2-cffi               20.1.0                   pypi_0    pypi
astor                     0.8.1                    pypi_0    pypi
attrs                     20.2.0                   pypi_0    pypi
autograd                  1.3                      pypi_0    pypi
backcall                  0.2.0                    pypi_0    pypi
bleach                    3.1.5                    pypi_0    pypi
blis                      0.4.1                    pypi_0    pypi
boost                     1.71.0                   py36_0    https://conda.anaconda.org/anaconda
boto3                     1.14.56                  pypi_0    pypi
botocore                  1.17.56                  pypi_0    pypi
brotlipy                  0.7.0           py36h7b6447c_1000    defaults
bzip2                     1.0.8                h7b6447c_0    https://conda.anaconda.org/anaconda
ca-certificates           2020.7.22                     0    https://conda.anaconda.org/anaconda
cachetools                4.1.1                    pypi_0    pypi
catalogue                 1.0.0                    pypi_0    pypi
certifi                   2020.6.20                py36_0    https://conda.anaconda.org/anaconda
cffi                      1.14.0           py36he30daa8_1    defaults
chardet                   3.0.4                 py36_1003    defaults
click                     7.1.2                    pypi_0    pypi
cloudpickle               1.5.0                    pypi_0    pypi
conda                     4.8.4                    py36_0    https://conda.anaconda.org/anaconda
conda-package-handling    1.6.1            py36h7b6447c_0    defaults
cryptography              2.9.2            py36h1ba5d50_0    defaults
cupy-cuda101              8.0.0rc1                 pypi_0    pypi
cycler                    0.10.0                   pypi_0    pypi
cymem                     2.0.3                    pypi_0    pypi
cython                    0.29.21                  pypi_0    pypi
dataclasses               0.7                      pypi_0    pypi
decorator                 4.4.2                    pypi_0    pypi
defusedxml                0.6.0                    pypi_0    pypi
dill                      0.3.2                    pypi_0    pypi
dlib                      19.20            py36h292bde3_1    conda-forge
docutils                  0.15.2                   pypi_0    pypi
entrypoints               0.3                      pypi_0    pypi
enum34                    1.1.10                   pypi_0    pypi
fastai                    2.0.8                    pypi_0    pypi
fastapi                   0.61.0                   pypi_0    pypi
fastcore                  1.0.1                    pypi_0    pypi
fastprogress              1.0.0                    pypi_0    pypi
fastrlock                 0.5                      pypi_0    pypi
ffmpeg-python             0.2.0                    pypi_0    pypi
future                    0.18.2                   pypi_0    pypi
gast                      0.2.2                    pypi_0    pypi
gdal                      3.0.4                    pypi_0    pypi
google-auth               1.21.1                   pypi_0    pypi
google-auth-oauthlib      0.4.1                    pypi_0    pypi
google-pasta              0.2.0                    pypi_0    pypi
grpcio                    1.31.0                   pypi_0    pypi
h11                       0.9.0                    pypi_0    pypi
h5py                      2.10.0                   pypi_0    pypi
horovod                   0.20.0                   pypi_0    pypi
httptools                 0.1.1                    pypi_0    pypi
icu                       58.2                 he6710b0_3    https://conda.anaconda.org/anaconda
idna                      2.10                       py_0    defaults
imageio                   2.9.0                    pypi_0    pypi
imageio-ffmpeg            0.4.2                    pypi_0    pypi
importlib-metadata        1.7.0                    pypi_0    pypi
ipykernel                 5.3.4                    pypi_0    pypi
ipython                   7.16.1                   pypi_0    pypi
ipython-genutils          0.2.0                    pypi_0    pypi
ipywidgets                7.5.1                    pypi_0    pypi
jedi                      0.17.2                   pypi_0    pypi
jieba                     0.42.1                   pypi_0    pypi
jinja2                    2.11.2                   pypi_0    pypi
jmespath                  0.10.0                   pypi_0    pypi
joblib                    0.16.0                   pypi_0    pypi
jpeg                      9d                   h516909a_0    conda-forge
json5                     0.9.5                    pypi_0    pypi
jsonschema                3.2.0                    pypi_0    pypi
jupyter                   1.0.0                    pypi_0    pypi
jupyter-client            6.1.7                    pypi_0    pypi
jupyter-console           6.2.0                    pypi_0    pypi
jupyter-core              4.6.3                    pypi_0    pypi
jupyterlab                2.0.2                    pypi_0    pypi
jupyterlab-server         1.0.9                    pypi_0    pypi
keras                     2.3.1                    pypi_0    pypi
keras-applications        1.0.8                    pypi_0    pypi
keras-preprocessing       1.1.0                    pypi_0    pypi
kiwisolver                1.2.0                    pypi_0    pypi
ld_impl_linux-64          2.33.1               h53a641e_7    defaults
libblas                   3.8.0               17_openblas    conda-forge
libboost                  1.71.0               h97c9712_0    https://conda.anaconda.org/anaconda
libcblas                  3.8.0               17_openblas    conda-forge
libedit                   3.1.20191231         h7b6447c_0    defaults
libffi                    3.3                  he6710b0_2    defaults
libgcc-ng                 9.1.0                hdf63c60_0    defaults
libgfortran-ng            7.5.0               hdf63c60_13    conda-forge
liblapack                 3.8.0               17_openblas    conda-forge
libopenblas               0.3.10          pthreads_hb3c22a3_4    conda-forge
libpng                    1.6.37               hed695b0_1    conda-forge
libstdcxx-ng              9.1.0                hdf63c60_0    defaults
lightgbm                  2.3.1                    pypi_0    pypi
markdown                  3.2.2                    pypi_0    pypi
markupsafe                1.1.1                    pypi_0    pypi
matplotlib                3.3.0                    pypi_0    pypi
mistune                   0.8.4                    pypi_0    pypi
msgpack                   1.0.0                    pypi_0    pypi
murmurhash                1.0.2                    pypi_0    pypi
nbconvert                 5.6.1                    pypi_0    pypi
nbformat                  5.0.7                    pypi_0    pypi
ncurses                   6.2                  he6710b0_1    defaults
networkx                  2.4                      pypi_0    pypi
notebook                  6.1.3                    pypi_0    pypi
numpy                     1.19.1           py36h7314795_0    conda-forge
oauthlib                  3.1.0                    pypi_0    pypi
onnx                      1.7.0                    pypi_0    pypi
onnxruntime               1.4.0                    pypi_0    pypi
openbayestool             0.2.8                    pypi_0    pypi
opencv-python             4.1.1.100                pypi_0    pypi
opencv-python-headless    4.1.1.100                pypi_0    pypi
openssl                   1.1.1g               h7b6447c_0    https://conda.anaconda.org/anaconda
opt-einsum                3.3.0                    pypi_0    pypi
packaging                 20.4                     pypi_0    pypi
pandas                    1.1.0                    pypi_0    pypi
pandocfilters             1.4.2                    pypi_0    pypi
parso                     0.7.1                    pypi_0    pypi
pexpect                   4.8.0                    pypi_0    pypi
pickleshare               0.7.5                    pypi_0    pypi
pillow                    6.2.2                    pypi_0    pypi
pip                       20.1.1                   py36_1    defaults
plac                      1.1.3                    pypi_0    pypi
preshed                   3.0.2                    pypi_0    pypi
prometheus-client         0.8.0                    pypi_0    pypi
prompt-toolkit            3.0.5                    pypi_0    pypi
protobuf                  3.13.0                   pypi_0    pypi
psutil                    5.7.2                    pypi_0    pypi
ptyprocess                0.6.0                    pypi_0    pypi
py-boost                  1.71.0           py36h0573a6f_0    https://conda.anaconda.org/anaconda
pyasn1                    0.4.8                    pypi_0    pypi
pyasn1-modules            0.2.8                    pypi_0    pypi
pycosat                   0.6.3            py36h7b6447c_0    defaults
pycparser                 2.20                       py_0    defaults
pydantic                  1.6.1                    pypi_0    pypi
pygments                  2.6.1                    pypi_0    pypi
pyopenssl                 19.1.0                   py36_0    defaults
pyparsing                 2.4.7                    pypi_0    pypi
pyrsistent                0.16.0                   pypi_0    pypi
pysocks                   1.7.1                    py36_0    defaults
python                    3.6.10               h7579374_2    defaults
python-dateutil           2.8.1                    pypi_0    pypi
python-graphviz           0.14.1                   pypi_0    pypi
python-multipart          0.0.5                    pypi_0    pypi
python_abi                3.6                     1_cp36m    conda-forge
pytorch-ignite            0.4.1                    pypi_0    pypi
pytz                      2020.1                   pypi_0    pypi
pywavelets                1.1.1                    pypi_0    pypi
pyyaml                    5.3.1                    pypi_0    pypi
pyzmq                     19.0.2                   pypi_0    pypi
qtconsole                 4.7.7                    pypi_0    pypi
qtpy                      1.9.0                    pypi_0    pypi
readline                  8.0                  h7b6447c_0    defaults
requests                  2.24.0                     py_0    defaults
requests-oauthlib         1.3.0                    pypi_0    pypi
rsa                       4.6                      pypi_0    pypi
ruamel_yaml               0.15.87          py36h7b6447c_1    defaults
s3transfer                0.3.3                    pypi_0    pypi
scikit-image              0.17.2                   pypi_0    pypi
scikit-learn              0.23.1                   pypi_0    pypi
scipy                     1.4.1                    pypi_0    pypi
send2trash                1.5.0                    pypi_0    pypi
setuptools                49.2.0                   pypi_0    pypi
six                       1.15.0                     py_0    defaults
spacy                     2.3.2                    pypi_0    pypi
sqlite                    3.32.3               h62c20be_0    defaults
srsly                     1.0.2                    pypi_0    pypi
starlette                 0.13.6                   pypi_0    pypi
tensorboard               2.1.1                    pypi_0    pypi
tensorflow                2.1.0.100                pypi_0    pypi
tensorflow-estimator      2.1.0                    pypi_0    pypi
tensorflow-gpu            2.1.0                    pypi_0    pypi
tensorflow-serving-api    2.1.0                    pypi_0    pypi
termcolor                 1.1.0                    pypi_0    pypi
terminado                 0.8.3                    pypi_0    pypi
testpath                  0.4.4                    pypi_0    pypi
thinc                     7.4.1                    pypi_0    pypi
threadpoolctl             2.1.0                    pypi_0    pypi
tifffile                  2020.7.24                pypi_0    pypi
tk                        8.6.10               hbc83047_0    defaults
torch                     1.6.0+cu101              pypi_0    pypi
torchvision               0.7.0+cu101              pypi_0    pypi
tornado                   6.0.4                    pypi_0    pypi
tqdm                      4.47.0                     py_0    defaults
traitlets                 4.3.3                    pypi_0    pypi
typing                    3.7.4.3                  pypi_0    pypi
typing-extensions         3.7.4.3                  pypi_0    pypi
urllib3                   1.25.9                     py_0    defaults
uvicorn                   0.11.8                   pypi_0    pypi
uvloop                    0.14.0                   pypi_0    pypi
wasabi                    0.8.0                    pypi_0    pypi
wcwidth                   0.2.5                    pypi_0    pypi
webencodings              0.5.1                    pypi_0    pypi
websockets                8.1                      pypi_0    pypi
werkzeug                  1.0.1                    pypi_0    pypi
wheel                     0.34.2                   py36_0    defaults
widgetsnbextension        3.5.1                    pypi_0    pypi
wrapt                     1.12.1                   pypi_0    pypi
xgboost                   1.2.0                    pypi_0    pypi
xlrd                      1.2.0                    pypi_0    pypi
xz                        5.2.5                h7b6447c_0    defaults
yaml                      0.2.5                h7b6447c_0    defaults
zipp                      3.1.0                    pypi_0    pypi
zlib                      1.2.11               h7b6447c_3    defaults
zstd                      1.3.7                h0b5b093_0    https://conda.anaconda.org/anaconda

Response

def predict 方法的返回结果可以是以下内容:

  • 一个可以被 JSON 序列化的对象,比如 Python 中的 List, Dict,数字等
  • 一个 str 类型字符串
  • 一个 bytes 类型对象
  • 一个 starlette.responses.Response 类型对象,其形式在下文有详细的解释

以下为一些样例:

def predict(self, payload):
    return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def predict(self, payload):
    return "class 1"
def predict(self, payload):
    # bytes 类型的返回
    array = np.random.randn(3, 3)
    response = pickle.dumps(array)
    return response
def predict(self, payload):
    # starlette.responses.Response
    data = "class 1"
    response = starlette.responses.Response(
        content=data, media_type="text/plain")
    return response

starlette.datastructures.UploadFile

starlette/requests#request-files 有介绍,这里将其做了简单的解释:

UploadFile 包含以下属性:

  • filename:字符串,上传文件的文件名
  • content_type:字符串,类似 image/jpeg 这样的字符串
  • fileSpooledTemporaryFile 类型,可以当作一个 file 类型执行参数传递和使用

UploadFile 包含以下 async 方法调用:

  • async read(size): 读取 size (int) 的内容
  • async seek(offset): 跳到文件指定 offset
  • async close(): 关闭文件

例如读取名为 upload_file 的上传文件的代码如下:

filename = payload["upload_file"].filename
contents = await payload["upload_file"].read()

starlette.responses.Response

其构造函数为

Response(content, status_code=200, headers=None, media_type=None)
  • content: strbytes 内容
  • status_code: HTTP 请求状态码
  • headers: 字典类型,HTTP Response 头
  • media_type: 字符串,返回结果的 media type,例如 application/json text/html