NCCLにおける環境変数

NCCL ... NVIDIA Collective Communications Library

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リソースが効率的に活用されず、レイテンシや帯域幅が低下する

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、ネットワークカード、ストレージデバイスなど)を接続するための起点となる論理的な構造を指す。
- CPUとPCIeデバイス間の橋渡し: PCI Root Complexとは、CPUまたはチップセットから直接接続され、CPUとPCIeデバイス間でデータを転送する役割を担う。
- ルートポートの存在: ルートコンプレックスは、一つまたは複数の「ルートポート」を持ち、これらのポートを通じてPCIeデバイスが接続される。ルートポートの下にはスイッチやエンドポイントが接続されることがある。
- システムのトポロジー構成の基本単位: システムのPCIeトポロジーの基本単位であり、複数のルートコンプレックスが存在する場合、各ルートコンプレックスは独立した通信領域を提供する。

NCCL_NCHANNELS_PER_PEER
NCCLが同じペア間(peer-to-peer)通信で使用するチャネル数を指定する
デフォルトでは 1〜4 チャネルが使用されることが多い。これを増やすことで次の効果が期待される。
- 並列通信の増加: チャネル数を増やすことで、同時に通信できるパスが増加。例えば、同一ノード内のGPU間通信(intra-node)で、帯域幅の最大活用が可能に
- 高帯域幅の活用: 多くのチャネルを利用することで、PCIeやNVLinkなどの高帯域幅インターコネクトの能力をフルに引き出せる
- 通信の重複解消: 通信が並列に進むため、スレッド間の待機時間が減少し、通信効率が向上
当然、チャネル数を増やした場合のデメリットもある
- 各チャネルごとに通信バッファが必要
- リソースの競合
- GPU内でスレッドブロックの競合
- チャネルごとに通信スレッドが増えるため、スレッド間の同期が多くなる