本記事はDocker Advent Calendar2017の25日目の記事です。
今年は、ディープラーニングに関連する案件に多く関わることになり、その際にnvidia-dockerを使用する機会があったので、
nvidia-dockerを使った事例と、難しかったところなどに触れたいと思います。
nvidia-dockerについて
nvidia-dockerとは何かと言うと、NVIDIAが公式でOSSとして公開しているDockerのUtilityです。
インストール方法や詳細な使い方については公式のGithubや、qiitaにもnvidia-dockerについて書かれている記事は色々あるのでそちらを参考にしてください。ここではnvidia-dockerの特徴だけ掲載します。
- ホスト側にはNVIDIAのGPUドライバさえインストールしておけば良い
- DockerコンテナからNVIDIAのGPUにアクセスできる
- ベースとするコンテナを切り替えることで、OSやCUDAのバージョンを自由に変更できる
事例その1 案件で使用するディープラーニングモデルの調査用として
最初は、案件で使用するディープラーニングモデルの環境構築方法や学習方法、使い方などの調査する環境を
作るためにnvidia-dockerを使いました。
開発当初、自由に使えるGPUマシンがなかった
nvidia-dockerをつかうことになったきっかけは、開発当初、開発用のマシンがすぐに用意できず、ディープラーニングの勉強用として社員で共有しているGPUマシンを間借りすることなったことです。
間借りした環境に極力影響を与えないようにかつ、OSや、使用するライブラリを自由に選択するにはDockerがいいのではないかと思い、「Docker GPU」とかで検索したらまさにドンピシャのもの(nvidia-docker)がヒットしたので使ってみることにしました。
新人に環境構築をやらせてみた
今回の案件では、今年入社した新人にpyenvやOpenCVの環境構築から、使用するモデルのデモプログラムを動かすところまでをやらせました。
実機インストールであれば、環境構築がうまくいかなかったらOSの再インストールから初めないといけないので、いきなり新人にやらせるのは難しいかもしれないですが、Dockerであれば適宜コンテナをコミットしてバックアップを取らせながらやらせれば、手戻りが少ないので新人でも安心して任せることができました。
事例その2 様々なディープラーニングモデルを組み合わせる
事例その2は、ディープラーニングのモデルを複数組み合わせてシステムを構築した時にnvidia-dockerを使うことにしました。
ディープラーニングのモデルを複数使うにあたり、下記の問題がありました。
- GPU割り当てをうまくやる必要がある
- そもそも複数のモデルをシングルプロセスで展開できない(※)
※複数のモデルを使うことができるかはものにもよると思う。
特に今回の案件ではCaffeを使ったモデルを複数使っていて、しかもそのCaffeは独自に
改造したものだったのでライブラリが競合してしまったことが大きな原因
上記2つの問題を解決するために、nvidia-dockerを使うことにしました。
具体的には下記の方針で設計しました。
- ディープラーニングモデルごとにDockerコンテナを用意
- モデルごとに環境を用意できるのでライブラリの競合などの心配がない
- コンテナ起動時に重みをロードしてサービスとして展開する
- モデルのロード時間はコンテナ起動時のみなので比較的早く処理を行うことができる
- 今回は1つのアプリでしか利用していないですが、やろうと
- nvidia-dockerのdocker-compose版であるnvidia-docker-composeを使ってコンテナを管理
- docker-composeなのでコンテナ管理が楽
- GPUの割り当てについてもdocker-compose.ymlで管理できるので楽ちん
nvidia-dockerを業務で使ってみて
nvidia-dockerを実業務で使ってみた所感を述べたいと思います
コンテナの容量が大きくなりがち
OpenCVとか、Caffeとか、Tensorflowとか、インストールするものも多いので、Dockerのイメージが大きくなりがちでした。
作成物がroot権限になるので取り扱いが難しい
Dockerって通常rootユーザで動くので、前処理プログラムとかで大量の画像データを作成したりすると
全てrootユーザになってしまうので、chownコマンドを適用するにしても数時間、数十時間かかったりとかして
取り扱いが難しかったです。
デスクトップ環境が欲しくなるが、、、
OpenCVとか使っていたりすると、highguiを使って画像を表示したいところですが、Dockerコンテナなので難しいです。
一応、Dockerコンテナでもデスクトップ環境を構築できるので、highguiをつかうこともできますが設定とかすごくめんどくさいです。