掘金 人工智能 18小时前
使用Docker和Kubernetes部署机器学习模型
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文介绍了如何将机器学习模型容器化,并通过Flask API提供服务,最终部署到Kubernetes集群上。首先,通过Python和Scikit-learn构建了一个简单的决策树模型,并使用Flask创建了REST API。接着,详细阐述了使用Dockerfile将模型和API打包成Docker镜像的过程,并演示了在本地构建和测试镜像的方法。最后,文章展示了如何将Docker镜像部署到AWS EKS Kubernetes集群上,包括创建Deployment和Service,以及如何通过LoadBalancer访问模型。文章还提到了容器化技术在机器学习中的优势,如可重复性、可移植性、可扩展性和隔离性,并提供了生产环境中的最佳实践建议,如扩展、监控、CI/CD和安全性。

📦 容器化技术带来的优势:容器化技术为机器学习模型提供了诸多便利。它确保了环境的可重复性,使得模型在不同机器上行为一致;提高了可移植性,使模型可在不同环境轻松运行;增强了可扩展性,方便根据需求调整资源;并且通过隔离性避免了依赖冲突,简化了部署和维护。

🛠️ 构建和提供机器学习模型:文章首先使用Python和Scikit-learn创建了一个简单的决策树模型,并使用joblib保存模型。接着,使用Flask构建了REST API,用于加载模型并根据JSON输入进行预测。这部分展示了如何将机器学习模型转化为可部署的服务。

🐳 Docker化机器学习服务:为了实现容器化,文章详细介绍了Dockerfile的编写,包括基础镜像选择、工作目录设置、依赖安装、文件复制和端口暴露等步骤。通过Docker build命令,将Flask API和模型打包成Docker镜像,并可在本地进行测试验证。

☁️ 部署到AWS EKS Kubernetes集群:文章演示了如何将Docker镜像推送到Docker Hub,并部署到AWS EKS Kubernetes集群。这包括创建Deployment和Service,以及如何通过LoadBalancer访问模型。通过这种方式,可以实现机器学习模型在云端的快速部署和扩展。

容器化将应用程序打包为轻量级、可移植的单元。对于机器学习(ML)来说,这确保了环境的可重复性和易于部署。例如,容器将机器学习模型代码与其确切的依赖项捆绑在一起,因此其结果可以在不同机器上保持一致,然后它们可以在任何Docker主机或云平台上运行,从而提高了可移植性。像Kubernetes这样的编排平台增加了可扩展性,可以根据需要自动启动或关闭容器。容器还将机器学习环境与其他应用程序隔离开来,从而防止依赖冲突。简而言之,将机器学习模型封装到Docker容器中,可以使其更容易在生产环境中可靠地迁移、运行和扩展。

有了这些优势,可以通过具体示例进行演示:使用Python训练一个简单模型,通过Flask API提供服务,然后将其容器化并部署到AWS EKS Kubernetes集群上。

构建和提供示例机器学习模型

首先,创建一个简单的Scikit-Learn模型。使用Iris数据集训练一个决策树,然后用joblib保存模型。代码如下:

1 # train_model.py2 from sklearn.datasets import load_iris3 from sklearn.tree import DecisionTreeClassifier4 import joblib56 iris = load_iris()7 X, y = iris.data, iris.target8 model = DecisionTreeClassifier()9 model.fit(X, y)10 joblib.dump(model, 'model.pkl')

这将生成model.pkl。接下来,编写一个REST API来提供预测服务。例如,使用Flask加载模型并根据JSON输入进行预测:

1 # app.py2 from flask import Flask, request, jsonify3 import joblib45 app = Flask(__name__)6 model = joblib.load('model.pkl')78 @app.route('/predict', methods=['POST'])9 def predict():10 data = request.get_json()11 features = data.get('features')12 prediction = model.predict([features])13 return jsonify({'prediction': int(prediction[0])})1415 if __name__ == '__main__':16 app.run(host='0.0.0.0', port=5000)

在这里,客户端发送类似{"features": [5.1, 3.5, 1.4, 0.2]}的 JSON,服务器返回预测的类。

将机器学习服务Docker化

为了实现容器化,需要编写一个Dockerfile。Docker使用客户端**-** 服务器架构:Docker CLI与Docker守护进程交互,以构建镜像,从注册表中获取层,并运行容器。下图说明了这种架构:

Docker使用客户端-服务器模型,Docker CLI与管理镜像和容器的Docker守护进程进行通信。每个Docker映像都是一个分层的文件系统,其中包括应用程序代码和依赖项。在这里,将把Flask API和模型打包到一个映像中。

在项目目录中创建一个Dockerfile:

1 # Dockerfile2 FROM python:3.9-slim3 WORKDIR /app4 COPY requirements.txt ./5 RUN pip install -r requirements.txt6 COPY model.pkl app.py ./7 EXPOSE 50008 CMD ["python", "app.py"]

还包括一个requirements.txt,其中列出Python依赖项:

1 flask2 scikit-learn3 joblib

在本地构建Docker镜像:(bash)。

Docker build -t my-ml-app:latest

这将创建一个包含模型服务器的映像my-ml-app:latest,可以通过运行(bash)来验证:

curl -X POST -H "Content-Type: application/json" \ -d '{"features": [5.1, 3.5, 1.4, 0.2]}' \ http://localhost:5000/predict

你可以得到一个JSON响应,如下所示:

1 {"prediction":0}

这样,机器学习模型就实现了容器化,可以在任何Docker可用的地方运行。

Kubernetes 基础概念:Pod、Deployments和Services

Kubernetes集群由一个控制平台和多个工作节点组成。控制平台(有时称为Master)管理基本组件,例如如etcd(用于存储状态)、API服务器、调度程序、控制器管理器。工作节点在Pod中运行容器。其架构如下:

Kubernetes集群架构包括控制平台和工作节点。Kubernetes集群遵循master-worker模型。控制平台(图左)保存集群状态(etcd、API服务器、调度程序、控制器管理器)。工作节点(图右)运行kubelet和代理,并采用容器托管Pod。

关键概念:

在实践中,将创建一个Deployment来保持模型服务器的两个副本的运行,并创建一个Service来公开它们。

部署到AWS EKS

现在将Docker映像推送到注册表中,并部署到AWS EKS(Elastic Kubernetes Service)上的Kubernetes。首先,标记和推送映像(使用Docker Hub或ECR)。例如,使用Docker Hub:(bash)

docker tag my-ml-app:latest your_dockerhub_user/my-ml-app:latest docker push your_dockerhub_user/my-ml-app:latest

将your_dockerhub_user替换为Docker Hub用户名。

接下来,设置一个EKS集群(需要配置eksctl和AWS CLI)。如果还没有集群,AWS提供了创建集群的指南。例如:(bash)

create cluster -name ml-model-cluster -region us-west-2 -nodes

这将创建一个具有两个工作节点的基本EKS集群。确保kubectl上下文指向新的集群(AWS文档解释了如何连接)。

创建一个使用容器映像的Kubernetes部署清单(deploy.yaml):

1 apiVersion: apps/v12 kind: Deployment3 metadata:4 name: ml-model-deployment5 spec:6 replicas: 27 selector:8 matchLabels:9 app: ml-model10 template:11 metadata:12 labels:13 app: ml-model14 spec:15 containers:16 - name: ml-model17 image: your_dockerhub_user/my-ml-app:latest18 ports:19 - containerPort: 9000

以及一个Service(Service.yaml),用于在外部公开它(在EKS上使用LoadBalancer类型): YAML

1 apiVersion: v12 kind: Service3 metadata:4 name: ml-model-service5 spec:6 type: LoadBalancer7 selector:8 app: ml-model9 ports:10 - protocol: TCP11 port: 8012 targetPort: 9000

将这些应用于集群:(bash)

kubectl apply -f deployment.yamlkubectl apply -f service.yaml

检查状态:

kubectl get deploymentskubectl get podskubectl get svc ml-model-service

当LoadBalancer配置完成之后,其Service将获得外部IP(或 AWS DNS)。一旦准备就绪,可以向该地址的80端口发送请求,它将转发到端口9000上的Pod。

结论

现在已经将scikit-learn模型实现容器化,使用Flask为其提供服务,并将其部署在Kubernetes上。为了生产就绪,可以考虑以下最佳实践:

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

容器化 机器学习 Docker Kubernetes AWS EKS
相关文章