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


GPUユーザー1は、様々なフレームワーク2や言語3で提供されるサンプルコードを試したり、バージョンアップによって動かなくなった過去コードのメンテナンス4に追われたりと、環境にまつわる問題に日々悩まされていました。

この問題に対する解は仮想環境の利用です。仮想環境はこのような問題を解決するのに役立ちますが、所詮フレームワークを切り替えたい位の話なので、VMwareなどの仮想マシンではいろんな意味で重すぎます。ほとんどのGPUユーザーに使われている仮想化が、コンテナ型のDockerです。5 以下、Dockerについては既に使っていること前提で、話を進めていこうと思います。

Docker6を使っていると、ちょっと気になることがあります。それは、dockerがデーモンで動いているし、イメージを立ち上げるには、実行時にsudoしないといけない7し、イメージ内ではrootになっていし、違和感満載8です。さらに、USBカメラ使いたいとかGUIしたいなどのちょっとしたことが面倒9です。
これは、まぁ慣れ的な話だし、慣れている人には慣れろと言われそうですが、他にいい方法があるハズです。

そこで、いきなりですが、結論です。そんなあなたは、

すぐにdockerからsingularityに切り替えるべき!

以上。

それでは、あなたをこの結論に誘う8つのことをご紹介します。

1.singularity10とは

科学および高性能コンピューティング(HPC)環境向けに設計されたオープンソースベースのコンテナープラットフォームです。

2.dockerイメージが使える

docer同様、コンテナ・イメージをビルドして使います。singularityのリポジトリもありますし、dockerのリポジトリからも取ってくることができます。

3.使い方は簡単!

shellを動かす。

pythonスクリプトを実行する。

4.rootで動かさなくていい

コンテナ内を書き換えないなら、実行時にsudoしなくてもいい。

5.実行時のuserを引き継ぐ

~/下など、権限があれば書き込みできる。
dockerだと、イメージを実行する場合、こんな感じで動かさなければならないです。

6.usbcamとかGUIとかすぐ使える

/devや/tmpも引き継がれるため、シームレスにusbカメラ等が使えるので、検証も楽々です。

styletransfarの様子

dockerだと、イメージを実行する場合、こんな感じになる。(ハマる・・・ムリ

7.MPIを使って並列処理も可能

やったことないけどw

8.ABCI11でも使われている

しかも、ソニーのnnablaを使ったImageNet/ResNet-50 Trainingで世界最速12,13ですって、奥様。

おわりに

どうでしたか?安心してsingularityできると思っていただけたと思います。14
環境を汚さず、いろいろ試したいだけだったんですが、いいモノ見つけたと思います。皆さんもお試しあれ!15
エコモットでは、データ分析したい人を随時募集しています。とりあえず、PCA知っているレベルから面接します。DGX-STATIONでDNNしたい方、是非お声かけください。

参考サイト


  1. ここでは、tensorflowとかchainerなどのフレームワークを使って、GPUでごにょごにょする人をこう呼びます。 
  2. 上述の他にnnablaやpytorch,kerasなどの他にこれから流行る未知のモノまでいろいろです。 
  3. 基本pythonでしょうが、Derknetを使う場合はC++だったりします。 
  4. 基本メンテナンスしない方向で考えます。 
  5. またはnvidia-dockerよね? 
  6. nvidia-dockerを含む 
  7. ってことで、sudoできる権限を与えないといけない 
  8. セキュリティ的には問題ないんでしょうけど、マルチユーザ環境ではあまりsudoできる人は増やしたくないですよね。 
  9. みんなが困っているので、ググればすぐ解決しますけどね。 
  10. 技術的特異点ではありません 
  11. https://abci.ai/ja/about_abci/ 
  12. https://www.aist.go.jp/aist_j/press_release/pr2018/pr20181113/pr20181113.html 
  13. https://arxiv.org/abs/1811.05233 
  14. 目的達成 
  15. ちなみに、ソースからインストールする時、Goのインストールがパスにセンシティブなので、エラーの時はreadmeの通りやってみてください。