Dockerよりお手軽? Singularityを導入してみた
前置き
PyhonとTensoleflowで画像分類器を作っています。仕事と関連がなくはないですが、完全に趣味です。
ある日Tensoleflowが突然認識されなくなり(VScodeで「このライブラリは存在しません」といったメッセージが出る)、これを機にPythonの環境をPCからDocekrに移してみようと考えました。
しかし色々調べていくうちに、「Tensoleflowを使うならDocekrよりSingularityのほうが良い」というのを見かけ、「そこまで言うなら触ってみよう」と思って導入してみたので、その記録です。
Singularityとは?
Dockerと同じ環境構築システムです。
スパコンなどHPC (ハイパフォーマンス・コンピューティング)環境での利用を想定して設計されているため、大量のデータを高速で処理するのに向いています。
Dockerとの違い
Dockerと大きく異なる点は以下です。
- sudo(管理者)でなくてもOSを動かせる
- ホストOSのファイル・ディレクトリが自動的にマウント(コピー)される
このため、特に複数メンバーで開発する際はDockerより使いやすいとのこと。
試していないのですが、最近話題の画像生成AI、Stable Diffusionとも相性は良さそうです。
ちなみにSingularityとは「特異点」という意味になります。
Singularityの特徴
・DockerHUBからDockerイメージをそのまま利用できる
・nvidia-docker をインスト-ルせずにGPUが使用可能
・一つのファイルにコンテナのデータが集約される
・root権限なしでコンテナを実行可能
・ホストOSにあるファイルがそのままコピーされ、使用できる
仮想化環境の中でホストOSのファイルを扱う場合、dockerではわざわざマウント(コピー)作業をする必要がありますが、Singularityではビルド時にデフォルトでコピーされます。
導入方法
0.環境
- Windows10 Home
- VScode
1. ホスト(Linux等)環境のインストール
SingularityはWindowsに直接入れられない(Macも同様)ため、Linuxなどの別のOSが必要です。
OSは無料で手軽に手に入るLinux、Ubuntuにしました。
UbuntuをChocolaty経由で入れるのは失敗したので、Microsoft Storeから落としました。
起動し、ユーザー名、パスワードを決めます。
2. 必要なパッケージのインストール
基本は公式サイトに掲載されているコマンドで問題ありません。
$ sudo apt-get update && sudo apt-get install -y \
build-essential \
libssl-dev \
uuid-dev \
libgpgme11-dev \
squashfs-tools \
libseccomp-dev \
pkg-config
併せてGo言語も導入します。
$ export VERSION=1.11 OS=linux ARCH=amd64 && \
wget https://dl.google.com/go/go$VERSION.$OS-$ARCH.tar.gz && \
sudo tar -C /usr/local -xzvf go$VERSION.$OS-$ARCH.tar.gz && \
rm go$VERSION.$OS-$ARCH.tar.gz
Go言語のパス設定を行います。
echo 'export GOPATH=${HOME}/go' >> ~/.bashrc && \
echo 'export PATH=/usr/local/go/bin:${PATH}:${GOPATH}/bin' >> ~/.bashrc && \
source ~/.bashrc
3.Singularityの導入
Singularityをgithubからダウンロード、展開します。
wget https://github.com/sylabs/singularity/releases/download/v3.2.1/singularity-3.2.1.tar.gz
tar xvf singularity-3.2.1.tar.gz
cd singularity
./mconfig && make -C builddir && sudo make -C builddir install
ダウンロード、インストール後にコンパイル。
./mconfig && \
make -C ./builddir && \
sudo make -C ./builddir install
singularity help
で以下のような表示が出てくればOK
Linux container platform optimized for High Performance Computing (HPC) and
Enterprise Performance Computing (EPC)……
バージョン確認でもOK
singularity --version
2.5.2-dist
Singularityイメージビルド、起動
1.singularity buildで.sifファイルの作成
singularity build hello.sif docker://hello-world:latest
.sifファイルはsingularityのイメージファイルです。上記コマンドで(ファイル名).sifというファイルが作成されます。
そしてdocker://hello-world:latestで、dockerのhello-worldイメージファイルの最新版を落とし、dockerからSingularityのファイルに変換を行います。
この間はPCが少し重くなりました。
2.ターミナルを開き、cd singularityでフォルダ移動
Singularityをダウンロードした際に作ったフォルダへ移動します。
3.singularity run --nv (イメージファイル名).sifで実行
Singularityが起動します。
終了の際はexitコマンドでUbuntuへ戻れます。
VScodeでの動かし方
Remote機能を使えばVScodeでも動かせます。
1. 拡張機能でRemote-WSLを入れる
似ている拡張機能もあるので注意。(他の拡張機能を入れてもDockerなどで使えます)
2. 左のメニューから「リモートエクスプローラー」を選択、「WSL」からUbuntuで起動したい環境を選ぶ
問題無ければUbuntuが起動し、Ubuntuの中のファイルが表示されます。赤枠の箇所に「WSL:Ubuntu」と書いてあれば起動に成功しています。
OS内のフォルダも見れるし、ドラックアンドドロップでファイルやフォルダをホストからコピーできます。便利。
3. ターミナルでSingularityを実行
9/12時点の課題(自分の)
・Ubuntu起動→フォルダ移動→Singularityを起動するという流れが若干面倒です。一気に起動したい。
方法がないわけではなさそうですが、うまくいきません。
- Linux上のsingularityコンテナにWindowsのvscodeから接続する
https://qiita.com/k_tk/items/f746acc8267364d18e48
・GPUのデータを見るコマンドnvidia-smiがブロックされます
Ubuntuのほうにはnvidia-smiが動作するので、nvidiaドライブは入ってるようです。
今はこちらを見ながら調べています
- Installing Nvidia Driver and Cuda in a Singularity Container
https://www.aditiashenoy.com/posts/blog3_nvidiacudasing/
おわりに
起動プロセスが若干面倒ですが、Dockerのような細かい設定を省いて使えるのは大きなメリットに感じます。うまく活用できるか分かりませんが、ちょくちょくいじってみたいです。
公式サイト
- Github
https://github.com/sylabs/singularity-userdocs
- 公式ドキュメント
https://docs.sylabs.io/guides/3.2/user-guide/
- 開発元
参考ページ
- 検証用コンテナはDocker?いいえ、Singularityです。
https://qiita.com/mkt3/items/b9f86f5ddf9eb0f43608
- GPUユーザーは、すぐにdockerからsingularityに切り替えるべきだと思った8つのこと
https://www.ecomottblog.com/?p=3903
- Linux上のsingularityコンテナにWindowsのvscodeから接続する
Discussion