如何用Docker构建和部署机器学习模型🖥

Docker 是一个虚拟化平台,旨在通过使用容器来创建、运行和部署应用程序。我们将使用 Docker 部署一个使用 Streamlit 构建的简单机器学习应用程序。

在本教程中,我们将首先创建一个简单的机器学习模型,将其保存到要加载到我们平台中的 pickle 文件中,并使用 Streamlit 创建其界面。创建 Streamlit 应用程序后,我们将使用 docker 来部署它。

先决条件

  1. 对Python有很好的理解。
  2. 良好的机器学习模型应用知识。

构建简单的机器学习模型

让我们从构建一个简单的机器学习预测模型开始。我们将构建一个机器学习模型,根据用户的输入来预测一个人的性别。

数据集

我们将使用人们常用的名称数据集。

我们使用的数据格式如下图:

CSV 文件

安装所需的软件包

我们需要以下包:

  1. Sckit-learn
  2. Pandas
  3. Numpy

以下命令用于安装上面的软件包。

bash 复制代码
pip install sklearn
pip install pandas
pip install numpy

导入 Panda 和 Numpy

Python 复制代码
import pandas as pd
import numpy as np

从 sckitlearn 导入

Python 复制代码
import CountVectorizer from sklearn.feature_extraction.text
import DictVectorizer from sklearn.feature_extraction
Python 复制代码
df = pd.read_csv('dataset.csv')
Python 复制代码
df.size
df.dtypes

检查缺失值

我们需要确保数据集中没有缺失值。这将提供结构良好的数据,可以优化我们的模型训练。

Python 复制代码
df.isnull().isnull().sum()

检查男性和女性的数量

在这里,我们查找数据集中的男性和女性总数。

Python 复制代码
df[df.sex == 'F'].size
df[df.sex == 'M'].size
df_names = df

将数据 F 和 M 替换为 0 和 1

这样做是为了提供 0 或 1 的二进制输出,0 代表女性,1 代表男性。

Python 复制代码
df_names.sex.replace({'F':0,'M':1},inplace=True)
Xfeatures =df_names['name']

特征提取

Python 复制代码
cv = CountVectorizer()
X = cv.fit_transform(Xfeatures)

模型加工

Python 复制代码
import train_test_split from sklearn.model_selection

特征和标签

在确定了用于训练模型的特征和标签后,我们可以将数据集分为两个:

  1. 训练集:数据的 75%。
  2. 测试集:数据的 25%。
Python 复制代码
X
y = df_names.sex
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)

创建朴素贝叶斯分类器模型

我们从 scikit-learn 包中导入朴素贝叶斯分类器算法。该模型将用于拟合和训练我们的模型。

Python 复制代码
import MultinomialNB from sklearn.naive_bayes
clf = MultinomialNB()
clf.fit(X_train,y_train)
clf.score(X_test,y_test)

做出预测

我们将使用一个名为 Predict 的函数,该函数将用于根据提供的姓名预测一个人的性别。

Python 复制代码
def predict(a):
    test_name = [a]
    vector = cv.transform(test_name).toarray()
    if clf.predict(vector) == 0:
        print("Female")
    else:
        print("Male")

将模型保存到 pickle 文件中

我们将使用 Joblib 保存我们的模型。我们将通过将模型转换为字节流来实现此目的,该字节流将保存到名为"naivemodel.pkl"的 pickle 文件中。

Python 复制代码
import joblib from sklearn.externals
naiveBayesModel = open("model/naivemodel.pkl","wb")
joblib.dump(clf,naiveBayesModel)
naiveBayesModel.close()

Streamlit简介

Streamlit 是一个框架,不同的机器学习工程师和数据科学家使用该框架根据经过训练的模型构建 UI 和强大的机器学习应用程序。

这些应用程序可以通过为用户提供交互界面来实现可视化。

它们提供了一种更简单的方法来构建图表、表格和不同的图形,以满足您的应用程序的需求。他们还利用已保存或选取到应用程序中的模型来进行预测。

如何安装streamlit

使用以下命令:

bash 复制代码
pip install streamlit

让我们构建 Streamlit 应用程序

  1. 创建一个新的 Python 文件,名为app.py.
  2. 将我们的 pickle 模型添加到创建的名为"model"的文件夹中。

我们的文件夹结构应该如下所示。

markdown 复制代码
├── app.py
├── model
   ├── naivebayesgendermodel.pkl
  1. 导入所需的包。
Python 复制代码
import streamlit as st

from sklearn.externals import joblib
import time
from PIL import Image
  1. 取消选中模型。

这将有助于加载我们的模型,以便将其用于性别预测。在这里,来自"naivemodel.pkl"文件的字节流被转换为对象层次结构,以便 Streamlit 应用程序可以使用它。

Python 复制代码
gender_nv_model = open("models/naivemodel.pkl","rb")
gender_clf = joblib.load(gender_nv_model)
  1. 构建我们的预测逻辑。
Python 复制代码
def predict_gender(data):
  vect = gender_cv.transform(data).toarray()
  result = gender_clf.predict(vect)
  return result
  1. 设置应用程序样式 我们将使用 Material UI 作为应用程序的样式和图标。
Python 复制代码
def load_css(file_name):
    with open(file_name) as f:
        st.markdown('<style>{}</style>'.format(f.read()), unsafe_allow_html=True)

def load_icon(icon_name):
    st.markdown('<i class="material-icons">{}</i>'.format(icon_name), unsafe_allow_html=True)
  1. 添加图像
arduino 复制代码
def load_images(file_name):
  img = Image.open(file_name)
  return st.image(img,width=300)

您的文件结构应如下所示:

markdown 复制代码
├── male.png
├── female.png
├── model
   ├── nainvemodel.pkl

用户界面

这是我们使用 Streamlit 中的不同工具来设计漂亮的 UI 的地方。

Python 复制代码
def main():
  """Gender Classifier App
    With Streamlit
  """

  st.title("Gender Classifier")
  html_temp = """
  <div style="background-color:blue;padding:10px">
  <h2 style="color:grey;text-align:center;">Streamlit App </h2>
  </div>
  """
  st.markdown(html_temp,unsafe_allow_html=True)
  load_css('icon.css')
  load_icon('people')

  name = st.text_input("Enter Name","Pleas Type Here")
  if st.button("Predict"):
    result = predict_gender([name])
    if result[0] == 0:
      prediction = 'Female'
      img = 'female.png'
    else:
      result[0] == 1
      prediction = 'Male'
      img = 'male.png'

    st.success('Name: {} was classified as {}'.format(name.title(),prediction))
    load_images(img)

代码解释如下:

  • 添加应用程序标题。
  • 通过添加应用程序的背景颜色、文本颜色和应用程序的总体结构来设计应用程序的样式。
  • 添加一个文本输入区域,用户可以在其中键入要预测为男性或女性的姓名。
  • 添加用户可用于提交输入的按钮。

我们在应用程序上设置以下样式:

css 复制代码
Background-color: blue
Text color: grey,
Padding: 10px,
App Title: Gender Classifier App

然后我们使用此命令运行我们的应用程序。

bash 复制代码
streamlit run app.py

我们的用户界面如下图所示。

  1. 输出为男性的预测。
  1. 预测输出为女性

Docker 部署 Streamlit 应用程序

  1. 让我们创建一个 Docker 文件。
  • 在工作根目录中,我们创建一个名为"Dockerfile"的文件,不带任何扩展名。
  • 您的文件结构应如图所示。
markdown 复制代码
├── Dockerfile
├── male.png
├── female.png
├── model
   ├── nainvemodel.pkl
  1. Docker镜像
  • 首先,我们定义要从中构建文件的基础镜像,如下所示。
yml 复制代码
FROM python:3.7
  • 这里我们将使用 Docker 的官方 Python 镜像。
  • 创建一个工作目录,如图所示。
yml 复制代码
WORKDIR /app
  • 将所有需求复制到创建的新目录中。
bash 复制代码
COPY requirements.txt ./requirements.txt
  • 从源复制到目标。
  • 安装文件中的所有内容requirments.txt
bash 复制代码
RUN pip install -r requiremts.txt
  • 公开用于运行应用程序的端口。
yml 复制代码
EXPOSE 8501
  • 这与我们的 Streamlit 应用程序运行的端口相同。
  • 将我们的应用程序从当前目录复制到工作区。
yml 复制代码
COPY ./app
  • 创建一个入口点以使我们的图像可执行。
yml 复制代码
ENTRYPOINT ["streamlit", "run"]
CMD ["app.py"]
  1. 构建 Docker 镜像
  • 我们使用以下命令进行构建,然后使用"." 运行当前目录。
bash 复制代码
docker build -t streamlitapp:latest .
  • 您还可以使用以下命令来指定文件。
bash 复制代码
docker build -t streamlitapp:latest .f Dockerfile
  • 输出如下所示。
bash 复制代码
Sending building context to the Docker daemon  34.90kb
Step 1/8 : FROM python:3.8
  --->d6568b1g3y4h
Step 2/8 : WORKDIR /app
  --->Using Cache
  --->25cyf5dfpbfd
Step 3/8 : COPY requirements.txt ./requirements.txt
    --->Using Cache
    --->52jdf5dffbfd
Step 4/8 : RUN pip install -r requiremts.txt
    --->Using Cache
    --->81cdf5dffedf
Step 5/8 : EXPOSE 8501
    --->Using Cache
    --->62d29afd9eb
Step 6/8 : COPY ./app
    --->9rraeb07t4d
Step 6/8 : EXPOSE 8501
    --->4b2ap4h557cc
Step 7/8 : ENTRYPOINT ["streamlit", "run"]
    --->2egaeb07tdte
Removing intermediate container 5ta3824edte
 ---> 65dv092efstfu
step 8/8 : CMD ["app.py"]
Successfully built 65dv092efstfu
Successfully tagged streamlitapp:latest
  • 使用以下命令查看所有图像。
bash 复制代码
docker image ls
  • 输出如图所示。
bash 复制代码
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
streamlitapp                 latest             65dv092efstfu        2 minutes ago       1.24GB
testapp                      latest             d660b1f1t3e         1 weeks ago          794MB
  1. 创建容器
bash 复制代码
docker run -p 8501:8501 streamlitapp:latest

结果:

bash 复制代码
gv092e0ff6btdte593a7dad8e50ef01f7t3e89fy41816624gdted7fu1h1bid1o

至此,Streamlit 应用程序现已使用 docker 进行部署。

相关推荐
小牛头#37 分钟前
clickhouse 各个引擎适用的场景
大数据·clickhouse·机器学习
失败又激情的man5 小时前
python之requests库解析
开发语言·爬虫·python
打酱油的;5 小时前
爬虫-request处理get
爬虫·python·django
kngines5 小时前
【力扣(LeetCode)】数据挖掘面试题0002:当面对实时数据流时您如何设计和实现机器学习模型?
机器学习·数据挖掘·面试题·实时数据
网安INF6 小时前
深度学习中批标准化与神经网络调优
人工智能·深度学习·神经网络·机器学习
慕木兮人可6 小时前
Docker部署MySQL镜像
spring boot·后端·mysql·docker·ecs服务器
用什么都重名7 小时前
MinerU:高效智能PDF文档解析工具完全指南
人工智能·python·pdf·mineru·makedown
倔强青铜三7 小时前
苦练Python第4天:Python变量与数据类型入门
前端·后端·python
这我可不懂7 小时前
Python 项目快速部署到 Linux 服务器基础教程
linux·服务器·python
倔强青铜三7 小时前
苦练Python第3天:Hello, World! + input()
前端·后端·python