使用Docker部署一个简单的Streamlit应用程序
Docker是一个虚拟化平台,旨在通过使用容器来创建、运行和部署应用程序。我们将使用Docker来部署一个用Streamlit构建的简单机器学习应用。
在本教程中,我们将首先创建一个简单的机器学习模型,将其保存在一个pickle文件中,以便载入我们的平台,并使用Streamlit创建其界面。创建完Streamlit应用后,我们将使用docker来部署它。
前提条件
- 对Python有良好的理解。
- 对机器学习模型有良好的了解。
建立一个简单的机器学习模型
让我们从建立一个简单的机器学习预测模型开始。我们将建立一个机器学习模型,根据用户的输入来预测一个人的性别。
数据集
我们将使用一个人们常用的名字的数据集。我们使用的数据格式如图所示。

所需软件包的安装
我们需要以下软件包。
下面的命令用于安装上述软件包。
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
特征和标签
在确定了用于训练模型的特征和标签后,我们可以将我们的数据集分成两部分。
- 训练集。这将是75%的数据。
- 测试集。这将是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应用
- 创建一个名为
app.py的新Python文件。 - 将我们的pickled模型添加到创建的名为'model'的文件夹中。
我们的文件夹结构应该是这样的。
├── app.py
├── model
├── naivebayesgendermodel.pkl
- 导入所需的包。
import streamlit as st
from sklearn.externals import joblib
import time
from PIL import Image
- 解除模型的标签。
这将有助于加载我们的模型,以便它可以用于性别预测。在这里,来自'naivemodel.pkl'文件的字节流被转换为一个对象层次,这样它就可以被streamlit应用程序使用。
gender_nv_model = open("models/naivemodel.pkl","rb")
gender_clf = joblib.load(gender_nv_model)
- 构建我们的预测逻辑。
def predict_gender(data):
vect = gender_cv.transform(data).toarray()
result = gender_clf.predict(vect)
return result
- 塑造应用程序的风格 我们将为我们的应用程序使用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)
- 添加图片
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
我们的用户界面如下图所示。
- 输出为男性的预测。

- 输出为女性的预测

Dockerizing the streamlit app
- 我们来创建一个Docker文件。
-
在工作根目录下,让我们创建一个名为 "Dockerfile "的文件,没有任何扩展名。
-
你的文件结构应该如图所示。
├── Dockerfile
├── male.png
├── female.png
├── model
├── nainvemodel.pkl
- 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"]
- 构建一个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
- 创建一个容器
docker run -p 8501:8501 streamlitapp:latest
结果。
gv092e0ff6btdte593a7dad8e50ef01f7t3e89fy41816624gdted7fu1h1bid1o
它还在以下的URL中启动了我们的streamlit应用程序。
- 网络URL:http://172.17.0.2.8501
- 外部URL:https://193.106.63.249:8501
就这样,Streamlit应用现在已经用docker部署了。
总结
在本教程中,我们学习了如何创建一个简单的机器学习模型,如何使用该模型创建一个steamlit应用,最后使用Docker来运行该应用。
我们首先开始使用我们的机器学习模型建立一个性别分类模型。在建立模型后,我们使用streamlit设计了一个用户界面。Streamlit是一个很好的库,大多数开发者在短时间内构建机器学习应用时都会使用。
Streamlit设计了一个用户界面,终端用户可以用它来根据用户提供的名字对性别进行预测。
在确保我们的streamlit应用功能齐全后,我们最终通过创建一个docker镜像来部署到docker。然后我们用这个镜像创建一个docker容器,最后运行我们的应用程序。