如何使用Docker部署一个简单的Streamlit应用程序

1,250 阅读7分钟

使用Docker部署一个简单的Streamlit应用程序

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

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

前提条件

  1. 对Python有良好的理解。
  2. 对机器学习模型有良好的了解。

建立一个简单的机器学习模型

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

数据集

我们将使用一个人们常用的名字的数据集。我们使用的数据格式如图所示。

A Snip of the data

所需软件包的安装

我们需要以下软件包。

  1. Sckit-learn
  2. Pandas
  3. Numpy

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

pip install sklearn
pip install pandas
pip install numpy

导入熊猫和Numpy

import pandas as pd
import numpy as np

从sckitlearn导入

import CountVectorizer from sklearn.feature_extraction.text
import DictVectorizer from sklearn.feature_extraction
df = pd.read_csv('dataset.csv')
df.size
df.dtypes

检查缺失值

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

df.isnull().isnull().sum()

检查男性和女性的数量

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

df[df.sex == 'F'].size
df[df.sex == 'M'].size
df_names = df

用0和1替换数据F和M

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

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

特征提取

cv = CountVectorizer()
X = cv.fit_transform(Xfeatures)

模型的处理

import train_test_split from sklearn.model_selection

特征和标签

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

  1. 训练集。这将是75%的数据。
  2. 测试集。这将是25%的数据。
X
y = df_names.sex
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)

创建Naive Bayes分类器模型

我们从scikit-learn包中导入Naive Bayes分类器算法。该模型将被用来拟合和训练我们的模型。

import MultinomialNB from sklearn.naive_bayes
clf = MultinomialNB()
clf.fit(X_train,y_train)
clf.score(X_test,y_test)

进行预测

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

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文件中。

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

streamlit简介

Streamlit是一个框架,被不同的机器学习工程师和数据科学家用来从训练好的模型中建立UI和强大的机器学习应用程序。

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

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

如何安装streamlit

使用以下命令。

pip install streamlit

让我们建立streamlit应用

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

我们的文件夹结构应该是这样的。

├── app.py
├── model
   ├── naivebayesgendermodel.pkl
  1. 导入所需的包。
import streamlit as st

from sklearn.externals import joblib
import time
from PIL import Image
  1. 解除模型的标签。

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

gender_nv_model = open("models/naivemodel.pkl","rb")
gender_clf = joblib.load(gender_nv_model)
  1. 构建我们的预测逻辑。
def predict_gender(data):
  vect = gender_cv.transform(data).toarray()
  result = gender_clf.predict(vect)
  return result
  1. 塑造应用程序的风格 我们将为我们的应用程序使用Material UI的风格和图标。
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. 添加图片
def load_images(file_name):
  img = Image.open(file_name)
  return st.image(img,width=300)

你的文件结构应该如图所示。

├── male.png
├── female.png
├── model
   ├── nainvemodel.pkl

设计用户界面

在这里,我们使用streamlit的不同工具来设计一个漂亮的用户界面。

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)

代码解释如下。

  • 添加应用程序的标题。
  • 通过添加应用程序的背景颜色、文本颜色和应用程序的总体结构来为我们的应用程序定型。
  • 添加一个文本输入区,用户可以在其中输入一个名字,以预测为男性或女性。
  • 添加一个按钮,用户可以用它来提交输入。

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

Background-color: blue
Text color: grey,
Padding: 10px,
App Title: Gender Classifier App

然后我们用这个命令运行我们的应用程序。

streamlit run app.py

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

  1. 输出为男性的预测。

Male Prediction

  1. 输出为女性的预测

Female Prediction

Dockerizing the streamlit app

  1. 我们来创建一个Docker文件。
  • 在工作根目录下,让我们创建一个名为 "Dockerfile "的文件,没有任何扩展名。

  • 你的文件结构应该如图所示。

├── Dockerfile
├── male.png
├── female.png
├── model
   ├── nainvemodel.pkl
  1. Docker分层
  • 首先,我们定义我们的基础镜像,我们要从那里建立我们的文件,如下图所示。
FROM python:3.7
  • 这里我们将使用Docker的官方Python镜像。

  • 创建一个工作目录,如图所示。

WORKDIR /app
  • 将所有的需求复制到新创建的目录中。
COPY requirements.txt ./requirements.txt
  • 从源头复制到目的地。

  • 安装requirments.txt 文件中的所有内容。

RUN pip install -r requiremts.txt
  • 暴露要用来运行应用程序的端口。
EXPOSE 8501
  • 这与我们的streamlit应用程序所运行的端口相同。

  • 将我们的应用程序从当前目录复制到工作区。

COPY ./app
  • 创建一个入口点,使我们的镜像可以执行。
ENTRYPOINT ["streamlit", "run"]

CMD ["app.py"]
  1. 构建一个Docker镜像
  • 我们使用下面的命令构建,然后". "来运行当前目录。
docker build -t streamlitapp:latest .
  • 你也可以使用下面的命令来指定文件。
docker build -t streamlitapp:latest .f Dockerfile
  • 输出结果将如下图所示。
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
  • 使用下面的命令来查看你的所有镜像。
docker image ls
  • 输出如图所示。
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
streamlitapp                 latest             65dv092efstfu        2 minutes ago       1.24GB
testapp                      latest             d660b1f1t3e         1 weeks ago          794MB
  1. 创建一个容器
docker run -p 8501:8501 streamlitapp:latest

结果。

gv092e0ff6btdte593a7dad8e50ef01f7t3e89fy41816624gdted7fu1h1bid1o

它还在以下的URL中启动了我们的streamlit应用程序。

  1. 网络URL:http://172.17.0.2.8501
  2. 外部URL:https://193.106.63.249:8501

就这样,Streamlit应用现在已经用docker部署了。

总结

在本教程中,我们学习了如何创建一个简单的机器学习模型,如何使用该模型创建一个steamlit应用,最后使用Docker来运行该应用。

我们首先开始使用我们的机器学习模型建立一个性别分类模型。在建立模型后,我们使用streamlit设计了一个用户界面。Streamlit是一个很好的库,大多数开发者在短时间内构建机器学习应用时都会使用。

Streamlit设计了一个用户界面,终端用户可以用它来根据用户提供的名字对性别进行预测。

在确保我们的streamlit应用功能齐全后,我们最终通过创建一个docker镜像来部署到docker。然后我们用这个镜像创建一个docker容器,最后运行我们的应用程序。