使い捨てJupyterLabをDockerで起動する
ちょっとしたLLM関連のプロジェクト試したりするにあたり、Google Colaboratoryを便利に使っているのだが、最近Python-3.11以上を要求するプロジェクトにチラホラ出会うことが多くなった。
Google Colaboratoryのすべての環境がそうかどうかはわからないのだが、自分の見た感じだと、Python-3.10になっていて、プロジェクトによっては試せないものもある。
そういう場合にはローカルで試すのだが、大体こんな感じ。
$ mkdir sample_dir && cd sample_dir
$ mise use python@3.12
$ cat << 'EOS' >> .mise.toml
[env]
_.python.venv = { path = ".venv", create = true }
EOS
$ mise trust
$ pip install jupyterlab ipywidgets
$ jupyter-lab --ip="0.0.0.0" --NotebookApp.token=""
端的に言って面倒。スクリプト書いたりってのもできればやりたくない。
で、そもそもJupyterLab動かしたいだけなので、オフィシャルのDockerイメージがあったりするのでは?ということに気づいた。というか全く今まで思いつかなかった自分がアホなんだけども。
ので、ちょっと試してみる。
JupyterのオフィシャルなDockerイメージについてはここにまとまっている。
ざっと見た感じ、
- Dockerイメージのホスティングはquay.ioでやっている。DocekrHubにも古いイメージはあるが、メンテされていない。
- 用途に応じて複数のイメージが用意されている
-
jupyter/docker-stacks-foundation
- 基礎的なイメージ
- パッケージマネージャー(conda, mamba)や共通のシステムライブラリを含むが、JupyterLabやNotebookなどのアプリケーションは含まれていない。
-
jupyter/base-notebook
- jupyter/docker-stacks-foundationがベース
- JupyterLabやNotebook、JupyterHubを含む、最小限のサーバ機能。
-
jupyter/minimal-notebook
- jupyter/base-notebookがベース
- 基本的なコマンドラインツールやTeX Liveなど、Jupyterでの作業に役立つツールが追加。
-
jupyter/r-notebook
- jupyter/minimal-notebookがベース
- R言語のサポートを含むスタック。Rのパッケージも含まれている。
-
jupyter/julia-notebook
- jupyter/minimal-notebookがベース
- Julia言語のサポートを含むスタック。Pluto.jlインターフェースも利用可能。
-
jupyter/scipy-notebook
- jupyter/minimal-notebookがベース
- Pythonの科学技術計算向けライブラリが含まれている。
-
jupyter/tensorflow-notebook
- jupyter/scipy-notebookがベース
- TensorFlowを含むディープラーニング用スタック
-
jupyter/pytorch-notebook
- jupyter/scipy-notebookがベース
- PyTorchを含むディープラーニング用スタック
-
jupyter/datascience-notebook
- jupyter/scipy-notebookがベース
- Python、R、Juliaのデータ分析ライブラリが含まれている。
-
jupyter/pyspark-notebook
- jupyter/scipy-notebookがベース
- Apache SparkのPythonサポートが含まれている。
-
jupyter/pyspark-notebook
- jupyter/scipy-notebookがベース
- Apache SparkのPythonおよびRサポートが含まれている。
-
jupyter/docker-stacks-foundation
- CUDA対応イメージもある
- コミュニティが提供しているスタック、GPU対応に特化したスタックもある
詳細はドキュメント参照
で、とりあえず普通に使う分には、自分はminimal
でとりあえず良いかなと判断した。
こんな感じで起動。--rm
で使い捨てにしてる。
$ docker run -p 8888:8888 --rm quay.io/jupyter/minimal-notebook:latest
起動時のメッセージが以下のような感じで出力されるので、http://127.0.0.1:8888/lab?token=XXXXX
のURLをブラウザで開く。
[I 2024-10-28 11:48:59.138 ServerApp] Jupyter Server 2.14.2 is running at:
[I 2024-10-28 11:48:59.138 ServerApp] http://ac99cb095bd7:8888/lab?token=a4247371f4c86e1b45cc335c8237d598f56c87bced7da236
[I 2024-10-28 11:48:59.138 ServerApp] http://127.0.0.1:8888/lab?token=a4247371f4c86e1b45cc335c8237d598f56c87bced7da236
[I 2024-10-28 11:48:59.138 ServerApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 2024-10-28 11:48:59.139 ServerApp]
To access the server, open this file in a browser:
file:///home/jovyan/.local/share/jupyter/runtime/jpserver-7-open.html
Or copy and paste one of these URLs:
http://ac99cb095bd7:8888/lab?token=a4247371f4c86e1b45cc335c8237d598f56c87bced7da236
http://127.0.0.1:8888/lab?token=a4247371f4c86e1b45cc335c8237d598f56c87bced7da236
http://127.0.0.1:8888/lab?token=a4247371f4c86e1b45cc335c8237d598f56c87bced7da236
コンテナを止めれば環境は削除される。
ホスト側のファイルを共有したい場合
Macの場合はコンテナ内のユーザがなんであれ、コンテナ外へのアクセスはホスト側のユーザ権限になるらしいので、これでOK。
$ docker run --rm \
-p 8888:8888 \
-v .:/home/jovyan/work \
quay.io/jupyter/minimal-notebook:latest
Linuxの場合は以下が参考になる
.envも面倒なのでgetpassにした。こんな感じ。
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass('OPENAI_API_KEY')
Linuxの場合でも同じでいける、ように一見見える。
$ docker run --rm \
-p 8888:8888 \
-v .:/home/jovyan/work \
quay.io/jupyter/minimal-notebook:latest
ただし、Jupyter上からファイルを書き込むと微妙にパーミッションが異なる。 以下はホスト側で確認。
$ ls -lt
合計 12
-rw-r--r-- 1 kun432 users 20 10月 31 16:47 bbb # Jupyter上で作成したファイル
-rw-r--r-- 1 kun432 users 72 10月 31 16:47 Untitled.ipynb # Jupyter上で作成した作成したファイル
-rw-rw-r-- 1 kun432 kun432 18 10月 31 16:47 aaa # ホスト側で元々作成してたファイル
自分のUID/GIDはこうなっている。
$ id
uid=1000(kun432) gid=1000(kun432) groups=1000(kun432)
Jupyterのコンテナは
- ユーザ:
jovyan
(uid=1000) - グループ:
users
(gid=1000)
なのでそれが置き換えられているだけ。
実行ユーザと同じにするにはこう。
$ docker run --rm \
-p 8888:8888 \
-u root \
-e NB_UID=$(id -u) \
-e NB_GID=$(id -g) \
-v .:/home/jovyan/work \
quay.io/jupyter/minimal-notebook:latest
これで再度Jupyter上でファイルを作成し直してみるとこうなった。想定通り。
$ ls -lt
合計 12
-rw-rw-r-- 1 kun432 kun432 18 10月 31 16:57 bbb # Jupyter上で作成したファイル
-rw-rw-r-- 1 kun432 kun432 22 10月 31 16:57 aaa # ホスト側で元々作成してたファイル
-rw-rw-r-- 1 kun432 kun432 72 10月 31 16:57 Untitled.ipynb # Jupyter上で作成した作成したファイル
Linux&GPUを使う場合。CUDAやPythonバージョンは自分の環境にあわせて適宜。
$ docker run --rm \
--gpus all \
-p 8888:8888 \
-u root \
-e NB_UID=$(id -u) \
-e NB_GID=$(id -g) \
-v .:/home/jovyan/work \
quay.io/jupyter/pytorch-notebook:cuda12-python-3.11
Linux&GPUならこちらのほうが良さそう
Jupyterだとsudoが必要な場合のパスワード入力とかができないっぽいので、以下のようにしてパスワードなしsudoを有効にしておいたほうがいいかも。
docker run --rm \
-p 8888:8888 \
-u root \
-e GRANT_SUDO=yes \
-v .:/home/jovyan/work \
quay.io/jupyter/minimal-notebook:latest