前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Kubernetes部署机器学习模型

使用Kubernetes部署机器学习模型

作者头像
CNCF
发布2019-12-05 15:21:20
1.7K0
发布2019-12-05 15:21:20
举报
文章被收录于专栏:CNCFCNCFCNCF

来自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上。只需要几行代码。它实际上变得更简单了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CNCF 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档