JupyterLab と Docker を使用して AI/ML 開発を強化

JupyterLab は、計算ノートブック ドキュメントの概念に基づいて構築されたオープンソース アプリケーションです。 コードの共有と実行、データ処理、視覚化を可能にし、グラフを作成するためのさまざまなインタラクティブ機能を提供します。 

最新バージョンの JupyterLab 4.0は6月初旬にリリースされました。 前任者と比較して、このバージョンは、より高速なWeb UI、改善されたエディターパフォーマンス、新しい 拡張機能Manager、およびリアルタイムのコラボレーションを備えています。

スタンドアロンの 3.x バージョンを既にインストールしている場合、新機能を評価するには現在の環境を書き直す必要があり、手間がかかり、リスクが伴う可能性があります。 ただし、Docker Desktop などの Docker が動作する環境では、インストールされている JupyterLab 環境に影響を与えることなく、コンテナー内で分離された JupyterLab 4.0 を開始できます。 もちろん、既存の環境に影響を与えずにこれらを実行し、別のポートでアクセスすることもできます。 

この記事では、ホストPC側に影響を与えることなく、Docker Desktop 上の Jupyter Docker スタックを使用して JupyterLab 4.0 の新機能をすばやく評価する方法について説明します。

水色の背景に濃い青の線で表示される Docker と jupyter のロゴ

なぜJupyterLabをコンテナ化するのですか?

ユーザーは、JupyterLab Notebook Stack Docker Official Image のベースイメージを Docker Hub から 1,000 万回以上ダウンロードしています。 この大幅なダウンロード率を推進しているのは何ですか? JupyterLab の開発者がプロジェクトに合わせたツール、アプリケーション スタック、デプロイ環境を選択してイノベーションを実現できるようにしながら、開発ワークフローを合理化するための Docker コンテナーに対する需要はますます高まっています。 JupyterLab ノートブックスタックの公式イメージは、AMD64 と Arm64/v8 の両方のプラットフォームもサポートしています。

JupyterLab 環境をコンテナー化すると、次のような多くの利点があります。

  • コンテナー化により、JupyterLab 環境が異なるデプロイ間で一貫性を保てるようになります。 JupyterLab をローカル コンピューター、開発環境、または運用クラスターのいずれで実行している場合でも、同じコンテナー イメージを使用することで一貫したセットアップが保証されます。 このアプローチにより、互換性の問題が解消され、ノートブックが異なる環境で同じように動作できるようになります。
  • JupyterLab をコンテナーにパッケージ化すると、オペレーティング システムやセットアップに関係なく、ノートブック環境を他のユーザーと簡単に共有できます。 これにより、依存関係を手動でインストールして環境を構成する必要がなくなり、再現可能な研究やワークフローのコラボレーションと共有が容易になります。 そして、これは再現性が重要なAI/MLプロジェクトで特に役立ちます。
  • コンテナーによってスケーラビリティが実現し、ワークロード要件に基づいて JupyterLab 環境をスケーリングできます。 JupyterLab インスタンスを実行している複数のコンテナーを簡単に起動し、ワークロードを分散し、Kubernetes などのコンテナー オーケストレーション プラットフォームを利用して効率的なリソース管理を行うことができます。 これは、リソースを大量に消費するタスクが一般的であるAI / ML開発においてますます重要になっています。

はじめ

コンピューターでJupyterLabを使用するには、JupyterLabデスクトップアプリケーションを使用するのが1つのオプションです。 これはElectronに基づいているため、Windows、macOS、およびLinuxのGUIで動作します。 実際、JupyterLabデスクトップを使用すると、インストールプロセスが非常に簡単になります。 ただし、Windows 環境では、Python 言語を個別に設定する必要もあり、機能を拡張するには、pip を使用してパッケージを設定する必要があります。

このようなデスクトップソリューションは、ゼロから構築するよりも簡単かもしれませんが、DockerデスクトップとDockerスタックの組み合わせの方が依然として簡単なオプションだと思います。 JupyterLab デスクトップでは、複数のバージョンを混在させたり、評価後に簡単に削除したりすることはできません。 とりわけ、Windows、macOS、およびLinux全体で一貫したユーザーエクスペリエンスを提供しません。

Windows コマンド プロンプトで、次のコマンドを実行して基本的なノートブックを起動します。 

docker container run -it --rm -p 10000:8888 jupyter/base-notebook

このコマンドは、 jupyter/base-notebook Docker イメージを利用し、ホストのポートをコンテナーのポート 10000 8888にマップし、コマンド入力と擬似端末を有効にします。さらに、プロセスが完了したらコンテナを削除するオプションが追加されています。

Dockerイメージのダウンロードを待った後、アクセスとトークンの情報がコマンドプロンプトに次のように表示されます。 ここで、URL を書き換えてから、この URL http://127.0.0.1:8888 http://127.0.0.1:10000 の末尾にトークンを追加します。 この例では、出力は次のようになります。

このトークンは私の環境に固有であるため、コピーしても機能しないことに注意してください。 コマンドプロンプトに実際に表示されているものに置き換える必要があります。

その後、しばらく待った後、JupyterLabが起動します(図1)。 ここから、ノートブックを起動したり、Python のコンソール環境にアクセスしたり、他の作業環境を利用したりできます。

ファイルリスト、ノートブック、Pythonコンソール、およびその他の起動オプションを示すjupyterlabページのスクリーンショット。
図 1. JupyterLab トークンを入力した後のページ。 左側はファイルリスト、右側はノートブックの作成、Pythonコンソールなどを開くことができます。

ホスト側のポート 10000 は、コンテナー内のポート 8888 にマップされます (図 2 参照)。

コンテナー ポート 8888 にマップされたホスト ポート 10000 を示すスクリーンショット。
図 2. ホスト ポート 10000 は、コンテナー内のポート 8888 にマップされます。

図 3 に示すように、画面の [パスワード またはトークンの入力] フォームで、コマンド ラインまたはコンテナー ログに表示されるトークン (次の token=文字列) を入力し、 [ ログイン] を選択します。

トークン認証のセットアップを示すスクリーンショット。
図 3.コンテナー ログに表示されるトークンを入力します。

ちなみにこの環境では、コンテナを停止するとデータが消去されます。 コンテナを停止した後もデータを再利用したい場合は、Dockerコンテナ起動時にオプション -v を追加してボリュームを作成します。

このコンテナー環境を停止するには、コマンド プロンプトをクリックし CTRL-C 、Jupyter サーバーのプロンプト Shutdown this Jupyter server (y/[n])? y に応答して Enter キーを押します。Docker デスクトップを使用している場合は、コンテナーからターゲット コンテナーを停止します。

Shutdown this Jupyter server (y/[n])? y
[C 2023-06-26 01:39:52.997 ServerApp] Shutdown confirmed
[I 2023-06-26 01:39:52.998 ServerApp] Shutting down 5 extensions
[I 2023-06-26 01:39:52.998 ServerApp] Shutting down 1 kernel
[I 2023-06-26 01:39:52.998 ServerApp] Kernel shutdown: 653f7c27-03ff-4604-a06c-2cb4630c098d

表示が以下のように変わると、コンテナは終了し、データは削除されます。

コンテナーの実行中は、コンテナー内のディレクトリにデータが保存されます /home/jovyan/work/ 。 これをボリュームとしてバインドマウントするか、コンテナの起動時にボリュームとして割り当てることができます。 これにより、コンテナーを停止しても、コンテナーを再起動するときに同じデータを再び使用できます。

docker container run -it -p 10000:8888 \
    -v “%cd%”:/home/jovyan/work \
    jupyter/base-notebook

手記: この記号は \ 、コマンド ラインがコマンド プロンプトで続行されることを示します。 記号を使用せずに \ コマンドを 1 行で記述することもできます。 ただし、Windowsコマンドプロンプトの場合は、代わりに記号を使用する必要があります ^

この設定では、JupyterLab コンテナーを起動すると、コマンドが実行されたフォルダーにディレクトリが /work/ docker container run マウントされます。コンテナーが停止してもデータは保持されるため、コンテナーを再度起動したときに Notebook データをそのまま使用できます。

有名なアヤメの花データセットを使用したプロット

次の例では、合計 150 件のレコードで構成されるアヤメの花データセットを使用し、3 種類のアヤメの花 (アイ リスセトサ 、 アイリスバージニア 、 アヤメ バーシカラー) のそれぞれから 50 個のサンプルを使用します。各レコードは、4 つの数値属性 (がく片の長さ、がく片の幅、花びらの長さ、花びらの幅) と 1 つのカテゴリ属性 (虹彩のタイプ) で構成されます。 このデータは Python ライブラリ scikit-learn に含まれており、このデータをプロットするために matplotlib を使用します。

scikit-learnページ(コードはページの下部にあり、コピーして貼り付けることができます)からiPythonにサンプルコードを入力しようとすると、次のエラーが発生します(図4)。

エラーメッセージ「matplotlibという名前のモジュールがありません」を示すスクリーンショット。
図 4."matplotlib" モジュールがないためにエラー メッセージが表示されました。

これは "matplotlib" モジュールが存在しないことを示す iPython 上のエラーメッセージです。 さらに、"scikit-learn" モジュールも必要です。

これらのエラーを回避してプロットを有効にするには、次のコマンドを実行します。 ここで、 !pip はiPython環境内でコマンドを実行することを意味します pip

!pip install matplotlib scikit-learn

先ほどのサンプル コードを iPython の次のセルに貼り付けて実行することで、図 5 に示すように Iris データセットをプロットして表示できます。

データセットの2つの生成されたプロットを示すスクリーンショット。
図 5. サンプルコードが正常に実行されると、2つの画像が出力されます。

コマンドを使用して !pip 毎回モジュールを追加するのは面倒な場合があることに注意してください。 幸い、次の方法でモジュールを追加することもできます。

  • 専用のドッカーファイルを作成する
  • Jupyter Docker スタックと呼ばれる既存のイメージのグループを使用する

ドッカーイメージの構築

Dockerfile とイメージの構築に慣れている場合は、この 5 つの手順の方法は簡単です。 また、このアプローチは、Docker イメージのサイズを抑えるのに役立ちます。 

ステップ1.ディレクトリの作成

Docker イメージをビルドするための最初の手順は、Dockerfile とコンテキストを配置するディレクトリを作成して移動することです。

mkdir myjupyter && cd myjupyter

ステップ2.要件.txtファイルの作成

requirements.txt ファイルを作成し、次のコマンドで pip 追加するPythonモジュールを一覧表示します。

matplotlib
scikit-learn

ステップ3.ドッカーファイルの作成

FROM jupyter/base-notebook
COPY ./requirements.txt /home/jovyan/work
RUN python -m pip install --no-cache -r requirements.txt

この Dockerfile は、基本イメージ jupyter/base-notebookを指定し、ローカル ディレクトリ /home/jovyan/work directory からコンテナー内にファイルをコピー requirements.txtpip install 、コマンドを実行して、ファイルにリストされている requirements.txt Python パッケージをインストールします。

ステップ4.ドッカーイメージの構築

docker image build -t myjupyter

ステップ5.コンテナの起動

docker container run -it -p 10000:8888 \
    -v “%cd%”:/home/jovyan/work \
    myjupyter

このコマンドの各部分の動作は次のとおりです。

  • このコマンドは docker run 、コンテナーを実行するように Docker に指示します。
  • このオプションは -it  、対話型端末をコンテナーにアタッチします。
  • ホスト -p 10000:8888 マシンのポート 10000 をコンテナー内のポート 8888 にマップします。 これにより、コンテナーで実行されている Jupyter ノートブックに Web ブラウザー経由で http://localhost:10000 アクセスできます。
  • -v "%cd%":/home/jovyan/work 、ホスト・マシン上の現在のディレクトリー (%cd%) をコンテナー内のディレクトリーに /home/jovyan/work マウントします。 これにより、ホストと Jupyter ノートブックの間でファイルを共有できます。

この例では、 myjupyter 実行する Docker イメージの名前です。 システムで適切なイメージが使用可能であることを確認してください。 起動後の動作は以前と同じです。 必要なライブラリは最初から含まれているため、コマンドで !pip ライブラリを追加する必要はありません。

Jupyter Docker Stacks のイメージの使用方法

JupyterLab 環境を実行するために、 Jupyter Docker Stacks から呼び出され jupyter/scipy-notebook た Docker イメージを利用します。実行中のノートブックは終了しますのでご注意ください。 コマンドプロンプトで入力 Ctrl-C した後、実行中のコンテナを入力して y 指定します。

次に、次のように入力して新しいコンテナーを実行します。

docker container run -it -p 10000:8888 \
    -v “%cd%”:/home/jovyan/work \
    jupyter/scipy-notebook

このコマンドは、追加の科学ライブラリを備えた Jupyter Notebook 環境を提供するイメージを使用して jupyter/scipy-notebook コンテナーを実行します。 

コマンドの内訳は次のとおりです。

  • このコマンドは docker run 、新しいコンテナーを開始します。
  • このオプションは -it 、対話型端末をコンテナーにアタッチします。
  • ホスト -p 10000:8888 マシンのポート 10000 をコンテナー内のポート 8888 にマップし、 http://localhost:10000 で Jupyter Notebook にアクセスできるようにします。
  • -v "$(pwd)":/home/jovyan/work 、ホスト・マシン上の現在のディレクトリー ($(pwd)) をコンテナー内のディレクトリーに /home/jovyan/work マウントします。 これにより、ホストと Jupyter ノートブックの間でファイルを共有できます。
  • jupyter/scipy-notebook 、コンテナーに使用される Docker イメージの名前です。 システムでこのイメージが使用可能であることを確認してください。

前の JupyterLab イメージは、最小限のノートブック環境でした。 今回使用しているイメージには、numpyやpandasなど科学分野で使われているパッケージが多数含まれているため、Dockerイメージのダウンロードに時間がかかる場合があります。 これは画像サイズが4GBに近いです。

コンテナーが実行されると、以前のように pip を実行しなくても、Iris データセットのサンプルをすぐに実行できるようになります。 試してみてください。

一部の画像には、TensorFlow のディープラーニングライブラリ、R 言語用のもの、Julia プログラミング言語、Apache Spark などがあります。 詳細は画像一覧ページをご覧ください。

Windows 環境では、 Docker Desktop を使用して新しいバージョンの JupyterLab 4.0 を簡単に実行および評価できます。 そうすることで、既存の Python 言語環境に影響を与えたり、競合したりすることはありません。 さらに、この設定は、macOSやLinuxなどの他のプラットフォーム間で一貫したユーザーエクスペリエンスを提供するため、試してみたい人にとって理想的なソリューションです。

結論

JupyterLab を Docker でコンテナー化することで、AI/ML 開発者は、一貫性、簡単な共有とコラボレーション、スケーラビリティなど、多くの利点を得ることができます。 これにより、AI/ML 開発ワークフローを効率的に管理できるようになり、さまざまな環境での実験、コラボレーション、結果の再現が容易になります。 JupyterLab 4.0 と Docker を使用すると、AI/ML 開発をスーパーチャージする可能性は無限になります。 では、なぜ待つのですか? コンテナ化を受け入れ、AI/ML プロジェクトで JupyterLab の真のパワーを体験してください。

参照

さらに詳しく