pythonバージョンが3.11のJupyterLabコンテナを作成

モチベーション

graph RAGを試していて、「TypeError: ‘NoneType’ object is not iterable」とのエラーが発生した。色々と調べたが、直接の原因が分からず、どうしてもエラーを回避することができなかった。その時に使用していたコンテナのpythonのバージョンは3.10.12であった。参考にしていた記事のpythonのバージョンは3.11.0となっていたので、試しにコンテナのpythonのバージョンを3.11にアップデートすることにした。

この投稿では、pythonバージョンが3.11のJupyterLabコンテナを作成した内容をまとめたものである。

情報源と経緯

  1. Ubuntu 22.04: python3-pipでインストールしたpipをpython3.12 -m pipで実行すると、No module named 'distutils'というエラーが発生する - 記事タイトルの通り、python 3.12に更新することが主題の記事ではあるが、python 3.11を組み込んだdockerコンテナを作成するDockerfileを参考にした。
  2. ubuntu22.04を24.04に変更したら、pipのインストールで"externally-managed-environment"というエラーが発生した - 上記の記事と同じ方の記事。実は、自分は最初、ubuntu22.04ベースのnvidia/cudaコンテナをubuntu24.04ベースにすれば、pythonのバージョンも上がると考え、それまで使っていたDockerfile中で対応する部分のみを修正して、buildしようとしたら、「error: externally-managed-environment」が発生し、この記事を見つけた。ざっと目を通すと、ハードルが高そうに感じ、ubuntu22.04のままで、pythonのバージョンアップできる方法として、上記記事のDockerfileを参考にさせてもらった。
  3. How to stop this message: “Would you like to receive official Jupyter news?" - JupyterLabの右下に表示されるポップアップ表示を停止する方法が載っている。

Dockerfile

Dockerfileは次の通り、前半部分は、情報源1.のDockerfileを参考にし、後半のpythonパッケージのインストール部分は、この投稿のDockerfileのままである。

 Dockerfile for creating a JupyterLab container
# containing python version 3.11

FROM nvidia/cuda:12.1.1-cudnn8-devel-ubuntu22.04

# Set bash as the default shell
ENV SHELL=/bin/bash

# Install prerequisites
RUN set -x \
        && export DEBIAN_FRONTEND=noninteractive \
        && apt-get update \
        && apt-get install -y --no-install-recommends \
        gnupg2 \
        software-properties-common \
        language-pack-ja \
        tzdata \
        curl \
        lsb-release \
        && apt-get -y clean \
        && rm -rf /var/lib/apt/lists/*

# Set locale & timezone
RUN update-locale LANG=ja_JP.UTF-8 LANGUAGE=ja_JP:ja \
    && ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
    && echo "Asia/Tokyo" > /etc/timezone

ENV LANG=ja_JP.UTF-8
ENV LC_ALL=ja_JP.UTF-8
ENV LC_CTYPE=ja_JP.UTF-8

# Install packages
RUN set -x \
    # add deadsnakes PPA to install Python 3.11
    && add-apt-repository ppa:deadsnakes/ppa \
    && apt-get update \
    && apt-get install -y --no-install-recommends \
        python3.11-dev \
        python3-pip \
        # common tools
        bash-completion \
        build-essential \
        git \
        iputils-ping \
        jq \
        less \
        net-tools \
        openssh-client \
        sudo \
        tar \
        time \
        unzip \
        vim \
        wget \
        xz-utils \
        zip \
    && apt-get -y clean \
    && rm -rf /var/lib/apt/lists/*

# Python / pip
RUN ln -s $(which python3.11) /usr/bin/python

# Python / pip
RUN ln -s $(which python3.11) /usr/bin/python

# Install python packages used so far
RUN pip install --upgrade pip setuptools \
        && pip install torch torchvision torchaudio \
         --index-url https://download.pytorch.org/whl/cu121 \
        && pip install jupyterlab matplotlib pandas scikit-learn ipywidgets \
        && pip install transformers accelerate sentencepiece einops \
        && pip install auto-gptq optimum \
        && pip install langchain bitsandbytes protobuf \
        && pip install langchain-community langchain_openai wikipedia \
        && pip install langchain-huggingface unstructured html2text rank-bm25 janome \
        && pip install langchain-chroma sudachipy sudachidict_full \
        && pip install langchain-experimental neo4j \
        && pip install json-repair langchain-mistralai \
        && pip install mysql-connector-python \
        && pip install ragas datasets neo4j-graphrag \
        && pip install pypdf tiktoken sentence_transformers faiss-gpu trafilatura \
        && pip install ollama langchain-ollama

# Stop message on jupyterlab
RUN jupyter labextension disable "@jupyterlab/apputils-extension:announcements"

# Create a working directory
WORKDIR /workdir

# Port number in container side
EXPOSE 8888

ENTRYPOINT ["jupyter-lab", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root", "--NotebookApp.token=''"]

CMD ["--notebook-dir=/workdir"]

「# Stop message on jupyterlab」の部分は、JupyterLab動作中に、右下に以下のポップアップが出現するのが鬱陶しかったので、それを非表示にするためのもの。 情報源3.を参照のこと。

Would you like to receive official Jupyter news?

まとめ

今回、pythonをバージョンアップしようとして、ubuntu24.04の世界に少し触れたけど、pyhonのモジュール管理が更新され、これまで通り、気楽にpip/pip3 installとは出来なくなるようだ。その内ubuntu24.04に移行していくつもりだけど、もう少し情報を溜めてからにしようと思っている。