データサイエンス環境をコンテナで構築して Jupyter Lab を使用する

はじめに

みなさんこんにちは。エヌデーデーの奥田です。今回は Docker を使用してデータサイエンス環境をコンテナの中に構築し、その中で Jupyter Lab を使用しようという記事になります。

最近データサイエンスの勉強を始める事となり、その為の環境を構築することとなりました。Python や Jupyter Lab、その他各種ライブラリなどを端末にインストールする必要が出てきたのですが、データサイエンスに必要な環境を構築する場合、結構な数のモジュール類のインストールが必要になります。

私の端末がそれ専用のものなら良いのですが、データサイエンス作業用以外の様々なツールやライブラリがインストールされており、ここにデータサイエンス環境を共存させることは躊躇します。

データサイエンス環境を構築する際のメジャーなやり方として Anaconda という Python のディストリビューションをインストールする方法があります。Anaconda はデータサイエンス系の様々なライブラリが梱包されており、Python 本体だけでなく、Jupyter Lab 等も梱包されています。ですのでこの Anaconda をインストールすれば各種ツールやライブラリをかき集めてくる手間が省けるのですが、自端末に既にインストールされている Python をアンインストールする必要があるなど、既存の環境への影響が懸念されました。

という事でデータサイエンス環境は自端末に直接構築するのではなく Docker を使用してコンテナ化する事にしました。こうすることで、自端末の環境を壊すことなく、又、私の様なデータサイエンス初心者が気軽に環境構築を行える様になります。何かやらかしてしまっても影響はコンテナの中だけですし、間違ったライブラリをインストールしてコンテナ内の環境を壊してしまっても、Dockerfile を書き直して再ビルドすれば直ぐに環境を修復できます。今回はその方法をご紹介します。

この記事を読んでできること

  • コンテナ内に Anaconda ベースのデータサイエンス環境を構築する
  • コンテナ内の Jupyter Lab の簡単な使い方が分かる
環境

  • Windows 10
  • Docker Desktop for Windows 3.0.4
その他

  • 記事の最後で Google Cloud Platform 上で Jupyter Notebook を使用する方法も少し紹介しています

Anaconda イメージからコンテナを作成する

任意のフォルダー内に以下の 3 つのファイルを用意します。

  • Dockerfile
  • docker-compose.yml
  • matplotlibrc

最後の matplotlibrc ファイルはグラフを書く際に日本語を使用できるように設定する為のものなので、その必要がなければ無くても構いません。それぞれ詳しく説明していきます。

Dockerfile

今回のデータサイエンス環境は Docker 社が提供する Docker レジストリの Docker Hub に公式の Anaconda3 のイメージがあるのでこれを使用します。併せて必要なライブラリや日本語フォントのインストールなどを行います。

# Anaconda イメージ
FROM continuumio/anaconda3:2020.11

# 日本語フォントとライブラリをインストール
RUN pip install --upgrade pip && \
    pip install graphviz pydotplus

RUN apt-get update && \
    apt-get install -y fonts-takao-gothic graphviz

# 作業ディレクトリを作成
WORKDIR /workdir

# コンテナ側のリッスンポート
EXPOSE 8888

# コンテナ起動時に実行するコマンドを指定
ENTRYPOINT ["jupyter-lab", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root", "--NotebookApp.token=''"]
CMD ["--notebook-dir=/workdir"]

この例では Jupyter Notebook でデータ解析に使用する為に必要なライブラリ graphviz と pydotplus をインストールしています。必要に応じてインストールするライブラリは変更してください。また、日本語フォントとして fonts-takao-gothic もインストールしています。

docker-compose.yml

アプリケーションを動かすための定義を記述しているファイルです 。今回は jupyter_lab というサービスをポート 8080 で定義しています。また、自端末のファイルを置いたフォルダーをコンテナ側の /workdir ディレクトリにマウントしています。

version: '3'
services:
  jupyter_lab:
    build:
      context: .
      dockerfile: Dockerfile
    image: anaconda_image
    ports:
    - "8080:8888"
    volumes:
    - .:/workdir

matplotlibrc

Anaconda をインストールするとグラフ描画用のライブラリである Matplotlib もインストールされます。ただ、そのままだとグラフ描画の際に日本語が使用できないので日本語フォント fonts-takao-gothic をインストールすることとしました。

インストールしたフォントを使用する為に matplotlibrc という Matplotlib の設定ファイルに fonts-takao-gothic の記述を行います。修正した設定ファイルは /workdir 配下に置いておけば Jupyter Lab 側で検出されて適用されるので特にやることはありません。

修正箇所は font.serif と font.sans-serif の頭にある # を取ってコメントを外し、TakaoGothic を追加するだけです。

#font.family:  sans-serif
#font.style:   normal
#font.variant: normal
#font.weight:  normal
#font.stretch: normal
#font.size:    10.0

font.serif:      TakaoGothic, DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif
font.sans-serif: TakaoGothic, DejaVu Sans, Bitstream Vera Sans, Computer Modern Sans Serif, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif
#font.cursive:    Apple Chancery, Textile, Zapf Chancery, Sand, Script MT, Felipa, cursive
#font.fantasy:    Comic Neue, Comic Sans MS, Chicago, Charcoal, ImpactWestern, Humor Sans, xkcd, fantasy
#font.monospace:  DejaVu Sans Mono, Bitstream Vera Sans Mono, Computer Modern Typewriter, Andale Mono, Nimbus Mono L, Courier New, Courier, Fixed, Terminal, monospace

修正したファイル全体をアップロードしておきます。※当サイトの仕様上の問題で拡張子無しのファイルが上げられなかったので、ダウンロードした際は拡張子 .txt を外して使用してください。

また、使用する Anaconda イメージのバージョンを変更した際などにこの matplotlibrc を再取得して修正しなおす必要がある場合も考えて、設定ファイルの場所を調べる方法を記載しておきます。

作成したコンテナの中で Python で以下を実行してください。設定ファイルの場所が表示されます。

import matplotlib as plt
plt.matplotlib_fname()

ここで表示された設定ファイルを直接編集してしまうとコンテナを再作成した際に元に戻ってしまうので、/workdir にコピーしてから修正してください。また、修正後はコンテナを再起動させるなどして変更を反映してください。

コンテナをビルドして立ち上げる

前述の 3 つのファイルを配置したフォルダーで作業を行います。Windows のコマンドプロンプトを立ち上げて該当フォルダーへ移動します。

コンテナのビルドを行います。次のコマンドを実行します。

docker-compose build

ビルドの途中で debconf: delaying package configuration, since apt-utils is not installed という警告が出ますがこれは無視して問題ありません。最後に Successfully tagged anaconda_image:latest と表示されれば成功です。

コンテナを起動します。同じくそのフォルダーで次のコマンドを実行します。

docker-compose up

起動したコンテナを止める場合はコマンドプロンプト上で ctrlキー + C を押してください。また、起動したコンテナの中に入ってその中の Linux(debian)上で作業をしたい場合はコマンドプロンプトで以下のコマンドを実行してください。

docker-compose exec jupyter_lab bash

Jupyter Lab を使ってみる

コンテナを起動したらブラウザから http://localhost:8080/ にアクセスしてください。Jupyter Lab の画面が開きます。

Jupyter Lab画面

カレントディレクトリはコンテナ内の /workdir となっています。つまり、Dockerfile などを置いた自端末のフォルダーです。ですので、Jupyter Notebook を使用してそのファイルを保存するとコンテナの中ではなく、自端末の中に保存されます。これでコンテナを再作成したりしても作成したファイルは消えずに残ります。

それでは早速 Jupyter Notebook を使用してみましょう。右側の Launcher タブの中の Notebook と書いてある下の Python3 のボタンを押します。

Notebook のタブが立ち上がるので早速 Python で処理を書いてみます。

今回は気象庁からダウンロードしてきたオープンデータを使用します。東京の 1 年間の気象情報を取得してきました。また、取得したままでは使えないのでヘッダー部分を英字に修正するなど加工を行っています。

次のファイルを自端末の Dockerfile と同じフォルダーに配置してください。Jupyter Lab 側のファイルリストの中にも表示されます。

Jupyter Notebook の詳しい説明は省きますが、下の実行イメージ画面を参考にして Python を記述してください。各セル毎に、処理を入力したら「実行」ボタン(又は shiftキー + enterキー)を押して実行します。

Jupyter Notebook実行イメージ
Jupyter Notebook実行イメージ

各セルに記述した処理は以下の通りです。

使用するライブラリをインポートし、また、matplotlib のグラフを画面に表示する設定を行います。

import pandas as pd
from matplotlib import pyplot as plt
%matplotlib inline

weather.csv を読み込みます。その際に 1 列目をインデックスとして指定し、且つ、日付として扱うよう指定します。読み込んだ結果は weather という変数に格納します。

weather = pd.read_csv("weather.csv", index_col=0, parse_dates=[0])

weather 変数の先頭 5 行を表示してみます。

weather.head()

読み込んだファイルの中の humidity というのが気圧データです。これをグラフ化しています。日本語のタイトルをつけてみました。

g = weather["humidity"].plot(figsize=(12, 4), title="東京の気圧変化")
g.set_xlabel("日付")
g.set_ylabel("気圧")

手順 まとめ

色々と書きましたがコンテナで Jupyter Lab を使うまでの手順は簡単です。

  1. Dockerfile、docker-compose.yml、madplotlibrc の 3 つのファイルを任意のフォルダーにコピーする
  2. 該当フォルダーで docker-compose builddocker-compose up コマンドを実行する
  3. ブラウザから http://localhost:8080/ にアクセスする

GCP で Jupyter Lab を使ってみる

今回は自端末の環境を壊したくないのでコンテナでデータサイエンス環境を構築することにしましたが、クラウドを利用する手もあります。例えば Google Cloud Platform(GCP) では JupyterLab 環境をマネージドで提供するサービス があります。このサービスで提供される環境には TensorFlow、Keras、PyTorch、fast.ai、RAPIDS、NumPy、scikit-learn、pandas、Matplotlib など、一般的に使用されるデータ サイエンス ライブラリと機械学習ライブラリがあらかじめ構成されているのでお手軽にデータ分析を始められます。

この GCP の AI Platform Notebooks の使い方も少し紹介します。

GCP コンソールから「AI Platform」-「ノートブック」を選択します。

初めて使う場合は NOTEBOOKS API を有効にするか聞かれるので、リンクを押して API を有効化してください。

API が有効化されると新しいインスタンスの作成が行えます。インスタンスとはクラウド上に立ち上がる仮想の PC 端末だと考えてください。クラウド上にデータサイエンス用の端末を用意するということになります。

どの様なタイプの環境を作るのか聞かれるので今回は Python 3 を選択します。

今回は「python-notebook」という名前で東京のデータセンターにインスタンスを作成します。

作成ボタンを押してから 1~2 分待つとインスタンスが作成されるので「JUPYTERLAB を開く」リンクを押します。

コンテナで作った場合と変わらない Jupyter Lab の画面が開きます。試しにコンテナで実行した処理を流してみます。weather.csv をアップロードして Python を入力し実行します。

基本的に同じ結果が得られました。ただ、日本語フォントは設定されていないらしく日本語は文字化けしてしまいました。インスタンスに日本語フォントをインストールして madplotlibrc 設定ファイルを書き換えてあげるなどの作業が必要です。

また、コンテナの作成では graphviz と pydotplus ライブラリを追加インストールしていましたが、この AI Platform Notebooks では graphviz はあらかじめインストールされており、pydotplus はインストールされていませんでした。

足らないライブラリは Jupyter Notebook 上で %pip install [ライブラリ名] と入力すればその場でインストールされますし、コンテナと違ってインスタンスを再起動してもインストールしたライブラリは消えません。コンテナの場合は恒久的にライブラリを残したい場合は Dockerfile に記述して再ビルドする必要があります。

コンテナと GCP のどちらもお手軽にデータサイエンス環境を構築できますが、それぞれ一長一短はあります。GCP では大規模なデータ解析に必要な強力なマシンと大容量のストレージを瞬時に用意できますが有料です。対してコンテナは手元の端末で事足りるデータ解析であれば常に無料です。ただ、Dockerfile の記述など若干の管理の手間が増えます。

場合によっては作成したコンテナをクラウド上で稼働させるといったハイブリッドな使い方もあると思います。ここら辺は皆さんの状況に合わせてうまく使い分けて頂ければと思います。

さいごに

冒頭で述べた通りデータサイエンティスト駆け出しの私ですが、取っ掛かりで躓きそうな環境構築部分をコンテナで解決することが出来ました。分からないことだらけの世界でインストールして良いのか悪いのか等、結構ストレスが溜まる部分だと思います。この部分をコンテナで行うことで失敗したら直ぐに環境を作り直せるのは非常に心強いです。

という訳で、同じくこれからデータサイエンティストを目指そうという方の一助になれれば幸いです。