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