Singularityとは
Dockerなどより気軽に使えるコンテナのキットです。root権限やrootを使わないときもUID周りの煩雑な設定が不要であったり、homeがすでに共有されていたりと便利なことが多く、使っている人も多いと思います。
今まででもGPUのサポートがあったのですが、CUDAなどのバージョンがホスト固有のものになってしまう問題が最近解決されそうで、ますます使いやすくなってきています。この記事ではその新機能について紹介します!
Singularityでコンテナを使うときのCUDAについて
デフォルトでは、Singularityはnvidia-container-runtimeを使わないため CUDAのバージョンがホスト固有のバージョンに固定 されています。
なので、例えばコンテナ内でCUDA11.2でたとえコンテナ内にCUDAが入っていたとしてもホストがバージョン11.4の場合はホストのCUDAが利用されるためバージョン違いでコンテナ内でアプリケーションが動かないということがあります。
Singularity 3.9からnvidia-container-cliの機能がサポートされたことによりこの問題は解決されそうになっています(2021年12月4日現在ベータ機能)従来のレガシーな方法だとCUDAを複数バージョンホストに入れる必要があり、ホストのCUDAを複数バージョン管理するのはコストが高かったです。
これは画期的なことです。コンテナに含まれているCUDAを使えるベータ機能を使ってみます。
解決法、導入方法
Singularity 3.9以降で実装されたcuda-container-cliの機能を有効化して、コンテナ内でCUDAを参照できるようにします。
今回はUbuntu上でVMを立ててGPUパススルーをして、その中でRocky Linuxで導入しましたが、どの環境でも同じように使えると思います。A100のDGX-Station(デスクトップ)で導入しています。
- あらかじめnvidia-container-runtimeをホストにインストールしておきます。
- バージョンが3.9以降のソースコードやrpmを取ってきて、インストールします。
- nvidia-container-cliのpathを通します。ここでのpathは検索パスではなく、実際のバイナリまで記述します。
/etc/singularity/singularity.conf
の中で、設定を見つけて追記しておきます。パスが通ってないと起動時にエラーが出ます。 - 起動するとき、この機能はデフォルトでは無効なので
--nvccli
のフラグと一緒に起動します。
補足でsingularity.conf
ファイルを書き換えればデフォルトで有効にすることもできます。
この方法はベータ機能ですが、待ちに待った昨日というか、ないと困りますよね?
正式な機能になったらこのフラグをデフォルトにして運用してもいいかもしれませんね。
参考ドキュメント
Singularity 3.9のGPU周りのドキュメント:https://sylabs.io/guides/3.9/user-guide/gpu.html
では快適なSingularity生活を。