将机器学习(ML)模型部署到生产环境中的一个常见模式是将这些模型作为 RESTful API 微服务公开,这些微服务从 Docker 容器中托管,例如使用 SciKit Learn 或 Keras 包训练的 ML 模型,这些模型可以提供对新数据的预测。然后,可以将它们部署到云环境中,以处理维护连续可用性所需的所有事情,例如容错、自动缩放、负载平衡和滚动服务更新。
持续可用的云部署的配置详细信息对于不同的目标云提供商来说是不一样的——例如,Amazon Web 服务的部署过程和拓扑结构与微软 Azure 不同,后者又与谷歌云平台不同。这构成了每个云提供商需要获取的知识。此外,在本地测试整个部署策略是困难的(有些人会说几乎不可能),它使得网络等问题难以调试。
Kubernetes 是一个容器编排平台,旨在解决这些问题。简而言之,它提供了一种机制,用于定义整个基于微服务的应用程序部署拓扑及其维护连续可用性的服务级别要求。对于目标云提供商来说,它可以在本地运行,甚至可以在你的笔记本电脑上运行,而这一切所需的只是运行 Kubernetes 的虚拟机集群,即 Kubernetes 集群。
这篇博客适合与 GitHub 存储库中的代码一起阅读,其中包含 Python 模块、Docker 配置文件和 Kubernetes 指令,用于演示如何使用 Docker 和 Kubernetes 将简单的 Python ML 模型转换为生产级 RESTful 模型评分(或预测)API 服务。这不是一个全面的指南,但它会帮助你快速启动和运行,熟悉基本概念和模式。
我们将使用两种不同的方法演示 ML 模型部署:使用 Docker 和 Kubernetes 的第一原则方法;然后使用 Seldon Core Kubernetes 本机框架来简化 ML 服务的部署。前者将有助于理解后者,后者构成一个强大的框架,用于部署和监视许多复杂的 ML 模型管道的性能。
使用 Flask 和 Docker 容器化一个简单的 ML 模型评分服务器
我们首先演示如何使用 api.py 模块中包含的简单 Python ML 模型评分 REST API 和 Dockerfile 来实现这一基本功能,这两个文件都位于 py-flask-ml-score-api 目录中,其核心内容如下:
py-flask-ml-score-api/
| Dockerfile
| Pipfile
| Pipfile.lock
| api.py
在 api.py 模块中定义 Flask Service
这是一个 Python 模块,它使用 Flask 框架定义一个 web 服务(app),带有一个函数(score),该函数在响应对特定 URL(或「route」)的 HTTP 请求时执行,这要归功于 app.route 函数的封装。相关代码复制如下,以供参考:
from flask import Flask, jsonify, make_response, request
app = Flask(__name__)
@app.route('/score', methods=['POST'])
def score:
features = request.json['X']
return make_response(jsonify({'score': features}))
if __name__ == '__main__': app.run(host='0.0.0.0', port=5000
如果在本地运行(例如,使用 python run api.py 启动 web 服务),我们就可以在 http://localhost:5000/score访问我们的函数。此函数接受以 JSON 形式发送给它的数据(该数据已自动反序列化为 Python dict,在函数定义中用作请求变量),并返回响应(自动序列化为 JSON)。
在我们的示例函数中,我们期望传递给 ML 模型一组特性 X,在我们的示例中,ML 模型将这些相同的特性返回给调用者,即我们选择的 ML 模型是 identity 函数,我们选择它纯粹是为了演示。我们可以很容易地加载一个 pickled SciKit Learn 或 Keras 模型,并将数据传递给 approproate predict 方法,以 JSON 的形式返回特性数据的分数。
用 Dockerfile 定义 Docker 映像
Dockerfile 本质上是 Docker 使用的配置文件,它允许你在操作时定义 Docker 容器的内容并配置其操作。此静态数据在未作为容器执行时称为「image」。作为参考,Dockerfile 复制如下:
FROM python:3.6-slim
WORKDIR /usr/src/app
COPY . .
RUN pip install pipenv
RUN pipenv install
EXPOSE 5000
CMD ["pipenv