创建一个 Docker 容器,将您的机器学习模型作为 Web 应用程序运行

本文将解释 Streamlit 的优势以及如何使用 Docker 构建 Streamlit 应用程序。

为什么选择 Streamlit?

您已经探索了数据并开发了机器学习模型。现在是时候将它发布给全世界,以便其他人可以看到您构建的内容。

怎么办?

部署机器学习模型并非易事。

您最有可能使用CONDA,安装了Python和数据科学的必要库(Numpy,[Pandas]]]]Scikit-learn,(https://scikit-learn.org/stable/index.html),[Jupyterlab]]](https://scikit-learn.org/stable/index.html)7.

该设置适用于数据探索和开发。但是,您将如何部署包含机器学习模型的 JupyterLab 笔记本?

答案是:你没有。

您将需要配置一个可以在生产中运行的新架构,例如带有 REST API 的 Web 应用程序。

四种潜在的 ML 系统架构接近

图片来自Christopher Samiullah:四种潜在的 ML 系统架构方法

Streamlit 是经典机器学习部署的替代方案

Streamlit 是一种新工具,可让您运行具有漂亮 UI 的交互式 Python 机器学习脚本。

Streamlit 演示

来自Streamlit.io的视频:构建具有 23 个功能的语义搜索引擎

Streamlit 的界面类似于熟悉的 Python 笔记本,您将作为数据科学家知道。但 Streamlit 应用程序提供了现代 UI、具有交互作用的小部件和内置 Web 服务器。

您可以使用您喜欢的文本编辑器来编辑您的代码,Streamlit 会为您更新代码。

安装很容易如果您使用典型的 Python 安装程序,例如pip或 conda。

但是如果你想用 Docker 和 docker-compose** 创建一个**独立的应用程序呢?

如何构建Streamlit Docker容器

先决条件:

  • 码头工人

  • 码头工人组成

创建一个新的项目文件夹,其文件夹结构如下(或类似):

.
├── data
├── docker-compose.yml
├── Dockerfile
├── images
│   ├── logo.png
│   └── screenshot.png
├── LICENSE
├── project
│   └── app.py
├── README.md
└── requirements.txt

进入全屏模式 退出全屏模式

data文件夹将保存所有原始数据,例如 .csv 文件。project文件夹将包含 Streamlit 程序。

Python库的安装

创建requirements.txt文件:

scikit-learn==0.22.2.post1
streamlit==0.56.0

进入全屏模式 退出全屏模式

Docker 和 docker-compose

创建一个名为Dockerfile的新文件,其内容如下:

###############
# BUILD IMAGE #
###############
FROM python:3.8.2-slim-buster AS build

# virtualenv
ENV VIRTUAL_ENV=/opt/venv
RUN python3 -m venv $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"

# add and install requirements
RUN pip install --upgrade pip
COPY ./requirements.txt .
RUN pip install -r requirements.txt

#################
# RUNTIME IMAGE #
#################
FROM python:3.8.2-slim-buster AS runtime

# setup user and group ids
ARG USER_ID=1000
ENV USER_ID $USER_ID
ARG GROUP_ID=1000
ENV GROUP_ID $GROUP_ID

# add non-root user and give permissions to workdir
RUN groupadd --gid $GROUP_ID user && \
          adduser user --ingroup user --gecos '' --disabled-password --uid $USER_ID && \
          mkdir -p /usr/src/app && \
          chown -R user:user /usr/src/app

# copy from build image
COPY --chown=user:user --from=build /opt/venv /opt/venv

# set working directory
WORKDIR /usr/src/app

# switch to non-root user
USER user

# disables lag in stdout/stderr output
ENV PYTHONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1
# Path
ENV PATH="/opt/venv/bin:$PATH"

# Run streamlit
CMD streamlit run project/app.py

进入全屏模式 退出全屏模式

Docker 配置使用多阶段构建。在第一阶段,我们在虚拟环境中安装所有必要的 Python 包。

在构建阶段,您还可以安装gcc之类的 Debian 软件包,您不想将其带入运行时 Docker 映像。

例如,在使用 pip 安装软件包之前,可以添加以下行:

# install dependencies
RUN apt-get update && \
    apt-get install -y --no-install-recommends gcc

进入全屏模式 退出全屏模式

目前,这不是必需的,所以让我们继续使用运行时映像。

我们确保我们创建一个具有正确用户权限的非 root 用户。然后我们可以将 Python 库从构建镜像复制到运行时镜像。

最后一行显示了运行 Streamlit 的命令。

不要忘记添加一个.dockerignore文件。例如:

# .dockerignore
.venv
.env*

进入全屏模式 退出全屏模式

为了方便,我们可以添加一个docker-compose.yml配置:

version: '2.4'

services:
  streamlit:
    build:
      dockerfile: ./Dockerfile
      context: ./
    ports:
      - '8501:8501'
    volumes:
      - './data:/usr/src/app/data:delegated'
      - './project:/usr/src/app/project:delegated'
    environment:
      - USER_ID=1000
      - GROUP_ID=1000

进入全屏模式 退出全屏模式

该设置还将本地文件夹从您的计算机安装到 Docker 容器。现在您可以在使用 Docker 的同时开发您的应用程序并保存更改。

匹配的 docker 命令是:

# build Docker image in current directory
docker build -t 'latest' .
# Run docker image with port 8501 and volumes
docker run -it --rm --port '8501:8501' -v '$(pwd)/data:/usr/scr/app/data:delegated' -v '$(pwd)/project:/usr/scr/app/project:delegated' latest

进入全屏模式 退出全屏模式

创建Streamlit程序

project文件夹中,添加一个新文件 (app.py):


# simple_streamlit_app.py
"""
A simple streamlit app
"""

import numpy as np
import pandas as pd
import streamlit as st

st.title("Simple Streamlit App")

st.write("Here's our first attempt at using data to create a table:")
st.write(
    pd.DataFrame({"first column": [1, 2, 3, 4], "second column": [10, 20, 30, 40]})
)

进入全屏模式 退出全屏模式

运行应用程序

您现在可以使用docker-compose在后台启动 Docker 容器。

在终端中输入:

docker-compose up -d

进入全屏模式 退出全屏模式

在您的浏览器中,您应该会看到 Streamlit 应用程序在http://localhost:8501上运行。

现在,您可以使用 Python 技能和Streamlit 框架来创建数据丰富的应用程序。

回顾

你已经学会了:

  • 为什么您可能希望使用 Streamlit 进行数据科学和 Python 机器学习

  • 如何使用 Docker 安装 Streamlit 并运行您的第一个数据科学 Web 应用程序

怎么办?

您可以将 Docker 容器部署到 Heroku、DigitalOcean 或其他云提供商。

以后我会写一篇关于部署到 Heroku 的博文。

延伸阅读

  • Streamlit官网

  • 如何在 Python 中构建 Streamlit 应用程序by Peter Kazarinoff

  • 如何部署机器学习模型Christopher Samiullah

  • 避免使用 Docker 创建的文件出现权限问题by Vladislav Supalov

  • 以当前主机用户身份运行 Docker 容器by Juan Treminio

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐