この情報は古いです。現状では、手で環境整備せずにnvidia-dockerを利用したほうが簡単・安全・確実です
ローカル環境に複数バージョンのCUDAを入れるのができるのかできないのかよくわからないが、少なくともあまりやりたくない。そこで、Dockerを利用して、希望のバージョンのCUDAがはいった環境を作ることで、様々なCUDA環境での開発をやりやすくする。
また、Jenkins上ではここに書かれた手順を利用することで、複数バージョンのCUDAやcudnnのテストを行っている。
Dockerをインストールする
手順に従って、dockerをインストールする。公式のインストール手順は度々変わるので注意する。
ホスト側にcuda7.5をインストールする
chainer-testは、ホスト側にcuda7.5が入っていることを仮定している(cuda7.5同梱のドライバを利用している)。古いと動かない。
aptで完結するので、CUDAはdebファイルから入れる方がお薦め。
それから、Dockerのインストールなどでカーネルバージョンが上がると、ドライバが認識されなくなったりするので、Dockerのバージョンをあげたときはdriverも入れ直す(?)必要があったりする。この辺はちゃんと理解していない。
nvidia-uvmを作る
Docker越しにCUDAを実行するには、/dev/nvidia-uvm
が見えている必要がある。起動時にこのデバイスは見えない。以下のコマンドを実行するとこのデバイスができる。理由はよくわからない。
$ /usr/local/cuda/samples/1_Utilities/deviceQuery/deviceQuery
nvidia-docker内では、以下のコマンドを実行している。こちらでも/dev/nvidia-uvm
ができる。仕組みはよくわからない。
$ nvidia-modprobe -u -c=0
Jenkins環境内では、毎ビルドごとにこのコマンドを実行してからdocker run
している。
Chainer用のDockerfileを作る
chainer-test
プロジェクトには、環境に合わせたDockerfile
を生成するスクリプトがある。これを利用して、テストしたい環境用のDockerfile
を作成する。
$ git clone https://github.com/pfnet/chainer-test.git
$ ./make_docker.py --base=ubuntu14_py2 --numpy=numpy19 --cuda=cuda65 --cudnn=none
以前は、あらゆる組合せのDockerfile
を作っておいたが、流石に組合せが100通りくらいになってきたので、生成することにした。これで指定した環境用のDockerfile
ができる。
このDockerイメージを作成するためには、カレントディレクトリにインストール対象のCUDAのbinファイルとcudnnが必要。上記の設定ならcuda_6.5.19_linux_64.run
をchainer-test
ディレクトリにコピーしてくる。持っていない場合は、CUDAのサイトに行ってダウンロードする。
Dockerfile
中でダウンロードしたほうがいいのだが、ネットワーク帯域が極めて下がることがあり、テストが何時になっても実行できないことがあったのでこうした。
あとは、普通にDockerを起動すれば良い。--device
引き数で、GPUを見えるようにしているのが重要。
$ docker build -t chainer
$ docker run --device /dev/nvidia0:/dev/nvidia0 --device /dev/nvidiactl:/dev/nvidiactl --device /dev/nvidia-uvm:/dev/nvidia-uvm -it chainer /bin/bash
これでDocker環境下のbashに入れる。あとはふつうにソースをとってきて開発するだけ。