1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Spectrum-X・NCCL・GPUDirectで実現する10万GPU分散学習の通信最適化

1
Last updated at Posted at 2026-06-11

Spectrum-X・NCCL・GPUDirectで実現する10万GPU分散学習の通信最適化

大規模言語モデル(LLM)の学習において、GPU間の通信がボトルネックになるケースが増えています。128GPUから2,048GPUへスケールした際にスループットが37%低下したという報告もあり、GPU数を増やせば速くなるという単純な話ではなくなっています。

この記事では、NVIDIA Spectrum-X Ethernetプラットフォーム、NCCL(NVIDIA Collective Communications Library)、GPUDirect RDMAの3つの技術を軸に、10万GPU規模のクラスタで分散学習の通信を最適化する手法を解説します。xAI Colossusの事例では、Spectrum-Xにより95%のデータスループットを達成しており、標準Ethernetの60%と比較して大幅な改善が報告されています。

この記事でわかること

  • Spectrum-X Ethernetのマルチプレーン・アーキテクチャが10万GPU超のスケーリングを実現する仕組み
  • NCCL 2.27のSymmetric MemoryとDirect NICがもたらす通信レイテンシ削減の具体的な効果
  • GPUDirect RDMAによるゼロコピー転送の動作原理と設定方法
  • Ring/Tree AllReduceアルゴリズムの使い分けとNCCLの自動選択ロジック
  • 3D並列化(TP+PP+DP)におけるネットワーク階層と通信パターンの最適配置

対象読者

  • 想定読者: 分散学習の通信最適化に取り組むMLE(Machine Learning Engineer)
  • 必要な前提知識:
    • PyTorch DistributedDataParallel(DDP)の基本的な使い方
    • AllReduceなどのCollective Communicationの基礎概念
    • TCP/IPネットワーキングの基礎知識(RDMAやRoCEは本記事で解説)

結論・成果

Spectrum-X + NCCL + GPUDirectの3層スタックを適切に構成することで、以下の成果が報告されています。

  • スループット: 標準Ethernet比で1.6倍のネットワーク性能(NVIDIA公式
  • 有効帯域幅: 10万GPU規模で**95%**のデータスループット維持(xAI Colossus事例
  • レイテンシ: NCCL 2.27 Symmetric Memoryで小メッセージの最大9倍削減NCCL 2.27ブログ
  • GPU SM使用量: SHARP対応で集合通信のSM消費が16→6(2.7倍削減)(同上)
  • 構築期間: xAI Colossusは122日で10万GPU規模のクラスタを構築(通常は数か月〜数年)

Spectrum-Xアーキテクチャを理解する

なぜEthernetがInfiniBandに対抗できるのか

従来、大規模GPU間通信はInfiniBandが主流でした。Ethernetはコスト面で有利ですが、パケットロスや輻輳制御の問題から、標準構成では60%程度のスループットしか得られませんでした。

Spectrum-Xは、InfiniBandで培われた技術をEthernetに移植することで、この課題を解決しています。具体的には以下の3つの技術が核となります。

技術 機能 効果
RoCEアダプティブルーティング パケット単位で最小負荷のパスを動的選択 フロー衝突ゼロ
NVIDIA輻輳制御(NCC) 標準DCQCNより高速な輻輳検知・反応 マイクロ秒精度の帯域制御
パフォーマンス分離 テナント間のトラフィック干渉を排除 マルチテナント環境で安定性維持

NVIDIA公式ブログによると、Spectrum-4スイッチはパケット単位でリアルタイムにポートの混雑状況を監視し、最も空いているパスにトラフィックを振り分けます。受信側のSuperNICは、到着順序が入れ替わったパケットを正しい順序に並べ替えてアプリケーションに渡すため、アダプティブルーティングはアプリケーションから透過的に動作します。

注意点:

RoCEアダプティブルーティングはSpectrum-4スイッチとConnectX-7以降のSuperNICの組み合わせでのみ動作します。既存のConnectX-6環境ではこの機能は利用できないため、スイッチとNICの両方をアップグレードする必要があります。

マルチプレーン・トポロジで128K GPUへスケーリングする

単一ネットワークプレーンでは、Ethernetの2層(Leaf-Spine)トポロジのスケーリングは約2,000GPU程度が限界です。Spectrum-Xのマルチプレーン・アーキテクチャは、この制約を根本的に解決します。

仕組みは以下のとおりです。

  1. ポート分割: 各GPUのSuperNICポートを2つ以上の独立したネットワークプレーンに分割
  2. 独立ファブリック: 各プレーンは完全に独立した障害ドメインとして動作
  3. ハードウェアロードバランシング: プレーン間でトラフィックを自動分散

NVIDIA公式によると、この構成により2層トポロジで最大128K GPUへの接続が可能です。これは単一プレーンの64倍のスケーリングに相当します。

よくある間違い: マルチプレーンを「単にLAG(Link Aggregation)を増やすこと」と混同するケースがあります。LAGは同一スイッチへの複数リンクを束ねるのに対し、マルチプレーンは完全に独立したネットワークファブリックを構成します。障害ドメインの分離という点で本質的に異なります。

Spectrum-X Photonics: 次世代スイッチSN6800

2026年後半に出荷が予定されているSN6800スイッチは、コパッケージド・シリコンフォトニクスを採用し、従来のプラガブルトランシーバー方式と比較して大幅な改善を実現します。

項目 SN5600(現行) SN6800(次世代)
総帯域幅 51.2 Tb/s 409.6 Tb/s
ポート構成 64×800Gb/s 512×800Gb/s
光学方式 プラガブル コパッケージドフォトニクス
電力効率 基準 1.6Tb/sポートあたり5倍改善
AI稼働時間 基準 5倍長いリンクフラップフリー

NVIDIAテクニカルブログによると、コパッケージド方式では光エンジンをスイッチパッケージ内に直接統合し、従来の4分の1のレーザー数で動作します。結果として信号品質が63倍向上し、ネットワーク全体の耐障害性は10倍に達するとされています。

制約条件: SN6800は2026年後半出荷予定のため、現時点ではSN5600での構築が現実的です。また、コパッケージドフォトニクスは既存のファイバーインフラとの互換性確認が必要です。

NCCL 2.27の通信最適化を実装する

NCCLの集合通信アルゴリズムを理解する

NCCLは分散学習における集合通信(AllReduce、AllGather、ReduceScatterなど)の標準ライブラリです。内部では、メッセージサイズとGPUトポロジに応じてRingTreeの2つのアルゴリズムを自動的に切り替えます。

アルゴリズム レイテンシ 帯域効率 適用場面
Ring O(N)(GPU数に線形) 約100% 大きなメッセージ(勾配集約)
Tree O(log N)(対数) 約95% 小さなメッセージ(パラメータ同期)

Tree AllReduceはDouble Binary Treeと呼ばれる構造を採用しています。NVIDIAのNCCL解説によると、相補的な2本の二分木を用いることで、対数的なレイテンシを維持しながらフル帯域幅を実現します。Summitスーパーコンピュータでの実験では、24,576GPUにおいてRingと比較して最大180倍のレイテンシ改善が報告されています。

以下はPyTorchでNCCLのアルゴリズム選択を制御するコード例です。

import os
import torch
import torch.distributed as dist

os.environ["NCCL_ALGO"] = "Tree"           # Tree / Ring / CollnetDirect / CollnetChain
os.environ["NCCL_PROTO"] = "LL128"         # LL / LL128 / Simple
os.environ["NCCL_TREE_THRESHOLD"] = "0"    # 常にTreeを使用(デフォルトはサイズ依存)
os.environ["NCCL_NCHANNELS_PER_PEER"] = "4"

dist.init_process_group(backend="nccl")

local_rank = int(os.environ["LOCAL_RANK"])
device = torch.device(f"cuda:{local_rank}")
torch.cuda.set_device(device)

tensor = torch.randn(1024, 1024, device=device)
dist.all_reduce(tensor, op=dist.ReduceOp.SUM)

print(f"Rank {dist.get_rank()}: AllReduce completed, shape={tensor.shape}")

dist.destroy_process_group()

なぜこの設定を選んだか:

  • NCCL_ALGO=Tree: 小メッセージの勾配同期ではレイテンシが支配的なため、対数スケーリングのTreeが有利
  • NCCL_PROTO=LL128: 128Bのメッセージをfuse-readで高速に処理するプロトコル。NVLink環境で効果が高い
  • 多くの場合、デフォルトの自動選択が最適であり、手動設定は性能プロファイリング後に検討すべき

Symmetric Memoryで小メッセージのレイテンシを9倍削減する

NCCL 2.27で導入されたSymmetric Memoryは、全GPU間で同一の仮想アドレスにバッファを配置する機能です。これにより、アドレス変換のオーバーヘッドが削減され、最適化されたカーネルが利用可能になります。

import ctypes
import torch
import torch.distributed as dist

os.environ["NCCL_SYMMETRIC_MEMORY"] = "1"

dist.init_process_group(backend="nccl")

local_rank = int(os.environ["LOCAL_RANK"])
device = torch.device(f"cuda:{local_rank}")
torch.cuda.set_device(device)

small_tensor = torch.randn(64, device=device)  # 小メッセージ(256B)
dist.all_reduce(small_tensor, op=dist.ReduceOp.SUM)

medium_tensor = torch.randn(256, 256, device=device)  # 中メッセージ(256KB)
dist.all_reduce(medium_tensor, op=dist.ReduceOp.SUM)

dist.destroy_process_group()

NCCL 2.27ブログによると、効果は以下のとおりです。

メッセージサイズ レイテンシ改善 対象プラットフォーム
小(〜数KB) 最大9倍削減 全NVLinkプラットフォーム
小〜中 2.5倍高速化 NVL8ドメイン
FP8演算 FP16アキュムレータ NVLink Switchシステム

ハマりポイント: Symmetric Memoryはユーザーが事前にバッファをncclCommWindowRegister()で登録する必要があり、PyTorchの標準的なDDP使用では自動的には有効になりません。フレームワーク側の対応状況を確認してください。

Direct NICでPCIeボトルネックを回避する

Grace Blackwellプラットフォームでは、GPUはPCIe Gen6 x16(800Gb/s)をサポートしますが、Grace CPUはPCIe Gen5(400Gb/s)までの対応です。従来のアーキテクチャではNICへの通信がCPUを経由するため、CPUのPCIe帯域がボトルネックになります。

NCCL 2.27のDirect NIC機能は、GPUとNIC(CX8)を直接PCIe Gen6で接続する構成を可能にします。

Direct NIC構成では、GPUとNICが独立したPCIeツリーで接続され、CPUを経由せずに800Gb/sのフルネットワーク帯域を利用できます。これはGPUDirect RDMAの効果を最大化する上で不可欠です。

注意点:

Direct NIC構成はGrace Blackwell(GB200/GB300)プラットフォーム固有の機能です。HopperベースのDGX H100ではPCIeトポロジが異なるため、この構成は適用できません。

GPUDirect RDMAでゼロコピー転送を実現する

GPUDirect技術の全体像

GPUDirectはNVIDIAのGPUメモリ直接アクセス技術群の総称です。分散学習の通信最適化においては、主に3つの技術が関連します。

技術 概要 用途
GPUDirect P2P 同一ノード内のGPU間でPCIe経由の直接転送 ノード内通信
GPUDirect RDMA NICからGPUメモリへ直接DMA ノード間通信
GPUDirect Storage ストレージからGPUメモリへ直接DMA チェックポイント読み込み

GPUDirect RDMAの動作原理

通常のGPU間通信では、データがGPUメモリ→CPU メモリ(バウンスバッファ)→NIC→ネットワーク→NIC→CPUメモリ→GPUメモリという経路を辿ります。GPUDirect RDMAはCPUメモリのバウンスバッファを排除し、NICがGPUメモリに直接アクセスします。

NVIDIA GPUDirect公式ドキュメントによると、これによりレイテンシが削減され、CPU負荷も大幅に低減されます。

以下はNCCLでGPUDirect RDMAを有効化する設定例です。

#!/bin/bash
# GPUDirect RDMA環境変数設定

# GPUDirect RDMAを有効化
export NCCL_NET_GDR_LEVEL=SYS      # NUMAノード境界を越えてGDRを使用
export NCCL_NET_GDR_READ=1          # NICからのGPUメモリ読み取りにGDRを使用

# GPUDirect RDMA利用時のNICアフィニティ設定
export NCCL_IB_HCA="mlx5_0:1"      # 使用するHCA(InfiniBand/RoCE NIC)を指定
export NCCL_SOCKET_IFNAME=eth0      # 制御通信用インターフェース

# バッファサイズ調整
export NCCL_BUFFSIZE=8388608        # 8MB(デフォルト4MB)

# デバッグ(問題切り分け時に有効化)
# export NCCL_DEBUG=INFO
# export NCCL_DEBUG_SUBSYS=INIT,NET

echo "NCCL GPUDirect RDMA configuration:"
echo "  GDR_LEVEL: $NCCL_NET_GDR_LEVEL"
echo "  GDR_READ:  $NCCL_NET_GDR_READ"
echo "  IB_HCA:    $NCCL_IB_HCA"

NCCL_NET_GDR_LEVELの各レベルの意味を整理します。

レベル 動作 使用場面
LOC GDR無効 デバッグ時
PIX GPU/NICが同一PCIスイッチ上 最低レイテンシ
PXB PCIスイッチを跨ぐ(複数ホップ可) DGX内の一般的構成
PHB 同一NUMAノード内、CPU経由 NUMA境界を意識した構成
SYS NUMAノード境界を越えて常に有効 最大帯域が必要な場合

トレードオフ: SYSは最大の帯域を得られますが、NUMAをまたぐ通信ではレイテンシが増加する場合があります。プロファイリングで確認し、ノードのPCIeトポロジに応じてPXBPHBを選択する方が良いケースもあります。

IBGDA: GPU主導の通信でCPUを完全バイパスする

GPUDirect Asyncの進化系として、IBGDA(InfiniBand GPUDirect Async)トランスポートが登場しました。従来のGPUDirect RDMAではCPUがNICへの通信発行を仲介していましたが、IBGDAではGPUが直接NICに対して通信命令を発行します。

# NVSHMEMでIBGDA transportを使用する例
import os

# IBGDAの有効化(NVSHMEM 2.7.0以降)
os.environ["NVSHMEM_TRANSPORT"] = "ibgda"
os.environ["NVSHMEM_IBGDA_NUM_DCI"] = "4"    # DCIストリーム数

# CUDAカーネル内から直接リモートGPUメモリにアクセス可能
# nvshmem_float_put_nbi(dest, source, nelems, pe)
# → GPUスレッドがNICに直接通信を発行、CPUプロキシ不要

IBGDAの主な利点は、CPUプロキシスレッドが不要になることで、GPU↔NIC間のレイテンシが大幅に削減される点です。特にFine-grainedな通信パターン(Tensor Parallelismのactivation転送など)で効果を発揮します。

制約条件: IBGDAはNVSHMEM 2.7.0以降で利用可能です。NCCLの標準APIからは直接利用できないため、NVSHMEMベースの独自通信カーネルを実装する必要があります。一般的なPyTorch DDPやDeepSpeedユーザーには現時点で直接的な恩恵はありません。

3D並列化における通信パターンを最適配置する

並列化戦略と通信パターンの対応

10万GPU規模の学習では、単一の並列化戦略では対応できません。3D並列化(Tensor Parallelism + Pipeline Parallelism + Data Parallelism)を組み合わせ、ネットワーク階層に応じて通信パターンを適切に配置します。

並列化 通信パターン 頻度 メッセージサイズ 最適配置
Tensor AllReduce(各レイヤー後) 極めて高い 小〜中 ノード内(NVLink)
Pipeline P2P send/recv 中程度 中(activation) ラック内(Spectrum-X)
Data AllReduce(ステップ末尾) 低い 大(全勾配) ラック間(Multiplane)

実装例: Megatron-LMでの3D並列化設定

以下はMegatron-LMで3D並列化を構成する際のコマンド例です。

#!/bin/bash
# Megatron-LM 3D並列化設定例
# 想定: 8GPU/ノード × 128ノード = 1024GPU

TP=8        # Tensor Parallelism: ノード内8GPU(NVLink接続)
PP=16       # Pipeline Parallelism: 16ステージ(ラック内)
DP=8        # Data Parallelism: 8レプリカ(ラック間)
# 合計: 8 × 16 × 8 = 1024 GPU

WORLD_SIZE=$((TP * PP * DP))

torchrun \
  --nproc_per_node=$TP \
  --nnodes=$((PP * DP)) \
  --node_rank=$NODE_RANK \
  --master_addr=$MASTER_ADDR \
  --master_port=29500 \
  pretrain_gpt.py \
    --tensor-model-parallel-size $TP \
    --pipeline-model-parallel-size $PP \
    --distributed-backend nccl \
    --use-distributed-optimizer \
    --overlap-grad-reduce \
    --overlap-param-gather \
    --sequence-parallel \
    --num-layers 128 \
    --hidden-size 12288 \
    --num-attention-heads 96 \
    --micro-batch-size 1 \
    --global-batch-size $((DP * 8))

なぜこの構成を選んだか:

  • TP=8(ノード内): NVLinkの900GB/s帯域を最大活用。TPは各レイヤー後にAllReduceが必要なため、最高帯域の接続が必須
  • PP=16(ラック内): Pipeline Parallelismの通信はP2P(Point-to-Point)で比較的軽量。Spectrum-Xの800Gb/sで十分対応可能
  • --overlap-grad-reduce: 勾配のReduceを計算とオーバーラップさせ、通信を隠蔽
  • --sequence-parallel: Sequence方向の並列化でactivationメモリを削減

NCCL SHARPでネットワーク内演算を活用する

NCCL 2.27で強化されたSHARP(Scalable Hierarchical Aggregation and Reduction Protocol)は、集合通信の演算をスイッチ内で実行することで、ネットワークトラフィックを削減します。

import os

# SHARP有効化(InfiniBand/NVLink Switch環境)
os.environ["NCCL_COLLNET_ENABLE"] = "1"
os.environ["NCCL_ALGO"] = "CollnetDirect"  # SHARP直接方式

# SHARP使用時のSM消費量: 16 → 6(2.7倍削減)
# 削減されたSMを計算に回すことで、training throughputが向上

NCCL 2.27ブログによると、SHARPにより集合通信に必要なGPU SM(Streaming Multiprocessor)の使用量が16から6に削減されます。削減された10 SMを計算に回すことで、特に1,000GPU以上の大規模学習でtraining throughputの向上が期待できます。

トレードオフ: SHARPはネットワークスイッチ側のリソースを消費するため、スイッチの帯域・バッファが逼迫している環境では逆効果になる可能性があります。また、SHARPはInfiniBandとNVLink Switchでサポートされていますが、RoCE/Ethernet環境での対応は限定的です。

よくある問題と解決方法

問題 原因 解決方法
AllReduceでスループットが出ない GDRが無効、またはGDR_LEVELが低い NCCL_NET_GDR_LEVEL=SYSを設定し、NCCL_DEBUG=INFOでGDR使用を確認
128GPU超でレイテンシが急増 Ringアルゴリズムの線形スケーリング NCCL_ALGO=Treeを試す、またはNCCLの自動選択に任せる
パケットロスでtraining loss急上昇 Ethernet輻輳制御の不備 PFC/ECN/NCCの適切な設定、Spectrum-Xのアダプティブルーティング有効化
GPUメモリ不足で通信バッファ確保失敗 NCCL_BUFFSIZEが大きすぎる バッファサイズを段階的に削減(8MB→4MB→2MB)
マルチノードで一部ノードが遅延 Straggler問題 NCCL 2.27のncclCommShrinkで障害ノードを動的除外
RoCEアダプティブルーティングが動作しない NIC/スイッチの組み合わせが非対応 ConnectX-7以降 + Spectrum-4スイッチの組み合わせを確認

まとめと次のステップ

まとめ:

  • Spectrum-X Ethernetは、RoCEアダプティブルーティングとNVIDIA輻輳制御により、10万GPU規模で95%のスループットを実現する。マルチプレーン・トポロジで最大128K GPUまでスケーリング可能
  • NCCL 2.27は、Symmetric Memoryで小メッセージの最大9倍のレイテンシ削減、Direct NICで800Gb/sのフル帯域、SHARPでSM使用量2.7倍削減を達成
  • GPUDirect RDMAはCPUバウンスバッファを排除するゼロコピー転送で、ノード間通信のレイテンシとCPU負荷を大幅に削減
  • 3D並列化では、TP(ノード内NVLink)→PP(ラック内Spectrum-X)→DP(ラック間Multiplane)の階層配置が通信最適化の基本

次にやるべきこと:

  1. NCCL_DEBUG=INFOでプロファイリングを実行し、現在のGDR有効状態とアルゴリズム選択を確認する
  2. NCCLのバージョンを2.27以降に更新し、Symmetric MemoryとDirect NIC(対応ハードウェアの場合)を試す
  3. 100GPU以上の環境ではNCCL_ALGO=Treeの効果を計測し、デフォルトの自動選択と比較する

参考


注意: この記事はAI(Claude Code)により自動生成されました。内容の正確性については複数の情報源で検証していますが、実際の利用時は公式ドキュメントもご確認ください。

1
0
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?