📝
Docker composeで現場エンジニアのデータ解析環境を構築(jupyterlab mlflow mysql streamlit)
産業機械業界で働いているプロセスエンジニアのデータ解析環境を公開します。
プロセスエンジニアに必要なツール
- モデルが異なる実験を数多くする
👉 インタラクティブなデータ解析 - 過去の実験データを使えると好ましい
👉 モデル管理
👉 データベース活用 - 生データをグラフにして報告する機会が多い
👉 可視化アプリ
データ解析環境の概要
上記を満たす環境を以下のコンテナを用意して Docker compose でデプロイします。
- データ解析: jupyterlab
- モデル管理: mlflow
- データベース: mysql
- 可視化アプリ: streamlit
ディレクトリ構成
.
├── Read.md
├── db
│ └── data
├── docker
│ ├── jupyter
│ │ └── Dockerfile
│ ├── mlflow
│ │ └── Dockerfile
│ └── streamlit
│ └── Dockerfile
├── docker-compose.yml
├── etc
│ ├── cookiemamama.yaml
│ ├── exp
│ ├── my.cnf
│ └── requirements_simple.txt
├── mlruns
├── projects
│ └── experiment1
└── struns
└── main.py
実験ディレクトリは cookiecutter/datascience を用いて生成します。exp_name/notebookにノートブック、exp_name/srcにスクリプト、exp/data/rawにデータを配置します。
experiment1
├── LICENSE
├── Makefile
├── README.md
├── data
│ ├── external
│ ├── interim
│ ├── processed
│ └── raw
├── docs
│ ├── Makefile
│ ├── commands.rst
│ ├── conf.py
│ ├── getting-started.rst
│ ├── index.rst
│ └── make.bat
├── models
├── notebooks
├── references
├── reports
│ └── figures
├── requirements.txt
├── setup.py
├── src
│ ├── __init__.py
│ ├── data
│ │ ├── __init__.py
│ │ └── make_dataset.py
│ ├── features
│ │ ├── __init__.py
│ │ └── build_features.py
│ ├── models
│ │ ├── __init__.py
│ │ ├── predict_model.py
│ │ └── train_model.py
│ └── visualization
│ ├── __init__.py
│ └── visualize.py
├── test_environment.py
└── tox.ini
Docker-compose ファイル
docker-compose.yml
version: '3'
services:
db:
container_name: mysql
command: --default-authentication-plugin=mysql_native_password
environment:
- MYSQL_DATABASE=analysis_db
- MYSQL_ROOT_PASSWORD=root
- MYSQL_USER=docker
- MYSQL_PASSWORD=docker
- TZ=Asia/Tokyo
image: mysql:8.0
platform: linux/x86_64
ports:
- "3306:3306"
restart: always
volumes:
- ./db/data:/var/lib/mysql
- ./etc/my.cnf:/etc/mysql/conf.d/my.cnf
jupyter:
build:
context: .
dockerfile: ./docker/jupyter/Dockerfile
command: jupyter lab --ip=0.0.0.0 --port=8080 --allow-root --no-browser --NotebookApp.token=""
container_name: jupyterlab
depends_on:
- mlflow
- db
ports:
- "8080:8080"
restart: always
volumes:
- ./projects:/home/projects
mlflow:
build:
context: .
dockerfile: ./docker/mlflow/Dockerfile
command: mlflow server --backend-store-uri /home/mlruns --host 0.0.0.0 --port 5000
container_name: mlflow
ports:
- "5000:5000"
restart: always
volumes:
- ./mlruns:/home/mlruns
streamlit:
build:
context: .
dockerfile: ./docker/streamlit/Dockerfile
command: streamlit run struns/main.py
container_name: streamlit
depends_on:
- db
ports:
- "8501:8501"
volumes:
- "./struns:/usr/src/app/struns"
Docker ファイル
jupyterlab
pip で統一したかったので python ベースイメージを用いました。
python:3.x-slim, -slim-buster では jupyterlab がインストールできなかったので、-busterを使っています。
etc/cookiemamama.yaml
は cookiecutter の設定ファイルです。
etc/exp
は cookiecutter の設定ファイル実行するためのシェルスクリプトです。
jupyterlab==1.7.0 ではjupyter server extension disable nbclassic
を実行しないと起動しないようです。
docker/jupyter/Dockerfile
FROM python:3.8.10-buster
MAINTAINER mamamaJohn
USER root
WORKDIR /home/projects
COPY etc/requirements_simple.txt /tmp/requirements_simple.txt
COPY etc/cookiemamama.yaml /home/cookiemamama.yaml
COPY etc/exp /usr/local/bin/exp
RUN chmod 777 /usr/local/bin/exp
RUN pip install --upgrade pip setuptools && \
pip install -r /tmp/requirements_simple.txt
RUN jupyter server extension disable nbclassic
mlflow
ベストプラクティスには、プロセスごとにコンテナを分割するべきと書かれています。
jupyterlabコンテナでmlflowを起動させずに、別コンテナでmlflowを起動することにしました。
docker/mlflow/Dockerfile
FROM continuumio/miniconda:4.5.4
MAINTAINER mamamaJohn
USER root
WORKDIR /home
RUN pip install --upgrade pip && \
pip install mlflow
streamlit
mysqlのデータを可視化できるように ORM ライブラリの dataset をインストールしています。
/struns/main.py でアプリを立ち上げます。
docker/streamlit/Dockerfile
FROM python:3.8
MAINTAINER mamamaJohn
USER root
WORKDIR /usr/src/app
RUN pip install --upgrade pip setuptools && \
pip install streamlit pandas numpy matplotlib dataset mysqlclient
導入手順
- github から Development をクローンします。
git clone https://github.com/mamama039356/Development.git
- docker-compose.yml でコンテナを生成します。
cd Development
docker compose up -d
- projects 下で exp を入力して repo_nameで "project/expname" を入力します。2回目以降は project 下で exp を入力します。
- data/raw にデータを配置します。
- src/ にスクリプトを配置します。
- notebook に参考となるノートブックを配置します。
localhost:8080でjupyterlab, localhost:5000でmlflow, localhost:8501でstreamlitに繋がります。
Discussion