使用Kubernetes部署机器学习模型

2019-12-05 15:21:20 浏览数 (1)

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

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

但是…

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

还有另一种方法…

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

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

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

第一层 - 预测代码

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

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

代码语言:javascript复制
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服务器,它将接受输入作为请求的参数,并在响应中返回模型的预测。

代码语言:javascript复制
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),它使我们能够在单个文本文件中定义要运行的命令。

代码语言:javascript复制
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集群之外的服务非常重要。请确保通过云提供商检查集群网络设置。

代码语言:javascript复制
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配置文件,你应该运行以下命令:

代码语言:javascript复制
kubectl apply -f deployment.yml

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

代码语言:javascript复制
kubectl apply -f service.yml

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

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

代码语言:javascript复制
curl http://node-ip:node-port/predict 
-H 'Content-Type: application/json' 
-d '{"input_params": "I loved this videoLike, love, amazing!!"}'

完成,上了!

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

0 人点赞