モチベーション
以前の この記事で、dockerコンテナからsingularityコンテナを作成し、jupyterlabをsingularityコンテナで動かす記事を書いた。
今回、singularityへの理解を深めるため、definitionファイルからsingularityコンテナを作成した。この記事は、その際の情報をまとめたもの。
定義ファイルの構成
作成するコンテナは、次のような構成を考えた。(以下に示した参考ページのdockerfileを元に考えた)
- ベースはubuntu20.04+CUDA11.4のコンテナ
- そこにpytochをインストール
- jupyterlabからも使う可能性のあるLinuxコマンド、unzip, wgetをインストール
- python関連のライブラリをpipでインストール
- jupyterlabを起動
参考ページ
definitionファイルを作るために、次の記事のdockerファイルを参考にした。感謝。
上記のdockerfileを理解するために、次のページを参考にした。
- Dockerfileの全般的な理解のためのDockerfileのベストプラクティス
- ENTRYPOINT,CMDを理解するため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万円越えで、ちょっと手が出ない。