MHRNOTE

画像処理、コンピュータービジョン、GPGPU、開発環境、etc

もう依存関係に悩まない! nvidia-dockerでクリーンなGPU環境を作る

こんにちは. 前回の更新が2015年5月,今日は2017年8月の終わりです. 察していただけますと幸いです(?)

突然ですが,Dockerって便利ですよね. www.docker.com

数年前から話題になっているDockerですが, 恥ずかしながら,最近まで使ったことがありませんでした. しかし,いざ使ってみると,ライブラリのインストールとかでいちいちハマっていた時間を大きく短縮でき,新しいライブラリを試してみるまでの障壁が低くなりました. もちろん,Dockerならではのめんどくささみたいなのもありましたが,全体的に便利になったと思ってます.

ところで,色々なライブラリがリリースされ,それぞれ触ってみたいなーと思うカテゴリにDeep Learningがあります. 有名どころだけでもCaffe, Tensorflow, Chainer, Keras, PyTorch…なんて具合です. が,依存関係やらGPU周りのめんどくささで,インストールが面倒だと言う話はよく耳にするかと思います.

ということで,本記事ではOS未インストールのGPUマシンから,nvidia-dockerを使ってクリーンなGPU開発プラットフォームを作るまでを解説したいと思います.

はじめに:nvidia-dockerとは?

dockerのプロセス上からnVidiaGPUへのアクセスを可能にするユーティリティです.  github.com

$docker [command]$nvidia-docker [command]に置き換えるだけで,GPUへのアクセスが可能になるスゴいヤツです.

https://cloud.githubusercontent.com/assets/3028125/12213714/5b208976-b632-11e5-8406-38d379ec46aa.png

環境構築

Ubuntuのインストール

当たり前ですが,OSをインストールしないことには始まりません. が,GPU付きUbuntuのインストールって面倒なんですね. まさかここで詰むとは…という感じでした.

まずUSBメモリにUbuntu16.04 LTSのisoを焼き,ダイアログ通りインストールします.インストール完了後に再起動をすると,なんと起動しないではありませんか!

この問題と解決策は,様々な方が記事にしてくださっています.

参考文献1 qiita.com

参考文献2 https://www.cs.gunma-u.ac.jp:443/~nagai/wiki/index.php?trouble%20shooting%20–%20%A5%B0%A5%E9%A5%DC%C1%FD%C0%DF%A4%B7%A4%C6Linux%20install%20%A4%B7%A4%BF%A4%E9%B9%F5%A4%A4%B2%E8%CC%CC

2017/08/28追記: なぜかうまくリンクが貼れないので,「trouble shooting – グラボ増設してLinux install したら黒い画面」で検索していただけるとヒットすると思います.

問題は,nVidiaグラボとUbuntuブートローダの相性が悪いということらしいです… 私は参考文献2の方法でインストールしました. 要約しますと

  • とりあえずUbuntuをインストール

  • インストールディスクを取り外さず,再起動

  • インストールディスクを起動し,「Try Ubuntu without installing」で"e"キーを押下

  • ブートローダの種類を"quiet splash"から"nomodeset"に変更する

  • F10で実行すると,Ubuntuの試用版が起動

  • 最初にインストールしたUbuntuを,試用版Ubuntuにマウント

  • マウントされたパーティション内のブートローダに関する設定を書き換え(詳細は参考文献に譲ります)

  • アンマウントの後,再起動をかけるとUbuntuが立ち上がる

というような手順になります.なんでこんな面倒なの…

UbuntuにCUDAのドライバをインストール

こちらのブログを参考にさせていただきました.

blog.amedama.jp

まず,下記のCUDA Websiteから.debのダウンロードリンクを取得します.

CUDA Toolkit Download | NVIDIA Developer

ここで,OS > Archtechture > distribution > Version > Installer type(deb(Network))と選択します. Ubuntuにインストールする場合は,下記のような選択になるかと思います. f:id:mhr380:20170826162530p:plain

その後は,指示通りに

$ wget [上記サイトの"download(2.6kB)"のリンク先] 
$ sudo dpkg -i cuda-repo-ubuntu1604_8.0.61-1_amd64.deb
$ sudo apt-get update
$ sudo apt-get install cuda

を実行してあげることで,特にハマることなく完了できました. nvcc -Vなどでインストールが正しく完了しているかがわかります.

Dockerのインストール

Dockerをふつうにインストールします.ややハマりどころがありました.

 $ sudo apt-get install Docker.io
 $ sudo usermod -aG docker  `whoami` # sudo無しでDockerを動くようにする

すると,Dockerが立ち上がらないのですが,下記URLにあるように,Ubuntuを再起動すれば解決しました. qiita.com

次に,(私の環境では必要があったので)Dockerにプロキシを設定します. ちなみに,Dockerの設定に書くプロキシサーバのURLがどうも名前解決がされず,IP表示で全て書いています. これは環境によるのかDockerの問題なのかはわかっておりません.ご存じの方はおしえてくださると幸いです. 以下では,プロキシサーバのURLをxxx.xxx.xxx.xxx:xxxx/ とおくことにします.

docs.docker.com

$ mkdir -p /etc/systemd/system/docker.service.d

$ touch /etc/systemd/system/docker.service.d/http-proxy.conf

作成したhttp-proxy.conf内にプロキシサーバのURLを書いてあげます.

 [Service]
 Environment="HTTP_PROXY=http://xxx.xxx.xxx.xxx:xxxx/"

同様にhttp-proxy.confも作成します.

 [Service]
 Environment="HTTPS_PROXY=http://xxx.xxx.xxx.xxx:xxxx/"

Dockerを再起動します.

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

これでDockerのインストールは完了です.

nvidia-dockerをインストールする

ご存じの方も多いと思いますが,通常のDockerからはGPUにアクセスすることができません. こんなときに用いるのがnvidia-dockerです. nvidia-dockerのインストールも,ハマりどころは少なかったです.

$ wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.0-rc.3/nvidia-docker_1.0.0.rc.3-1_amd64.deb `
$ sudo dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb`

コレだけの手順で動くはずです.とりあえず動かしてみましょう. CUDA入りのUbuntuイメージをpullし,GPUの状態を確認するnvidia-smiを実行してみます.

nvidia-docker run nvidia/cuda nvidia-smi

するとこんな感じになりました.DockerプロセスからGPUにアクセス可能なことが確認できました. f:id:mhr380:20170826154429p:plain ちなみに通常のDockerだと

$docker run nvidia/cuda nvidia-smi
bash: nvidia-smi: command not found

になってしまいます.

以上で環境構築は終わりです. 後はDocker Imageを立ててGPUをぶん回すだけですね. それでは皆様,楽しいGPUライフを!