Closed8

使い捨てJupyterLabをDockerで起動する

kun432kun432

ちょっとした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イメージがあったりするのでは?ということに気づいた。というか全く今まで思いつかなかった自分がアホなんだけども。

ので、ちょっと試してみる。

kun432kun432

JupyterのオフィシャルなDockerイメージについてはここにまとまっている。

https://jupyter-docker-stacks.readthedocs.io/en/latest/

ざっと見た感じ、

  • 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サポートが含まれている。
  • 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

コンテナを止めれば環境は削除される。

kun432kun432

ホスト側のファイルを共有したい場合

Macの場合はコンテナ内のユーザがなんであれ、コンテナ外へのアクセスはホスト側のユーザ権限になるらしいので、これでOK。

$ docker run --rm \
    -p 8888:8888 \
    -v .:/home/jovyan/work \
    quay.io/jupyter/minimal-notebook:latest

Linuxの場合は以下が参考になる

https://zenn.dev/wsuzume/articles/fe8c186a03b4e4#fnref-12ec-1

kun432kun432

.envも面倒なのでgetpassにした。こんな感じ。

import getpass
import os

os.environ["OPENAI_API_KEY"] = getpass.getpass('OPENAI_API_KEY')

kun432kun432

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 1031 16:47 bbb             # Jupyter上で作成したファイル
-rw-r--r-- 1 kun432 users  72 1031 16:47 Untitled.ipynb  # Jupyter上で作成した作成したファイル
-rw-rw-r-- 1 kun432 kun432 18 1031 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 1031 16:57 bbb             # Jupyter上で作成したファイル
-rw-rw-r-- 1 kun432 kun432 22 1031 16:57 aaa             # ホスト側で元々作成してたファイル
-rw-rw-r-- 1 kun432 kun432 72 1031 16:57 Untitled.ipynb  # Jupyter上で作成した作成したファイル
kun432kun432

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

kun432kun432

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
このスクラップは24日前にクローズされました