使用 Docker 和 Docker-Compose 运行 Streamlit
创建一个 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 应用程序。

图片来自Christopher Samiullah:四种潜在的 ML 系统架构方法
Streamlit 是经典机器学习部署的替代方案
Streamlit 是一种新工具,可让您运行具有漂亮 UI 的交互式 Python 机器学习脚本。

来自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
更多推荐



所有评论(0)