Open5

NCCLにおける環境変数

nariaki3551nariaki3551

NCCL_IGNORE_CPU_AFFINITY

役割

NCCL_IGNORE_CPU_AFFINITY を 1 に設定すると、NCCL はジョブで指定された CPU アフィニティを無視し、GPU アフィニティのみを使用する。(デフォルトでは0) 

https://github.com/NVIDIA/nccl/issues/1017 の例では、コンテナ環境で NCCL を使用する際に、CPU リソースの利用方法に影響を与える可能性があります。例えば、H100 クラスター上でコンテナ内で NCCL を使用する際に、NCCL_IGNORE_CPU_AFFINITY=1 を設定し、--cpu-bind none オプションを使用することで、レイテンシが大幅に減少したとの報告がある。 

効果

SlurmのCPUアフィニティ設定が、NCCLが最適とするGPUとの通信パスに対して不利なコアを使用させることがあり、結果として、GPU間通信やデータ転送に必要なCPUリソースが効率的に活用されず、レイテンシや帯域幅が低下する

nariaki3551nariaki3551

NCCL_NET_GDR_LEVEL

GPU Direct RDMA(GDR)を使用する際のNIC と GPU 間の距離に基づいて、どの程度の距離まで GDR を適用するかを細かく調整できる

value description
0 GDR は常に無効
1 GPU と NIC が同じ PCI スイッチ上にある場合に GDR を使用
2 GPU と NIC が複数の PCI スイッチを経由して接続されている場合に GDR を使用
3 (default) GPU と NIC が同じ PCI PCI Root Complex上にあり、CPU を経由する可能性がある場合に GDR を使用
4 GPU と NIC が同じ NUMA ノード内で、異なる PCI ルートコンプレックス間で接続されている場合にも GDR を使用
PCI Root Complexとは

PCIe アーキテクチャにおいて、システムのCPUやメモリとPCIeデバイス(例: GPU、ネットワークカード、ストレージデバイスなど)を接続するための起点となる論理的な構造を指す。

  1. CPUとPCIeデバイス間の橋渡し: PCI Root Complexとは、CPUまたはチップセットから直接接続され、CPUとPCIeデバイス間でデータを転送する役割を担う。
  2. ルートポートの存在: ルートコンプレックスは、一つまたは複数の「ルートポート」を持ち、これらのポートを通じてPCIeデバイスが接続される。ルートポートの下にはスイッチやエンドポイントが接続されることがある。
  3. システムのトポロジー構成の基本単位: システムのPCIeトポロジーの基本単位であり、複数のルートコンプレックスが存在する場合、各ルートコンプレックスは独立した通信領域を提供する。
nariaki3551nariaki3551

NCCL_NCHANNELS_PER_PEER

NCCLが同じペア間(peer-to-peer)通信で使用するチャネル数を指定する

デフォルトでは 1〜4 チャネルが使用されることが多い。これを増やすことで次の効果が期待される。

  • 並列通信の増加: チャネル数を増やすことで、同時に通信できるパスが増加。例えば、同一ノード内のGPU間通信(intra-node)で、帯域幅の最大活用が可能に
  • 高帯域幅の活用: 多くのチャネルを利用することで、PCIeやNVLinkなどの高帯域幅インターコネクトの能力をフルに引き出せる
  • 通信の重複解消: 通信が並列に進むため、スレッド間の待機時間が減少し、通信効率が向上

当然、チャネル数を増やした場合のデメリットもある

  • 各チャネルごとに通信バッファが必要
  • リソースの競合
  • GPU内でスレッドブロックの競合
  • チャネルごとに通信スレッドが増えるため、スレッド間の同期が多くなる