もう依存関係に悩まない! 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のプロセス上からnVidia製GPUへのアクセスを可能にするユーティリティです. github.com
$docker [command]
を$nvidia-docker [command]
に置き換えるだけで,GPUへのアクセスが可能になるスゴいヤツです.
環境構築
Ubuntuのインストール
当たり前ですが,OSをインストールしないことには始まりません. が,GPU付きUbuntuのインストールって面倒なんですね. まさかここで詰むとは…という感じでした.
まずUSBメモリにUbuntu16.04 LTSのisoを焼き,ダイアログ通りインストールします.インストール完了後に再起動をすると,なんと起動しないではありませんか!
この問題と解決策は,様々な方が記事にしてくださっています.
参考文献1 qiita.com
2017/08/28追記: なぜかうまくリンクが貼れないので,「trouble shooting – グラボ増設してLinux install したら黒い画面」で検索していただけるとヒットすると思います.
問題は,nVidiaグラボとUbuntuのブートローダの相性が悪いということらしいです… 私は参考文献2の方法でインストールしました. 要約しますと
とりあえずUbuntuをインストール
インストールディスクを取り外さず,再起動
インストールディスクを起動し,「Try Ubuntu without installing」で"e"キーを押下
ブートローダの種類を"quiet splash"から"nomodeset"に変更する
F10で実行すると,Ubuntuの試用版が起動
アンマウントの後,再起動をかけるとUbuntuが立ち上がる
というような手順になります.なんでこんな面倒なの…
UbuntuにCUDAのドライバをインストール
こちらのブログを参考にさせていただきました.
まず,下記のCUDA Websiteから.debのダウンロードリンクを取得します.
CUDA Toolkit Download | NVIDIA Developer
ここで,OS > Archtechture > distribution > Version > Installer type(deb(Network))
と選択します.
Ubuntuにインストールする場合は,下記のような選択になるかと思います.
その後は,指示通りに
$ 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/ とおくことにします.
$ 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にアクセス可能なことが確認できました. ちなみに通常のDockerだと
$docker run nvidia/cuda nvidia-smi bash: nvidia-smi: command not found
になってしまいます.
以上で環境構築は終わりです. 後はDocker Imageを立ててGPUをぶん回すだけですね. それでは皆様,楽しいGPUライフを!