やりたいこと
chainermnのサンプルをinfiniband接続のhost上で稼働するnvidia-docker2コンテナ内で動かす.(ただし,この記事ではとりあえず,ノード数1で動かすことを目指す)
何故この記事を書いた?
Infiniband接続のPC内のdocker上でchainermnを使おうとすると,multi-gpu (multi-nodeではない)であっても,dockerに対してInfinibandのdriverを入れる必要があるようだったので,備忘録として.
環境・前提
Host
- Ubuntu16.04 x64
- Infiniband (Mellanox)
Docker Image (nvidia-docker2)
- docker-image: 9.0-cudnn7-devel
- gitやらなんやらある程度インストールしてある状況を想定。まっさらなものから設定するときは、基本的に各項目の[参考]リンクを参照。
この作業をした日
2018.11.20
まず確認すること
最新版のchainer(5.0.0)にはchainermnが含まれているようです。現時点では古い情報のほうが多いようです。例えば、サンプルコードは[ここのもの]
(https://github.com/chainer/chainer/blob/master/examples/chainermn/mnist/train_mnist.py)を使うべきです。
このコードをlocalに落として来て、下記が動くようであれば、何もする必要がありません。
% export CUDA_VISIBLE_DEVICES='0,1';\
mpiexec -n 2 train_mnist.py -g
ちなみに,googleで「chainermn mnist」くらいで検索するとこちらの公式インストラクションがヒットしますが,今回はシステムの動作確認なので,手動での変更方法に関するこのインストラクションは使わず,gitにあるサンプルコードを使うのが吉.(地味にこれが一番罠だったかも。何も考えず勉強がてら,インストラクションに従ってコーディングしたが,エラーの原因がコードにあるのかシステムの設定にあるのかわからなくなった.当たり前だけれど,システムの設定をしたいのに手動で編集したコードを使うのは全く良いアイディアではない。)
手順
1. コンテナにinfinibandのドライバーをインストールする(参考)
apt-get install -y autoconf automake swig m4 chrpath dpatch
cd /tmp
wget http://content.mellanox.com/ofed/MLNX_OFED-4.2-1.0.0.0/MLNX_OFED_LINUX-4.2-1.0.0.0-ubuntu16.04-x86_64.tgz
tar -xvzf MLNX_OFED_LINUX-4.2-1.0.0.0-ubuntu16.04-x86_64.tgz
MLNX_OFED_LINUX-4.2-1.0.0.0-ubuntu16.04-x86_64/mlnxofedinstall --user-space-only --without-fw-update --all -q
必要に応じて、最後のinstallスクリプトに--forceオプションを渡す。
2. openmpi3.0.0をソースからコンパイル(参考)
ちなみにコンパイル済みのcupyパッケージを使うと以下の手順は不要かも.
apt install -y --no-install-recommends libtool flex
git clone --depth=1 -b v3.0.0 https://github.com/open-mpi/ompi.git /tmp/ompi
cd /tmp/ompi
./autogen.pl
./configure --with-cuda --with-hwloc
make -j8
make install
3. mpi4pyをインストールする
もし既にインストール済みなら一旦削除してから入れ直す
pip uninstall mpi4py
pip install mpi4py --no-cache
コンパイルに失敗するようなら、setuptoolsのリンクが切れている可能性がある。私の場合はlibopen-palが見つからなかった(といわれるのにldconfig -v|grep libopen-palは存在していた)。baseとなるライブラリが入れ替わったためと思われたので、setuptoolsを再インストールした。
pip install setuptools --force
4. chainerをインストールする
ここまでできたら、chainerをインストールします。もし、すでにインストール済みのものがあれば、一旦uninstallします。
pip uninstall cupy chainer chainermn
pip install cupy chainer --no-cache
5. 動かしてみる
wget https://raw.githubusercontent.com/chainer/chainermn/release/1.3/examples/mnist/train_mnist.py
export CUDA_VISIBLE_DEVICES='0,1'
mpiexec --allow-run-as-root -n 2 python train_mnist.py -g