注意 : これを書いている時点の情報です。
普段はTensorFlowで将棋を指す取り組みをしています。マルチGPU環境が欲しいためAWS EC2 p2.16xlargeインスタンスを試しました。
結論としてはp2.16xlargeはK80(GPU x2) x8で16GPUを搭載しているが1プロセスで使用できるGPUの数が8基に制限されるため使いにくいということになります。カジュアルな用途では p2.8xlarge までにとどめておくのが無難だと思います。
やったことと起きたこと
- p2.16xlarge に Ubuntu 16.04 をインストールし nvidia ドライバ、CUDA、TensorFlowをインストールした
- セットアップ方法は Ubuntu14.04にcuda 7.5をインストール に倣った
- TensorFlowを使用した自作プログラムを動かそうとした
-
CUDA_ERROR_TOO_MANY_PEERS
を含むエラーが発生してプログラムが動かなかった(tf.Session()
でエラーが発生する )
16GPUを同時に使用できない
参考リンク
- CUDA_ERROR_TOO_MANY_PEERS in tensorflow with 16x Tesla K80s
- CUDA peer resources error when running on more than 8 K80s (AWS p2.16xlarge)
何が起きているか
どうやら9基以上のGPUを1つのプロセスで使おうとするとGPU間のP2P通信が失敗するようです。CUDA toolkitに同梱されているテストプログラム simpleP2P
でエラーが発生しなくても実プログラムでエラーになります。参考リンクのnvidiaの掲示板では TensorFlow と Torch でエラーが出ています。これはハードウェアの制限のようです。
それでどうするの?
掲示板では CUDA_VISIBLE_DEVICES
を設定して1プロセスが使用するGPUを8基に制限した上で同一マシンに8基のGPUを使用するプロセスを2つ作りクラスタ化する方法が提案されています。自分は試していないので上手くいくかどうかはわかりません。
-
CUDA_VISIBLE_DEVICES
参考 : TensorflowでGPUを制限・無効化する
自分はクラスタ化をまだ身につけていないので p2.8xlarge を使用して1プロセスマルチGPUで製作していこうと思います。p2.8xlargeでは8GPUですので自作プログラムが正常に動作しました。またp2.8xlargeの環境作成では P2インスタンスにpip3でTensorFlowを入れる を参考にしました。今まではグラフィクスドライバからインストールしていましたがdpkg
とapt
でCUDAをインストールするだけでGPUが使用できるようになったようです。