アイドルのちコンピューティング

都内の平凡な情報系の大学生が日々のアイドル活動、プログラミング活動について垂れ流します

chainermnを導入する話

今回はchainermnの環境構築の話をします。 まずchainermnの環境構築に必要な物は、CUDA・MPI等の環境・cuDNN・NCCL・chainer本体などが必要になります。
それらの導入について

CUDAの導入

今回自分の環境下ではCUDAはすでにインストールされているのでpathを通すだけで終了しました。 もしCUDAが導入されていない場合ではnvidiaのサイトで自分のマシンと同じ環境に対応しているCUDAをDLする必要があります。

CUDA Toolkit Archive | NVIDIA Developer

#bashrcにpathを通す
CUDAROOT=path-to-your-cuda
export PATH="$CUDAROOT/bin:$PATH"
export LD_LIBRARY_PATH="$CUDAROOT/lib64:$LD_LIBRARY_PATH"

MPIの導入

Open MPI: Open Source High Performance Computing このサイトからtarファイルを自分の環境下にDLするかgitから直接cloneするのかをしたところで

$ tar xvf openmpi-2.1.2.tar.gz
$ cd openmp-2.1.2/
$ ./configure --prefix=your-path-to-MPI --enable-mpi-thread-multiple --with-cuda=your-path-to-CUDA
$ make & make install

普通はこれでうまくいくはずでした。。。
しかし結果はというと
libtool: error: require no space between '-L' and '-lrt'
と表示され何がおかしいのかもわからずにお手上げと思ってgitで調べてみると
OpenMPI/2.1.1-GCC-6.4.0-2.28 build fails if ucx-devel is installed on system · Issue #5805 · easybuilders/easybuild-easyconfigs · GitHub
これがヒットしました。
どうもmakefileのバグらしくこのような状態になってしまった場合./configure hogehoge --without-ucxとするのが今現在(2018/3/6)最も楽な対処策らしい、 のでこれを入れて実行したところ、無事インストール終了したので後はprefixで指定したpathをbashrcに書き込んで終了です。

#bashrcにpathを通す
MPIROOT=path-to-your-mpi
export PATH="$MPIROOT/bin:$PATH"
export LD_LIBRARY_PATH="$MPIROOT/lib:$LD_LIBRARY_PATH"
export MANPATH="$MPIROOT/share/man"

最後に$ which mpiexec等を打って自分の指定したpathが通っているのかを確認するといいでしょう。

NCCLの導入

NCCL(ニックル)とよんでいますが正しいかどうかは知りません()、次はニックルをインストールします。

$ git clone https://github.com/NVIDIA/nccl
$ cd nccl
$make CUDA_HOME=your-cuda-path

cuDNNの導入

cuDNNをインストールするためにまずnvidiaのHPで色々登録をする必要があるらしいですけど、自分的にはそこまで面倒ではなかったです。 メールアドレスの認証ぐらいでした。体感5分ほどで終了しました。

https://developer.nvidia.com/rdp/cudnn-download ここから自分の環境(OSやcudaのver)にあっているtarファイルをDLした後

$ tar xvf cudnn-9.0-linux-x64-v7.1.tgz
$ mv cuda/ /your-cudnn-path
#bashrcにpathを通す
$ vi ~/.bashrc
$ CUDNNROOT=your-cuDNN-path
$ export $LD_LIBRARY_PATH="$CUDNNROOT/lib64:$LD_LIBRARY_PATH"

これでcuDNNの導入は終了したはず。。!!

mpi4py,cupy等の導入

pip install ~で導入する方法と、git cloneで導入する方法があるので両方紹介します

pip install cupy

pipでインストールするだけなので秒で終了します

pip install cupy

この1行で終了します、ただCUDAやMPIのライブラリの依存の関係でうまくいかない場合があるそうなのでそういう場合はgitから直接cloneする方をおすすめします。

git clone https://github.com/mpi4py/mpi4py

$ git clone https://github.com/mpi4py/mpi4py
$ cd mpi4py
$ python setup.py build
$ python setup.py install

あとがき ちなみに自分はcupyをpipでインストールしたところエラーが出てしまったのでgitで入れました。(gitで入れることにコストがそこまで大きくないかつわかりやすいのでこっちのほうがおすすめ)

chainermnの導入

こちらもpipで入れるかgitで直接cloneする方法とあるのですが自分が直接cloneしました。

$ git clone https://github.com/chainer/chainermn
$ cd chainermn
$ python setup.py build
$ python setup.py install

以上で一応インストールは終了です。最後にしっかりとインストールされているのかの確認のために

mpiexec -n 1 python examples/mnist/train_mnist.py --gpu

とかでGPUを動かしつつ学習が進むのか確認できるでしょう.

f:id:wasabin_idol:20180311022306p:plain

自分がつまづいた点

自分はcupyのインストール時に詰まってしまいました。 上に書いたとおりにインストールをしていざmnistを走らせるとcupyとcuDNNの部分でエラーが表示されてしましました。 cupyを再インストールしようとしてみると

Modules:
  cuda      : Yes (version 9000)
  cudnn     : No
      -> Cannot link libraries: ['cudnn']
      -> Check your LDFLAGS environment variables
  nccl      : Yes (version 1.x)
  cusolver  : Yes
  thrust    : Yes

と表示され、cupyをインストールする時にcuDNNのpathがうまく通っていないっぽい?ので export LIBRARY_PATH="$CUDNNROOT/lib64:$LIBRARY_PATH" をbashrcに追記するとうまくcupyがインストールされました(LIBRARY_PATHでcudnnを参照してcupyをインストールしている様なログだったためにbashrcにそれに対応できるようcudnnのpathを追加したところ成功)

うちの研究室にはchainerを使っている人が多くいるかつ自分がmpi等を使ったことがあるためtensorflowよりもコードが何をしているのかが見やすい感じがします() とりあえずもっと使って精進します!(笑)