🐳

Datascience notebookに、パイプライン管理ツール`Elyra`を追加した。

2020/10/22に公開

要旨

DockerHubのjupyter/datascience-notebookで配布されているイメージに、Jupyter公式で開発されているPipeline管理ツールElyraを導入して、Pipelineでノートブックを管理できるようにしました。その実行手順と実行サンプルを書いていますので、皆さん試してみてください。

序論

皆さん、データサイエンスしてますか。データサイエンスのお供といえば、JupyterNotebookです。とりあえず書いて即実行できるので、PDCAが非常に回しやすいですよね。また、Dockerイメージとして、開発環境が公開されており、これを利用すれば、どんなPCでもあっという間に環境を構築して、作業を始めることができます。でも、お手軽な分、ファイル管理に困ったりしますよね。例えば、こんな感じ。

root/
├ 前処理1.ipynb     # とりあえずで名前をつけとこ...。
├ 前処理1.5.ipynb   # 途中で処理が必要だった!後から追加した
├ 前処理2.ipynb
├ 学習1.ipynb     # 実は関係ないノートブックだから実行する意味はないんだよね
├ 学習ver2.ipynb
├ 中間処理.ipynb     # どこで実行するんだっけ
└data/result.csv

ノートブック単体が大きすぎたり、再利用したくなるとノートブックを分けたくなりますが、上のようにノートブックを量産していくとあっという間にカオスが生まれます。これでは次のような問題を孕んでしまいます。

  • 実行順序を覚えておくのが大変
  • いつ実行すればよいのか分からないファイルが出来る
  • 実は実行に関係ないファイルが出来る

このようなファイルの管理に時間を取られてデータサイエンスに集中できないのは良いことではありません。
今回は、この「実行方法が整理されていない」問題に着目して、Elyraを使って解決を図ります。

Elyraについて

ElyraはIBM社がOSSとして開発しているパイプライン管理ツールで、2020/8/6にバージョン1.0.0が発表されました。この記事によれば

Jupyterノートブックがデータサイエンスの定番になりつつある中、IBMはElyra AIツールキットを公開してパーティに参加することを決めた。
このプロジェクトは、「Jupyter NotebooksへのAI中心の拡張機能」と、AI開発プロセスを簡素化するための新しいユーザー・インターフェースを提供することを目的としています。
最初のイテレーションでは、Elyraはパイプライン用のビジュアルエディタ、ハイブリッドランタイムのサポート、ノートブックをバッチジョブとして実行する機能などを備えています。
また、バージョン管理システムのgitとの統合もパッケージに含まれており、何が変更されたのか、どこで何かがうまくいかなかったのかを追跡できるようになっています。

と書かれています。(DeepLを用いて翻訳)

Elyraと他のpipeline管理ツール

ElyraはJupyterNotebookと簡単に連携できる点が一番の強みです。特に実装前の調査や仮組みに威力を発揮します。Elyraを比較検討するために、pythonのエコシステムに視座を広げると、Luigi, Metaflow, Kedro, Airflow, Kubeflowといった競合も存在します。これらと比較すると、特に実行したpipeline毎の管理や実行状況の管理に難があると言えそうです。逆に、Elyraはpipeline Editorのおかげで「pipeline設定にほとんどコストをかけずに済む」という点で非常に優れています。特にプロダクションコードに落とし込む前の不定形な調査では、なるべくコストをかけたくないため、そういった環境下で複雑な処理を実行できる強みがあります。また、kaggleや各種分析サービスを提供する場合など、稼働がある時期に集中して、その後はほとんどコードを動かさない場面でも重宝するでしょう。

本稿で実施すること

このElyradatascience-notebookに導入することで「実行方法が整理されていない」問題を解決します。具体的には、jupyter/datascience-notebookをベースにElyraを導入するDockerfileを用意してbuildすることで環境を構築しました。また、buildしたイメージをDockerHubにアップロードしておき、いつでも誰でも使えるようにしています。

解決した問題

Elyraを導入したjupyter/datascience-notebookを用いることで、以下の問題が次のように解決されました。

  • 実行順序を覚えておくのが大変
    • pipeline editorを使うことで、実行順序を.pipelineファイルに保存できる。
    • ファイルで保存されているので、gitを用いて同僚に頒布もできる
  • いつ実行すればよいのか分からないファイルが出来る
    • .pipelineを確認すればいつ実行すれば良いか分かるし、そもそもpipelineを実行すれば順番どおりに実施してくれる
  • 実は実行に関係ないファイルが出来る
    • .pipelineにないファイルは実行に関係ないことがわかる。
    • 切り替えたいときはpipeline editorを使えばすぐに切り替えられる。

すばやく試すには

あなたも、以下のコードを実行して、http://localhost:8888でいつでもその威力を試すことができます。

docker run -p 8888:8888 ghcr.io/amazyra/elyra-in-datasciencebook/elyra-in-datasciencebook:latest

もし、サンプルファイルを作るのが面倒くさければ、ここにElyra開発チームが作ったサンプルコードが有るので以下のコマンドを実行してサンプルを手に入れましょう。

git clone git@github.com:elyra-ai/examples.git

先に提示したイメージは、このリポジトリで作られています。もし、気に入ったらスターを追加してください!他に良いツールや、バグなどがあれば、是非コメント欄で教えて下さいね!

環境構築

概要

本節では、elyrajupyter/datascience-notebook上に導入するプロセスについて説明したいと思います。この章を全て読むことで、elyraを含むDockerfileとそれを起動するためのdocker-compose.ymlを手に入れることができます。また、この結果は、このリポジトリに含まれています。

Dockefileの作成

ここでは、実際にDockerfileを用いてjupyter/datascience-notebook上に、elyraを導入してみましょう。ソースコードは以下のとおりです。

FROM jupyter/datascience-notebook
# install elyra
RUN conda install -c conda-forge elyra
RUN jupyter lab build --dev-build=False --minimize=False
RUN jupyter serverextension list

ここでは、各レイヤーでの実行結果を明示するために、3つのレイヤーに分けて書いていますが、本番環境に導入するなど、キャッシュが気になる場合は別途調整するべきであることをお伝えしておきます。

さて、各行で何を実行しているのかを説明していきます。

RUN conda install -c conda-forge elyra

ここでは、elyraconda-forgeからダウンロードしてきています。jupyter/datescience-notebookはpythonのパッケージ管理ツールとして、Anacondaを利用しています。Anacondaconda-forgeについては、それぞれAnacondaリファレンス, conda-forge公式サイトを確認してください。

RUN jupyter lab build --dev-build=False --minimize=False

ここで、インストールしたelyraをjupyter環境に組み込んでいます。オプションをつけずとも実行できますが、メモリが不足している環境では、--dev-build=False--minimize=FalseをONすることでビルドが可能になる場合があります。筆者のPCでは、このオプションをつけないと失敗したため、つけています。

RUN jupyter serverextension list

elyraがインストールされているか確認するために、このコマンドを利用しています。もし、elyraが有効になっていない場合はjupyter serverextension enable elyraを実行するようにしてください。

Docker-composeの作成

先程作ったDockerfileがあれば、Dockerコマンドを用いるコンテナを立てることができますが、せっかくなのでdocker-compose.ymlを作っておきましょう。(筆者はオプションを毎回書くのが嫌いなので、docker-composeをすぐに作りたがります。)

version: '3'
services:
  notebook:
    build: .
    environment: 
      - "TZ=Asia/Tokyo"
    volumes:
      - ./data:/home/jovyan/data/
    ports:
      - "8888:8888"

特別に言及すべき点はありません。先程作ったDockerfileと同じディレクトリに配置して、docker-compoose upを実行し、ターミナルに表示されたトークン付きURLからアクセスしましょう。

使い方を学ぶ

サンプルコードは、公式が用意しています。このリポジトリを参照すると良いでしょう。/pipelines/hello-worldにpipeline Editorを用いたチュートリアルが存在します。

終わりに

Elyraを使ったpipeline管理について一通り説明をしました。これらを使って良きデータサイエンスライフを送ることができれば幸いです。

Discussion