LoginSignup
26
13

More than 5 years have passed since last update.

NCCLでNVLinkを活用するとどうなるか試してみた

Last updated at Posted at 2017-08-22

TL;DR

ことのはじまり

NCCLは,NVIDIAが提供しているマルチGPU向けの集合通信用のライブラリです.
NCCLについての正確で詳しい説明は,NVIDIA Collective Communications Library(NCCL)Fast Multi-GPU colllectives NCCLをみてもらうとして,
簡単にいうと,マルチGPUで,Reduceなど手軽に高速に処理できる素敵ライブラリ,です.
NCCL 1.3.5が,オープンソースとしてGitHubで公開されていますhttps://github.com/NVIDIA/nccl

今回,二つのGPUを搭載したサーバを使える機会に恵まれたので試してみました.GPUがNVLinkで接続されている素敵なハードウェア構成です.
NVLinkについてはこちら.PCIeより5〜12倍高速なるというふれこみの,期待大の通信路です.

NCCL1.3.5の落し穴とNCCL2

...と,ここで衝撃のIssueがGitHubに.
what is the latest release version of NCCL?

  • GitHubにあるオープンソース版のNCCLはNVLink向けにはなってない
  • NVLinkをサポートしたNCCL 1.6はDGX-1カスタマー向けにリリースされている

とのこと.
ただし,NVLink使うのは諦めなさい...ということではなく,DGX-1を購入していないユーザでもNCCL2ならダウンロードして使えるとのこと.
ちなみにDGX-1というのは,NVIDIAから販売されているAI研究向けにGPUがたくさんのったパワフルな計算機です https://www.nvidia.com/en-us/data-center/dgx-server/

NCCL1.3.5 vs NCCL2.

というわけで,GitHub版のNCCL1.3.5とNCCL2で,どれほどの違いがあるのかGitHubのテストベンチで調べてみました.
結果はこちら

nccl_compare_result.png

二つのGPUだけのReduceであるにも関わらず,約2倍程度の性能差があることがわかります.
これ,4GPUや8GPUの環境では,もっと性能差がでるんじゃないかなあ...

NCCL2があればOK...でもない

NCCL2があるなら,それでいいじゃん,で話が終わらないのが残念なところ.
マルチGPUサーバを何に使う?というと,今ならディープニューラルネットワークの学習に使うというのが主ですよね.
TensorFlowなど有名なフレームワークはマルチGPUにもNCCLにも対応しはじめています.
なのですが,多分それらはNCCL2では使えないんじゃないのかなあ?(まだちゃんと試せていないけど)

というのも,NCCL1.3.5とNCCL2には若干の違いがあるのです.
大きな違いの一つは,NCCL1.3.5では,

  for (int i = 0; i < nDev; ++i) {
    CUDACHECK(cudaSetDevice(dList[i]));
    NCCLCHECK(ncclAllReduce((const void*)sendbuff[i], (void*)recvbuff[i], std::min(N, 1024 * 1024), type, op, comms[i], s[i]));
  }

としてNCCLでのall-reduceができるのですが,NCCL2では,

  ncclGroupStart();
  for (int i = 0; i < nDev; ++i) {
    NCCLCHECK(ncclAllReduce((const void*)sendbuff[i], (void*)recvbuff[i], std::min(N, 1024 * 1024), type, op, comms[i], s[i]));
  }
  ncclGroupEnd();

と,集合通信のAPIを呼ぶ前後で,ncclGroupStart()/ncclGroupEnd()を呼ばないといけなくなっています.
ちなみに,これらを呼ばないと処理がまったく進みません.

また,ncclAllGatherのように,引数の順番が違うAPIもあります...

だから?

たとえば,TensorFlowのNCCL関連コードnccl_manager.ccを見てみると,
ncclGroupStart()/ncclGroupEnd()を呼んでいるようには見えないのです(2017年8月22日現在).
...つまり,オープンソースとして公開されているバージョンを組み合わせてTensorFlowをマルチGPU環境で使う場合,NVLinkが宝の持ち腐れになっちゃうってこと?

まとめ

NCCLを使ってNVLinkの性能を評価してみました.NVLinkに対応したNCCL2を使うことで速度向上が見込めるようです.
一方で,たとえばTensorFlowのようなNCCLに対応したコードが入っているフレームワークでもNCCL2には対応していないような気が...
DGX-1ではない,NVLink接続なマルチGPUサーバを購入した人たちって,どうしているのかなあ?(ニュースなんかで,導入している大学や組織の名前を目にした気がするのだけど)
フレームワークなんか使わないで,ごりごりNCCL2で集合通信するマルチGPU対応のニューラルネットワーク処理エンジンを作っているのかな?

26
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
13