专栏首页CNCF使用Kubernetes部署机器学习模型

使用Kubernetes部署机器学习模型

来自Itay Ariel,cnvrg.io高级软件开发者,的客座文章,之前在cnvrg.io上发表。

你是人工智能专家。一个深度学习的忍者。机器学习的大师。你刚刚完成了优秀模型的另一次迭代训练。这个新模型是你所创建的最精确的模型,它保证为你的公司带来很多价值。

但是…

你遇到了一个障碍,阻碍了你的模型的潜力。你可以在整个过程中完全控制模型。你有能力对其进行培训,你可以调整它,甚至可以使用测试集来验证它。但是,你一次又一次地到达你的模型已经准备好投入生产,并且你的进度必须停止。你需要与DevOps沟通,DevOps很可能有一个任务列表,优先级高于你的模型。你耐心地等待轮到你,直到你在你的旋转椅上变得无法忍受的不安。你完全有权利坐立不安。你知道你的模型有潜力为你的公司创造破纪录的结果。为什么还要浪费时间呢?

还有另一种方法…

在Kubernetes上发布你的模型。Kubernetes正在迅速成为云计算标准。一旦知道如何在kubernetes上部署模型,就可以在任何地方(谷歌云或AWS)部署。

如何使用Kubernetes将模型部署到生产环境中

你永远不会相信部署模型是多么简单。你所需要的只是稍微包装一下代码。很快你就能建立和控制你的机器学习模型,从研究到生产。方法如下:

第一层 - 预测代码

因为你已经训练了你的模型,这意味着你已经拥有了预测代码(predict code)。预测代码接受单个样本,将模型与样本进行匹配,并返回一个预测。

下面你将看到一个示例代码,它接受一个句子作为输入,并返回一个数字,该数字表示模型预测的句子情绪。在本例中,使用IMDB数据集训练模型来预测句子的情感。

import keras
model = keras.models.load_model("./sentiment2.model.h5")

def predict(sentence):
    encoded = encode_sentence(sentence)
    pred = np.array([encoded])
    pred = vectorize_sequences(pred)
    a = model.predict(pred)
    return a[0][0]

def vectorize_sequences(sequences, dimension=10000):
    results = np.zeros((len(sequences), dimension))
    for i, sequence in enumerate(sequences):
        results[i, sequence] = 1.
    return results
 predict.py hosted with ❤ by GitHub

*提示:要使部署更加容易,请确保在需求文件中跟踪所有代码依赖项。

第二层 - flask服务器

在我们有了一个预测代码的工作示例之后,我们需要开始使用HTTP而不是Python。

实现这一点的方法是生成一个flask服务器,它将接受输入作为请求的参数,并在响应中返回模型的预测。

from flask import Flask, request, jsonify
import predict

app = Flask(__name__)

@app.route('/predict', methods=['POST'])
def run():
    data = request.get_json(force=True)
    input_params = data['input']
    result =  predict.predict(input_params)
    return jsonify({'prediction': result})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)

在这个小片段中,我们导入了flask并定义了它应该监听的路由。一旦一个请求被发送到服务器路由/predict,它将接受请求参数,并将它们发送到我们在第一层中编写的预测函数。函数返回值通过HTTP响应发送回客户机。

第三层 - Kubernetes部署

现在,进入最后一层!使用Kubernetes,我们可以在一个YAML文件中声明我们的部署。这种方法称为基础即代码( Infrastructure as code),它使我们能够在单个文本文件中定义要运行的命令。

apiVersion: apps/v1 
kind: Deployment
metadata:
  name: predict-imdb 
spec:
  replicas: 1 
  template:
    spec:
      containers:
      - name: app
        image: tensorflow/tensorflow:latest-devel-py3
        command: ["/bin/sh", "-c"]
        args:
         - git clone https://github.com/itayariel/imdb_keras;
           cd imdb_keras;
           pip install -r requirements.txt;
           python server.py;
        ports:
        - containerPort: 8080

你可以在文件中看到,我们声明了一个带有单个副本的部署。它的镜像基于tensorflow docker镜像,然后运行一组四个命令来触发服务器。

在这个命令中,它克隆来自Github的代码,安装需求,并启动所编写的flask服务器。

*注意:请随意更改clone命令以满足你的需要。

此外,添加一个将暴露部署在kubernetes集群之外的服务非常重要。请确保通过云提供商检查集群网络设置。

apiVersion: v1
kind: Service
metadata:
  name: predict-imdb-service
  labels:
    app: imdb-server
spec:
  ports:
    - port: 8080
  selector:
    app: imdb-server
  type: NodePort

?把它发送到云上

现在我们已经设置好了所有文件,是时候将代码发送到云上了。

假设你有一个正在运行的kubernetes集群,并且你有它的kube配置文件,你应该运行以下命令:

kubectl apply -f deployment.yml

这个命令将创建我们在集群上的部署。

kubectl apply -f service.yml

执行此命令将创建一个服务,该服务将向外界暴露端点。在本例中,使用了一个NodePort服务 - 这意味着该服务将附加到集群节点上的一个端口。

使用kubectl get services命令查找服务IP和端口。现在可以使用HTTP调用模型,使用如下curl命令:

curl http://node-ip:node-port/predict \
-H 'Content-Type: application/json' \
-d '{"input_params": "I loved this videoLike, love, amazing!!"}'

完成,上了!

容易啊?现在你知道了如何使用Kuberentes将模型发布到internet上。只需要几行代码。它实际上变得更简单了。

本文分享自微信公众号 - CNCF(lf_cncf),作者:CNCF

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Fluentd v1.8.0已经发布

    我们已经发布了v1.8.0。更新日志在这里。这个版本包含了新的服务发现插件和许多增强功能。

    CNCF
  • Kubernetes引入对Windows CSI的alpha支持

    作者:Deep Debroy [Docker],Jing Xu[谷歌],Krishnakumar R(KK)[微软]

    CNCF
  • 花椒前端基于容器的 Vue SSR 持续开发集成环境实践

    vue-server-renderer 是vue srr 服务器端渲染的核心模块,我们会使用koa搭建服务器。

    CNCF
  • Windows 下更改 jupyterlab 默认启动位置的教程详解

    起序:本文是在 python 自己的虚拟环境下做的,不是在 Anaconda 下做的。

    砸漏
  • Android数据库多线程并发操作异常

    在我们做项目的过程中经常会有多线程异步处理的情况,那么Android中多线程操作数据我们一般会遇到什么样的问题?

    静默加载
  • Python绘制支持向量机用于手写数字识别的学习曲线

    在机器学习中,所谓学习曲线,是指随着样本数量增加时模型的表现,例如模型在训练样本和验证样本上的得分。

    Python小屋屋主
  • 【金融科技行业研究报告】区块链技术现实骨感,大数据风控跑马圈地

    作者:36Kr研究院 2017年9月,36氪研究院最新发布《2017 FinTech行业研究报告》,金融是在不确定的环境中进行资源跨期的最优配置决策行为,其本质...

    钱塘数据
  • 用“小红的下任男友是谁”通俗解释强化学习中的 基于模型方法 与 免模型方法

    我朋友最近不知哪根弦不对劲,特别八卦。他特别特别想“预测”出小红的下任男友是谁。于是他找我来帮忙。

    Piper蛋窝
  • IT人永远不老,老程序员价值何在?

    IT人永远不老?做梦,怎么可能。无论你现在是多么风华正茂,青春洋溢,终有成熟、老去的那天。

    java架构师
  • 时间序列建模三部曲

    与大多数高级分析解决方案不同,时间序列建模是一种低成本解决方案,可提供强大的洞察力。

    拓端

扫码关注云+社区

领取腾讯云代金券