📝

Docker composeで現場エンジニアのデータ解析環境を構築(jupyterlab mlflow mysql streamlit)

2021/05/12に公開

産業機械業界で働いているプロセスエンジニアのデータ解析環境を公開します。

プロセスエンジニアに必要なツール

  • モデルが異なる実験を数多くする
    👉 インタラクティブなデータ解析
  • 過去の実験データを使えると好ましい
    👉 モデル管理
    👉 データベース活用
  • 生データをグラフにして報告する機会が多い
    👉 可視化アプリ

データ解析環境の概要

上記を満たす環境を以下のコンテナを用意して 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

導入手順

  1. github から Development をクローンします。
git clone https://github.com/mamama039356/Development.git
  1. docker-compose.yml でコンテナを生成します。
cd Development
docker compose up -d
  1. projects 下で exp を入力して repo_nameで "project/expname" を入力します。2回目以降は project 下で exp を入力します。
  2. data/raw にデータを配置します。
  3. src/ にスクリプトを配置します。
  4. notebook に参考となるノートブックを配置します。

localhost:8080でjupyterlab, localhost:5000でmlflow, localhost:8501でstreamlitに繋がります。

Discussion