使用 Docker 构建和部署您的机器学习应用程序
你是否曾经部署过一个机器学习模型,它在本地计算机上运行良好,但代码在另一台机器上却崩溃了,或者更糟糕的是,在部署到生产环境后出现问题?那么,在本文中,我将引导你了解如何使用名为“Docker”的流行工具来运行和部署你的机器学习模型。
那么,Docker 是什么?
Docker 是一款工具,它通过使用所谓的容器,简化了应用程序的创建、部署和运行。它也是一个软件平台,用于创建Docker 镜像,这些镜像在部署后就被称为 Docker 容器。
Docker容器是一个隔离的环境,其中包含应用程序运行所需的所有依赖项,它通常被称为 Docker 镜像的运行实例。
Docker镜像是一个只读文件,它由多个层组成,用于在 Docker 容器中执行代码。Docker 镜像存储在一个名为Docker Hub的大型镜像仓库中。您可以从 Docker Hub 拉取镜像,也可以基于基础镜像构建自定义镜像。这些镜像在运行时会作为应用程序的容器。
综上所述,我们可以简单地将 Docker 定义为:
一个软件平台,它通过创建 Docker 镜像来简化任何应用程序的创建和部署,该镜像将成为一个 Docker 容器,其中包含应用程序部署后运行所需的所有依赖项和软件包。
Docker 的优势
-
Docker 解决了在开发的各个阶段拥有相同环境以及在各个应用程序中拥有隔离环境的问题。
-
只要机器上安装了 Docker,你就可以从任何地方运行你的应用程序。
-
Docker 让您可以自由地快速扩展。
-
轻松扩展您的开发团队。
安装 Docker
Docker 可在各种平台上使用,无论您使用的是 Linux、Windows 还是 Mac 电脑,都可以按照此处的安装指南进行操作。
现在我们已经了解了 Docker 的基础知识,并且您的机器上也已经运行了 Docker,接下来让我们用它来部署一个机器学习应用程序。
我的工作目录
对于我要部署的模型,我的工作目录结构如下所示:
.
├── app.py
├── Dockerfile
├── ML_Model
│ ├── Diabetestype.csv
│ ├── model.pkl
│ └── model.py
└── requirements.txt
1 directory, 6 files
app.py
是一个 Python 脚本,其中包含我使用 Flask 为机器学习模型构建的 API。我定义了 API 端点和路径、如何从网络接收数据、如何处理数据以及如何将预测结果作为响应返回。
import json
import pickle
import numpy as np
from flask import Flask, request
#
flask_app = Flask(__name__)
#ML model path
model_path = "ML_Model/model.pkl"
@flask_app.route('/', methods=['GET'])
def index_page():
return_data = {
"error" : "0",
"message" : "Successful"
}
return flask_app.response_class(response=json.dumps(return_data), mimetype='application/json')
@flask_app.route('/predict',methods=['GET'])
def model_deploy():
try:
age = request.form.get('age')
bs_fast = request.form.get('BS_Fast')
bs_pp = request.form.get('BS_pp')
plasma_r = request.form.get('Plasma_R')
plasma_f = request.form.get('Plasma_F')
HbA1c = request.form.get('HbA1c')
fields = [age,bs_fast,bs_pp,plasma_r,plasma_f,HbA1c]
if not None in fields:
#Datapreprocessing Convert the values to float
age = float(age)
bs_fast = float(bs_fast)
bs_pp = float(bs_pp)
plasma_r = float(plasma_r)
plasma_f = float(plasma_f)
hbA1c = float(HbA1c)
result = [age,bs_fast,bs_pp,plasma_r,plasma_f,HbA1c]
#Passing data to model & loading the model from disk
classifier = pickle.load(open(model_path, 'rb'))
prediction = classifier.predict([result])[0]
conf_score = np.max(classifier.predict_proba([result]))*100
return_data = {
"error" : '0',
"message" : 'Successfull',
"prediction": prediction,
"confidence_score" : conf_score
}
else:
return_data = {
"error" : '1',
"message": "Invalid Parameters"
}
except Exception as e:
return_data = {
'error' : '2',
"message": str(e)
}
return flask_app.response_class(response=json.dumps(return_data), mimetype='application/json')
if __name__ == "__main__":
flask_app.run(host ='0.0.0.0',port=8080, debug=False)
ML_Model
目录包含 ML 模型、我用来训练模型的数据以及模型训练完成后生成的 pickle 文件(API 将使用该文件)。
requirements.txt
文件是一个文本文件,其中包含了我们的应用程序运行所需的所有 Python 包。我使用的一些包包括:
Flask==1.1.2
pandas==1.0.3
numpy==1.18.2
sklearn==0.0
Dockerfile
是一个定义 Docker 镜像的文本文件。当项目所需的基础镜像无法满足需求时,您可以使用 Dockerfile 创建自定义 Docker 镜像。以下是我要部署的模型的 Dockerfile 内容:
#I specify the parent base image which is the python version 3.7
FROM python:3.7
MAINTAINER aminu israel <aminuisrael2@gmail.com>
# This prevents Python from writing out pyc files
ENV PYTHONDONTWRITEBYTECODE 1
# This keeps Python from buffering stdin/stdout
ENV PYTHONUNBUFFERED 1
# install system dependencies
RUN apt-get update \
&& apt-get -y install gcc make \
&& rm -rf /var/lib/apt/lists/*
# install dependencies
RUN pip install --no-cache-dir --upgrade pip
# set work directory
WORKDIR /src/app
# copy requirements.txt
COPY ./requirements.txt /src/app/requirements.txt
# install project requirements
RUN pip install --no-cache-dir -r requirements.txt
# copy project
COPY . .
# Generate pikle file
WORKDIR /src/app/ML_Model
RUN python model.py
# set work directory
WORKDIR /src/app
# set app port
EXPOSE 8080
ENTRYPOINT [ "python" ]
# Run app.py when the container launches
CMD [ "app.py","run","--host","0.0.0.0"]
在我的 Dockerfile 中,我拉取了 Docker 基础镜像(python:3.7),更新了系统依赖项,安装了 requirements.txt 文件中的软件包,运行了 ML 代码来训练模型并生成 API 将使用的 pickle 文件,最后在本地运行了服务器。
现在让我们使用以下命令,根据我们创建的 Dockerfile 构建 Docker 镜像:
israel@israel:~/Documents/Projects/Docker_ML$ docker build aminu_israel/ml_model:1.0 .
我将自定义镜像命名为“aminu_israel/ml_model”,并将版本号设置为 1.0。请注意命令末尾的“.”,它表示我告诉 Docker 在当前目录(即我的项目文件夹)中查找 Dockerfile。如果成功,您应该会看到类似这样的结果:
Sending build context to Docker daemon 249.3kB
Step 1/16 : FROM python:3.7
---> cda8c7e31f89
Step 2/16 : MAINTAINER aminu israel <aminuisrael2@gmail.com>
---> Running in cea1c80b990f
Removing intermediate container cea1c80b990f
---> 2c82fc9c1b5a
Step 3/16 : ENV PYTHONDONTWRITEBYTECODE 1
---> Running in 6ee3497a7ff4
Removing intermediate container 6ee3497a7ff4
---> 56f5f9838610
Step 4/16 : ENV PYTHONUNBUFFERED 1
---> Running in 1f53b581eed7
...
Step 16/16 : CMD [ "app.py","run","--host","0.0.0.0"]
---> Running in 1f7fc05b4e12
Removing intermediate container 1f7fc05b4e12
---> 8636b5bc482e
Successfully built 8636b5bc482e
Successfully tagged aminu_israel/ml_model:1.0
您可以使用以下命令查看新创建的图像:
israel@israel:~$ docker images
现在镜像构建成功了,让我们使用以下命令运行 Docker 镜像:
israel@israel:~$ docker run --name deployML -p 8080:8080 aminu_israel/ml_model:1.0
如果成功,您应该会看到类似这样的结果:
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
要检查您的 Docker 容器是否正在运行,请使用以下命令:
israel@israel:~$ docker ps
你会看到类似这样的结果:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dc5c417d893f aminu_israel/ml_model:1.0 "python app.py run -…" 24 seconds ago Up 20 seconds 0.0.0.0:8080->8080/tcp deployML
这表明新容器当前正在运行。要获取完整的 Docker 文档,请点击此处。
好了,你已经使用 Docker 成功部署了机器学习模型。
你可以在这里获取本文的代码。
感谢阅读😀
文章来源:https://dev.to/aminu_israel/build-and-deploy-your-machine-learning-application-with-docker-5322