利用Docker简化机器学习应用程序的部署和可扩展性( 二 )


以使用Scikit learn的线性回归算法构建的一个简单的机器学习模型为例 。此类应用程序的Dockerfile可能如下所示:
Dockerfile# Use an official Python runtime as a parent image FROM python:3.8-slim-buster # Set the working directory in the contAIner to /App WORKDIR /app # Copy the current directory contents into the container at /app ADD . /app # Install any needed packages specified in requirements.txt RUN pip install --no-cache-dir -r requirements.txt # Make port 80 available to the world outside this container EXPOSE 80 # Run app.py when the container launches CMD ["python", "app.py"]这个Dockerfile中提到的requirements.txt文件列出了机器学习模型的所有Python依赖项,例如Scikit-learn、Pandas和Flask 。另一方面,app.py脚本包含加载经过训练的模型并将其用作Web应用程序的代码 。
通过在Dockerfile中定义配置和依赖关系,可以创建一个映像,其中包含机器学习模型及其执行所需的运行时环境,从而促进一致的部署 。
构建和测试Docker镜像在成功创建Dockerfile之后,接下来的阶段包括构建Docker映像 。通过执行Docker build命令构建Docker镜像,然后执行包含Docker文件的目录 。-t标志用指定的名称标记图像 。这样一个命令的实例是:
Shelldocker build -t ml_model_image:1.0 在这里 , ml_model_image:1.0是分配给图像的名称和版本 , 而“.”表示Dockerfile驻留在当前目录中 。
在构建Docker镜像之后,下面的任务涉及从该镜像启动Docker容器,从而允许测试机器学习模型的功能 。Docker的run命令可以帮助完成这个任务:
Shelldocker run -p 4000:80 ml_model_image:1.0在这个命令中,-p标志将主机的端口4000映射到容器的端口80(在Dockerfile中定义) 。因此,机器学习模型可以通过主机的4000端口访问 。
测试模型需要向Docker容器中的Flask应用程序公开的端点发送一个请求 。例如,如果模型基于POST请求发送的数据提供预测,curl命令可以促进这一点:
Shellcurl -d '{"data":[1, 2, 3, 4]}' -H 'Content-Type: application/json' http://localhost:4000/predict该方法确保了从Dockerfile创建到在Docker容器中测试机器学习模型的无缝流程 。
使用Docker部署机器学习模型机器学习模型的部署通常涉及将模型公开为可通过互联网访问的服务 。实现这一目标的标准方法是使用Web框架(如Flask)将模型作为REST API提供服务 。
考虑一个Flask应用程序封装机器学习模型的例子 。以下的Python脚本演示了如何将模型作为REST API端点公开:
Pythonfrom flask import Flask, request from sklearn.externals import joblib app = Flask(__name__) model = joblib.load('model.pkl') @app.route('/predict', methods=['POST']) def predict():data = https://www.isolves.com/it/cxkf/rongqi/2023-11-10/request.get_json(force=True)prediction = model.predict([data['features']])return {'prediction': prediction.tolist()} if __name__ == '__main__': app.run(host='0.0.0.0', port=80)在这个例子中 , Flask应用程序加载了一个预训练的Scikit-learn模型(保存为model.pkl),并定义了一个API端点/predict 。当POST请求与包含特性数组的JSON对象一起发送到该端点时,模型进行预测并将其作为响应返回 。
一旦机器学习模型被部署并在Docker容器中运行,它就可以使用HTTP请求进行通信 。例如,使用curl命令,一个POST请求可以发送到一个特征数组的模型,它将响应一个预测:
Shellcurl -d '{"features":[1, 2, 3, 4]}' -H 'Content-Type: application/json' http://localhost:4000/predict这个实例演示了Docker如何将机器学习模型部署为可扩展和可访问的服务 。
用Docker Swarm扩展器学习模型随着机器学习应用程序的范围和用户基础的增长 , 扩展能力变得越来越重要 。Docker Swarm为Docker提供了一个本地集群和编排解决方案,允许多个Docker主机变成一个虚拟主机 。因此,Docker Swarm可以用于跨多台机器管理和扩展部署的机器学习模型 。
启动Docker Swarm是一个简单的过程,通过执行“Docker Swarm init”命令开始 。这个命令将当前机器初始化为Docker Swarm管理器:
Shelldocker swarm init --advertise-addr $(hostname -i)在这个命令中,--advertise-addr标志指定工作节点可以到达Swarm管理器的地址 。hostname-i命令检索当前机器的IP地址 。
在初始化Swarm之后,机器学习模型可以使用Docker服务跨Swarm部署 。该服务是用docker service create命令创建的,其中像-replicas这样的标志可以决定要运行的容器实例的数量:


推荐阅读