Docker 是一个虚拟化平台,旨在通过使用容器来创建、运行和部署应用程序。我们将使用 Docker 部署一个使用 Streamlit 构建的简单机器学习应用程序。
在本教程中,我们将首先创建一个简单的机器学习模型,将其保存到要加载到我们平台中的 pickle 文件中,并使用 Streamlit 创建其界面。创建 Streamlit 应用程序后,我们将使用 docker 来部署它。
先决条件
- 对Python有很好的理解。
- 良好的机器学习模型应用知识。
构建简单的机器学习模型
让我们从构建一个简单的机器学习预测模型开始。我们将构建一个机器学习模型,根据用户的输入来预测一个人的性别。
数据集
我们将使用人们常用的名称数据集。
我们使用的数据格式如下图:
安装所需的软件包
我们需要以下包:
以下命令用于安装上面的软件包。
pip install sklearn
pip install pandas
pip install numpy
导入 Panda 和 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
将数据 F 和 M 替换为 0 和 1
这样做是为了提供 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)
创建朴素贝叶斯分类器模型
我们从 scikit-learn 包中导入朴素贝叶斯分类器算法。该模型将用于拟合和训练我们的模型。
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 应用程序
- 创建一个新的 Python 文件,名为
app.py
. - 将我们的 pickle 模型添加到创建的名为“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 中的不同工具来设计漂亮的 UI 的地方。
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
我们的用户界面如下图所示。
- 输出为男性的预测。
- 预测输出为女性
Docker 部署 Streamlit 应用程序
- 让我们创建一个 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
至此,Streamlit 应用程序现已使用 docker 进行部署。