使用 Docker 为 Seldon Core 打包 Python 模型¶
在本指南中,我们说明了将您自己的 Python 模型封装在一个 docker 镜像中所需的步骤,该镜像准备使用 Docker 与 Seldon Core 一起部署。
第 1 步 - 创建源代码¶
你需要
一个运行模型的 python 类文件按
带有 seldon-core 选项的 requirements.txt
我们将深入详细步骤:
Python 文件¶
你的源代码应该包含一个类型与文件名相同的 python 文件。例如,我们的 python 模型脚手架 wrappers/s2i/python/test/model-template-app/MyModel.py:
class MyModel(object):
"""
Model template. You can load your model parameters in __init__ from a location accessible at runtime
"""
def __init__(self):
"""
Add any initialization parameters. These will be passed at runtime from the graph definition parameters defined in your seldondeployment kubernetes resource manifest.
"""
print("Initializing")
def predict(self,X,features_names):
"""
Return a prediction.
Parameters
----------
X : array-like
feature_names : array of feature names (optional)
"""
print("Predict called - will run identity function")
return X
该文件名为 MyModel.py,它定义了一个类 MyModel
该类包含一个 predict 方法,该方法采用数组 (numpy) X 和 feature_names 并返回一个预测数组。
您可以在类 init 方法中添加任何必需的初始化。
您的返回数组应该至少是二维的。
requirements.txt¶
填充您的代码所需的任何软件依赖项到 requirements.txt。该文件至少应包含:
seldon-core
第 2 步 - 定义 Dockerfile¶
在与源代码和 requirements.txt 相同的目录中定义一个 Dockerfile。它将定义我们的 python 构建镜像所需的核心参数,以将您的模型封装为 env vars。一个例子是:
FROM python:3.7-slim
WORKDIR /app
# Install python packages
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
# Copy source code
COPY . .
# Port for GRPC
EXPOSE 5000
# Port for REST
EXPOSE 9000
# Define environment variables
ENV MODEL_NAME MyModel
ENV SERVICE_TYPE MODEL
# Changing folder to default user
RUN chown -R 8888 /app
CMD exec seldon-core-microservice $MODEL_NAME --service-type $SERVICE_TYPE
第 3 步 - 构建您的镜像¶
使用 docker build . -t $ORG/$MODEL_NAME:$TAG 创建 Docker 镜像。可以使用一个简单的名称,但约定是使用 ORG/IMAGE:TAG 格式。
与 Keras/Tensorflow 模型一起使用¶
为了确保带有 Tensorflow 后端的 Keras 模型正常工作,您可能需要在加载模型后调用 _make_predict_function()。这是因为 Flask 可能会在与初始化模型的进程不同的线程中调用预测请求。请参阅 keras 问题以进行进一步讨论。
环境变量¶
下面解释了构建器映像所需的环境变量。可在 Dockerfile 或 docker run 用 -e 指定参数。
MODEL_NAME¶
包含模型的类的名称。还有将被导入的 python 文件的名称。
SERVICE_TYPE¶
正在创建的服务类型。可用选项有:
MODEL
ROUTER
TRANSFORMER
COMBINER
OUTLIER_DETECTOR
Flask 设置¶
查看 Flask - Builtin Configuration Values 获取可能的配置;以下参数添加 FLASK_ 字符串前缀时可设置(例如 FLASK_JSON_SORT_KEYS 在 Flask 会转换成 JSON_SORT_KEYS in Flask):
DEBUG
EXPLAIN_TEMPLATE_LOADING
JSONIFY_PRETTYPRINT_REGULAR
JSON_SORT_KEYS
PROPAGATE_EXCEPTIONS
PRESERVE_CONTEXT_ON_EXCEPTION
SESSION_COOKIE_HTTPONLY
SESSION_COOKIE_SECURE
SESSION_REFRESH_EACH_REQUEST
TEMPLATES_AUTO_RELOAD
TESTING
TRAP_HTTP_EXCEPTIONS
TRAP_BAD_REQUEST_ERRORS
创建不同的服务类型¶
MODEL¶
ROUTER¶
TRANSFORMER¶
高级用法¶
模型类参数¶
当发布镜像到 Kubernetes 时根据 SeldonDeloyment 中定义的内容进行填充 parameters。例如,我们的 Python TFServing proxy 具有如下定义的类 init 签名方法:
class TfServingProxy(object):
def __init__(self,rest_endpoint=None,grpc_endpoint=None,model_name=None,signature_name=None,model_input=None,model_output=None):
当部署 Seldon Deployment 以下参数可设置。可查看示例 MNIST TFServing example 中在 SeldonDeployment 定义的部分参数示例:
{
"graph": {
"name": "tfserving-proxy",
"type": "MODEL",
"children": [],
"parameters": [
{
"name": "grpc_endpoint",
"type": "STRING",
"value": "localhost:8000"
},
{
"name": "model_name",
"type": "STRING",
"value": "mnist-model"
},
{
"name": "model_output",
"type": "STRING",
"value": "scores"
},
{
"name": "model_input",
"type": "STRING",
"value": "images"
},
{
"name": "signature_name",
"type": "STRING",
"value": "predict_images"
}
]
}
}
type 参数允许值在 proto buffer 定义查看。
自定义指标¶
from version 0.3
要将自定义指标添加到您的响应中,您可以 类中定义一个可选方法 metrics,该方法返回一个指标字典列表。例如下所示:
class MyModel(object):
def predict(self, X, features_names):
return X
def metrics(self):
return [{"type": "COUNTER", "key": "mycounter", "value": 1}]
有关自定义指标和指标 dict 格式的更多详细信息,请参见此处。