🐳

Dockerよりお手軽? Singularityを導入してみた

2022/09/12に公開

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から落としました。

Ubuntuダウンロード

起動し、ユーザー名、パスワードを決めます。

Linuxコマンド画面

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が起動します。
Singularity起動画面
終了の際はexitコマンドでUbuntuへ戻れます。

VScodeでの動かし方

Remote機能を使えばVScodeでも動かせます。

1. 拡張機能でRemote-WSLを入れる

似ている拡張機能もあるので注意。(他の拡張機能を入れてもDockerなどで使えます)

拡張機能

2. 左のメニューから「リモートエクスプローラー」を選択、「WSL」からUbuntuで起動したい環境を選ぶ

リモートエクスプローラー

問題無ければUbuntuが起動し、Ubuntuの中のファイルが表示されます。赤枠の箇所に「WSL:Ubuntu」と書いてあれば起動に成功しています。
起動画面

OS内のフォルダも見れるし、ドラックアンドドロップでファイルやフォルダをホストからコピーできます。便利。

3. ターミナルでSingularityを実行

9/12時点の課題(自分の)

・Ubuntu起動→フォルダ移動→Singularityを起動するという流れが若干面倒です。一気に起動したい。

方法がないわけではなさそうですが、うまくいきません。

・GPUのデータを見るコマンドnvidia-smiがブロックされます

エラーメッセージ

Ubuntuのほうにはnvidia-smiが動作するので、nvidiaドライブは入ってるようです。

今はこちらを見ながら調べています

おわりに

起動プロセスが若干面倒ですが、Dockerのような細かい設定を省いて使えるのは大きなメリットに感じます。うまく活用できるか分かりませんが、ちょくちょくいじってみたいです。


公式サイト

  • Github

https://github.com/sylabs/singularity-userdocs

  • 公式ドキュメント

https://docs.sylabs.io/guides/3.2/user-guide/

  • 開発元

https://sylabs.io/

参考ページ

  • 検証用コンテナはDocker?いいえ、Singularityです。

https://qiita.com/mkt3/items/b9f86f5ddf9eb0f43608

  • GPUユーザーは、すぐにdockerからsingularityに切り替えるべきだと思った8つのこと

https://www.ecomottblog.com/?p=3903

  • Linux上のsingularityコンテナにWindowsのvscodeから接続する

https://qiita.com/k_tk/items/f746acc8267364d18e48

Discussion