Jupyterlabのsingularityコンテナを作る

モチベーション

以前の この記事で、dockerコンテナからsingularityコンテナを作成し、jupyterlabをsingularityコンテナで動かす記事を書いた。

今回、singularityへの理解を深めるため、definitionファイルからsingularityコンテナを作成した。この記事は、その際の情報をまとめたもの。

定義ファイルの構成

作成するコンテナは、次のような構成を考えた。(以下に示した参考ページのdockerfileを元に考えた)

  1. ベースはubuntu20.04+CUDA11.4のコンテナ
  2. そこにpytochをインストール
  3. jupyterlabからも使う可能性のあるLinuxコマンド、unzip, wgetをインストール
  4. python関連のライブラリをpipでインストール
  5. jupyterlabを起動

参考ページ

definitionファイルを作るために、次の記事のdockerファイルを参考にした。感謝。

  • 定義ファイルの構成の1.の部分をこの記事のdockerファイルを参考にした
  • 定義ファイルの構成の2.から5.の部分は、この記事のdockerファイルを参考にした

上記のdockerfileを理解するために、次のページを参考にした。

definitionファイルを書くために本家sylabs.ioの次のドキュメントページ

dockerファイルからコンテナ作成

先ずは手始めとして、上記定義ファイルの構成に従ったdockerファイルを作成し、そこからdockerコンテナを作成し、更にsingularityコンテナ(sifファイル)を作成し、動作を確認した。

dockerfile:

# pytorchが使える、jupyterlabを作成する。

FROM nvidia/cuda:11.0-devel-ubuntu20.04

RUN apt-get update
RUN apt-get install -y python3 python3-pip
RUN pip3 install torch torchvision

RUN apt-get update && apt-get install -y \
    curl \
    git \
    tree \
    vim \
# The following packages are added.
	wget \
	unzip

# RUN pip install --upgrade pip
RUN pip3 install --upgrade pip setuptools
RUN pip3 install jupyterlab
RUN pip3 install matplotlib
RUN pip3 install pandas
RUN pip3 install scikit-learn
RUN pip3 install seaborn
RUN pip3 install sympy
RUN pip3 install pydotplus

RUN jupyter serverextension enable --py jupyterlab

# 作業ディレクトリを指定
WORKDIR /workdir

# コンテナ側のポート番号
EXPOSE 8888

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

# Jupyterlabのルートとなるディレクトリを指定
CMD ["--notebook-dir=/workdir"]

dockerfileのあるディレクトリでdockerコンテナを作成。

$ sudo docker build -t pytorch-lab ./

dockerコンテナを起動

$ sudo docker run -d --rm --gpus all -v /mnt/nfs/jupyterlab:/workdir -p 8888:8888 --name pt-lab pytorch-lab

正常に動いていることを確認した。この時に作成したnotebookのowerはrootになっていることに注意。既に作成しているものを更新すると、後でower/groupを修正する必要あり。

singularityコンテナを作成

$ sudo singularity build pytorch-lab.sif docker-daemon://pytorch-lab:latest

作成したsifファイルを指定してsingularityコンテナを起動。自分の環境では、${COMMON_AREA}/jupyterlab配下に、jupyter notebook(.ipynbファイル)を格納している。

$ singularity run --nv --bind ${COMMON_AREA}/jupyterlab:/workdir pytorch-lab.sif

definitionファイル

ずいぶんと前置きが長くなったが、ここからがこの記事のテーマであるdefファイルからコンテナ作成。

前節のdockerfileを元にして、作成したdefinition file(pytor-ch-lab.def)が次の通り。

# pytorchベースのjupyterlabが動く、singularityコンテナを作成する。

Bootstrap:	docker
FROM:	nvidia/cuda:11.0-devel-ubuntu20.04

%post
	apt update -y && apt -y install python3 python3-pip
	pip3 install torch torchvision
	apt update -y && apt -y install ¥
		curl git tree unzip vim wget

	pip3 install --upgrade pip setuptools
	pip3 install jupyterlab
	pip3 install matplotlib
	pip3 install pandas
	pip3 install scikit-learn
	pip3 install seaborn
	pip3 install sympy
	pip3 install pydotplus

#	jupyter serverextension enable --py jupyterlab

%runscript
	jupyter-lab --ip=0.0.0.0 --port=8888 --no-browser --NotebookApp.token='' --notebook-dir=/workdir

「jupyter serverextension enable –py jupyterlab」の行については、jupyter notebookのバージョンが5.3より低い場合の時に必要との記事を見た記憶があり、自分の環境のバージョンは、6.4.3だったので不要と判断し、コメントアウトした。

コンテナ作成手順

前節で作成したdefinition fileから次のようにして、コンテナ(sifファイル)を作成する。

$ sudo singularity build pytorch-lab.sif pytorch-lab.def

コンテナ起動

作成したコンテナ(sifファイル)を次のように起動した。

$ export SINGULARITYENV_CUDA_VISIBLE_DEVICES=0
$ singularity run --nv --bind ${COMMON_AREA}/jupyterlab:/workdir ${COMMON_AREA}/sifs/pytorch-lab.sif

先にも説明した通り、自分の環境においては、jupyter notebookを${COMMON_AREA}/jupyterlabに格納しており、同様にsifファイルを${COMMON_AREA}/sifs配下に格納している。

ブラウザ側での確認

Chromeで、「http://localhost:8888」と入力すると、jupyterlabが立ち上がる。ここで、セルに以下を入力して実行する。

import torch

print(torch.__version__)
torch.cuda.get_device_name(0)

すると、以下の通りのメッセージ。WSのGTX TITANは、もはやサポートしていないようだ。

1.9.0+cu102
/usr/local/lib/python3.8/dist-packages/torch/cuda/__init__.py:83: UserWarning: 
    Found GPU%d %s which is of cuda capability %d.%d.
    PyTorch no longer supports this GPU because it is too old.
    The minimum cuda capability supported by this library is %d.%d.
    
  warnings.warn(old_gpu_warn.format(d, name, major, minor, min_arch // 10, min_arch % 10))
'GeForce GTX TITAN'

最初の行の「1.9.0+cu102」は、pytorchのバージョン。print(torch.__version__)の結果と同じ。

GTX TITANのcompute capabilityは、このページでチェックすると3.5。上記メッセージは、pythorch(torch)が出しているので、組み込んだpytorchのバイナリがcompute capability 3.5をサポートしていないと理解。 ソースからpytorchをビルトすれば、良いのか? もう少し調べてみる必要あり。

もう一台のWorkStationは、GTX 1080(compute capability 6.1)なので、そっちではワーニングは出ないのかな? 早速確かめたら、エラーなく次の通り。

1.9.0+cu102
'GeForce GTX 1080'

最後に

次は、NVIDIA HPC SDKのsingularityコンテナを作成しようと考えている。 このWorkStationのGPUが上記の通り古い(2013年発売)ので、適切なバージョンを調べておく必要が先ずありそうだ。 Titan Vとか欲しいけど、ヤフオクでたまに見るけど落札価格は20万円越えで、ちょっと手が出ない。


も参照してください