写点什么

Seldon 使用 (二):打包模型

用户头像
托内多
关注
发布于: 2021 年 04 月 11 日

当部署模型服务(即创建 SeldonDeployment)时,模型文件已包含在 docker image 中。那模型文件是如何打包成 docker image 呢?

1 Seldon 支持的模型服务类型

一个模型服务可由三部分组成:

  • 运行环境:包括系统环境,python 环境,依赖库等

  • 服务代码:包括 http 服务(或 grpc 服务),metrics 服务等

  • 模型代码:包括预测代码,模型文件等


以上三个部分,通常更新较频繁的是模型代码,通常可以复用运行环境和服务代码,简化和加快部署效率。但是有些特殊的模型服务,会需要定制的依赖环境。为了满足这两种不同的部署需求,seldon 支持两种类型的模型服务:

  • 可复用的(reusable):复用 docker image,每次部署仅需从存储服务(repo)获取模型代码

reusable model server
  • 不可复用的(non-reusable):每次部署需要重新构建 docker image,将模型代码打包在 docker image 内

non-usable model server


2 如何构建 docker image

无论是哪种方式,我们都需要将模型打包成 docker image 形式再进行部署。这里主要先讨论 non-reusable 的方式。而构建 docker image,seldon 推荐两种方式 s2i(source-to-image)和 Dockerfile 方式。最终结果是一样的,都是产生用于部署的 docker image。两种方式的差别只是 Dockerfile 更原始和直接(需要用户了解 dockerfile 和 build 的一些相关知识),而 s2 则更贴近使用,相对更容易理解。但我觉得构建效率上并没有太大区别,看用户各自的使用习惯吧。我个人更推荐 Dockerfile 的方式。

2.1 Dockerfile 方式

需要文件如下:

  • 模型文件:MyModel.py

  • 依赖文件:requirements.txt

  • 构建文件:Dockerfile 文件

其中,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
复制代码

说明:

  • class 类名称保持与文件同名

  • __init__()初始化模型,predict()模型推理时被调用


requirements.txt 内容如下:

seldon-core
复制代码

说明:

  • 镜像将使用 seldon-core 包实现的 microservice 加载和启动模型服务

  • 如果 MyModel.py 还有其他依赖包,应该也加上


最后 Dockerfile 内容如下:

FROM python:3.7-slimCOPY . /appWORKDIR /appRUN pip install -r requirements.txtEXPOSE 5000
# Define environment variableENV MODEL_NAME MyModelENV SERVICE_TYPE MODELENV PERSISTENCE 0
CMD exec seldon-core-microservice $MODEL_NAME --service-type $SERVICE_TYPE --persistence $PERSISTENCE
复制代码

说明:

  • 镜像将使用 seldon-core-microservice 加载模型,并启动 http 服务

  • --service-type,当前支持 MODEL,ROUTER,TRANSFORMER,COMBINER,OUTLIER_DETECTOR 这五种。将在后续文章展开说明。


所需文件准备好之后,执行如下命令,构建镜像。

docker build . -t $ORG/$MODEL_NAME:$TAG# 镜像构建完成后,需push到镜像仓库# docker push $ORG/$MODEL_NAME:$TAG
复制代码

其中,-t 指定镜像的名称及标签,例如 hub.abc.com:business-A/alpha-model:v1。

2.2 s2i 方式(非必须了解,可跳过)

s2i(source-to-image)是 openshift 提供的用于程序代码(source)构建成 docker image 的简化方式。

而 seldon 在 s2i 的基础上,预先构建了包含 seldon-core-microservices 的镜像,用户只需要提供自己的模型代码,就可以使用 s2i 构建镜像。

首先,需要安装 s2i(可参考官方https://github.com/openshift/source-to-image

需要准备如下文件:

  • 模型文件:MyModel.py(同 2.1)

  • 依赖文件:requirements.txt(同 2.1)

  • 构建文件:.s2i/environment

注:依赖文件默认使用的是 requirements.txt 方式,但还支持 setup.py 和 enviroment.yml 的方式。


.s2i/environment 内容如下:

MODEL_NAME=MyModelSERVICE_TYPE=MODELPERSISTENCE=0
复制代码

这里指定了 seldon-core-microservices 服务启动时所需要的三个参数(同 2.1 Dockerfile 文件中服务的启动参数一致)。


执行如下命令完成镜像构建

s2i build <src-folder> seldonio/seldon-core-s2i-python3:1.8.0-dev <my-image-name># 例如:# s2i build my-model-files/ seldonio/seldon-core-s2i-python3:1.8.0-dev hub.abc.com:business-A/alpha-model:v1
复制代码

其中,seldonio/seldon-core-s2i-python3 是由 seldon 提供的基础镜像,这是使用 s2i 的方式时必须选择的基础镜像。主要原因是,它们包含了两个脚本 assemble 和 run。其中 assemble 用于支持更丰富的依赖文件,run 脚本包含了启动 seldon-core-microservices 的实现方式,包括读取 s2i/environment 文件内的环境变量。

相比较于 Dockerfile 方式,s2 方式更简洁一点,用户不需要懂 Dockerfile 如何写,只需要配置好环境变量。

但却也封装和屏蔽了底层细节,有利有弊。


后面的文章,我们将介绍 seldon-core-microservices 是如何实现模型加载及推理服务的。


发布于: 2021 年 04 月 11 日阅读数: 62
用户头像

托内多

关注

享受coding,与时俱进 2017.10.24 加入

简单生活,砥砺前行

评论

发布
暂无评论
Seldon 使用 (二):打包模型