ROCm 2.5 から, GPU 間の corrective 通信 RCCL(NCCL の ROCm バージョン)が動き始めました.
ROCm 3.x あたりから, API は NCCL そのままになりました(ややこしいが, NVIDIA の NCCL そのままのインターフェイスで, 実装だけ ROCm? で置き換えたもの)
RCCL により, GPU 間でのデータ転送や集約が高速に行える... はず.
たとえば StyleGAN https://github.com/NVlabs/stylegan では複数 GPU での training に NCCL を利用していますが, RCCL により StyleGAN の AMD GPU での複数 GPU 学習が可能になる気配があります.
4 x VEGAs で動作確認しました.
利用方法
ROCm 2.10 あたりから, rccl も apt パッケージで提供されるようになりました.
自前でビルドしたい場合, ROCm のバージョンに合わせた brach を引き(master-rocm-2.5
など), README にしたがってビルドします.
test を走らせたい場合, ベンチマークにも使える rccl-tests
があります.
こちらは OpenMP を使っていませんので問題なくビルドできます.
x299 + 4 x VEGAs で all_gather をためしたところ, 1.97 GB/s くらいでした.
$ LD_LIBRARY_PATH=/opt/rocm/rccl/lib ./all_gather_perf -g 4
# nThread 1 nGpus 4 minBytes 33554432 maxBytes 33554432 step: 1048576(bytes) warmup iters: 5 iters: 20 validation: 1
#
# Using devices
# Rank 0 Pid 23147 on wwk device 0 [0x0c] Vega 10 XT [Radeon RX Vega 64]
# Rank 1 Pid 23147 on wwk device 1 [0x19] Vega 10 XT [Radeon RX Vega 64]
# Rank 2 Pid 23147 on wwk device 2 [0x67] Vega 10 XT [Radeon RX Vega 64]
# Rank 3 Pid 23147 on wwk device 3 [0x6a] Vega 10 XT [Radeon RX Vega 64]
#
# out-of-place in-place
# size count type time algbw busbw error time algbw busbw error
# (B) (elements) (us) (GB/s) (GB/s) (us) (GB/s) (GB/s)
33554432 2097152 float 13115 1.92 1.92 0e+00 12802 1.97 1.97 0e+00
# Out of bounds values : 0 OK
# Avg bus bandwidth : 1.94233
少なくとも PCIe Gen3 x4 では接続されているはずなので 3.94 GB/s くらいは理論上出るはずですが(https://en.wikipedia.org/wiki/PCI_Express), 半分の性能になっています. はて?
問題点
rccl の repo に昔あったサンプルコード
を最新 RCCL でビルドして動かすと
あたりでとまります. API 呼び出しかなにか変わったのかもしれません.
rccl 最新の unit test コードあたりなどを参考にして, RCCL 利用プログラムを作成するのがよさそうです.
Debug
NCCL_DEBUG=INFO
と環境変数を指定します.