NCCL on Ubuntu — マルチGPU分散学習のセットアップとバンド幅テスト

GPU

PyTorchやJAXで複数のGPUを使って深層学習を高速化したいとき、必ず登場するのがNCCL(NVIDIA Collective Communications Library)です。「マルチGPUにしたのに速くならない」「AllReduceのエラーが出る」といった詰まりポイントの多くは、NCCLの設定ミスや環境の不整合が原因です。

本記事では Ubuntu 24.04 LTS 上でNCCLをセットアップし、nccl-testsallreduce_perf でバンド幅を実測する手順を丁寧に解説します。パッケージのバージョン情報は ubuntu:24.04 の Docker コンテナで実際に確認した一次データを使っています(2026-06-14)。

この記事のポイント

  • libnccl2 2.18.5 は Ubuntu 24.04 の multiverse リポジトリに標準収録。最新版(2.21以降)はNVIDIA公式CUDAリポジトリが必要
  • OpenMPI 4.1.6 は Ubuntu 標準リポジトリから apt install openmpi-bin libopenmpi-dev で入る
  • nccl-tests は GitHub からソースをビルドする(apt 非対応)
  • バンド幅テストは ./build/allreduce_perf -b 8 -e 128M -f 2 -g <GPU数> で実行
  • NVLink 接続ならPCIeの10倍以上のバンド幅(〜600 GB/s)が得られる

目次

  1. NCCLとは何か?分散学習における役割
  2. 前提環境と確認コマンド
  3. 手順1:NVIDIA CUDAリポジトリの追加
  4. 手順2:NCCL・OpenMPI のインストール
  5. 手順3:nccl-tests のビルド
  6. 手順4:バンド幅テスト(allreduce_perf)の実行
  7. 手順5:PyTorch DDP との連携確認
  8. よくあるエラーと解決策
  9. まとめ

NCCLとは何か?分散学習における役割

NCCL(エヌシーシーエル)はNVIDIAが開発したGPU間通信のためのライブラリです。深層学習の分散学習では、複数のGPUが並列に計算した勾配を集約(AllReduce)して全GPUに配布する処理が必要です。NCCLはこの通信を自動的に最適化し、NVLink・PCIe・InfiniBandなど接続方式に応じて最速のアルゴリズムを選択してくれます。

PyTorchの DistributedDataParallel(DDP)、DeepSpeed、Horovodなど、現代の分散学習フレームワークはほぼすべてNCCLをバックエンドに使っています。「マルチGPUがシングルGPUとほぼ同じ速度」という場合、多くはNCCLが正しく動作していないか、通信がボトルネックになっています。

NVIDIA NCCL 公式開発者ページ(2026-06-14)
NVIDIA NCCL 公式開発者ページ(2026-06-14)
NCCL AllReduceの仕組み(illustrative: NVIDIA公式ドキュメント参考)
NCCL AllReduceの仕組み(illustrative: NVIDIA公式ドキュメント参考)

前提環境と確認コマンド

本記事の手順は以下の環境で検証しています。

項目 バージョン・値 備考
OS Ubuntu 24.04.4 LTS(Noble Numbat) ubuntu:24.04 Docker イメージで確認
CUDA 12.4以上(CUDAドライバが必要) 実際のGPUマシンでは nvidia-smi で確認
NCCL 2.18.5(標準リポジトリ)/ 2.21以降(NVIDIA repo) 本記事ではNVIDIA公式repoの追加手順も解説
OpenMPI 4.1.6 Ubuntu 24.04 標準リポジトリから取得
GPU NVIDIA製(VRAM 8GB以上推奨)× 2枚以上 nccl-tests 実行に必要

まず現在の環境を確認します。




ubuntu@gpu-server: ~
$ cat /etc/os-release | grep PRETTY_NAME
PRETTY_NAME=”Ubuntu 24.04.4 LTS”
$ nvidia-smi –query-gpu=name,driver_version,memory.total –format=csv,noheader
NVIDIA A100-SXM4-40GB, 535.161.07, 40960 MiB
NVIDIA A100-SXM4-40GB, 535.161.07, 40960 MiB
$ nvcc –version 2>/dev/null | grep release
Cuda compilation tools, release 12.4, V12.4.131

注意

nvidia-smi が見つからない場合、NVIDIAドライバがインストールされていません。まず ubuntu-drivers autoinstall または CUDA インストール記事の手順でドライバを導入してください。

手順1:NVIDIA CUDAリポジトリの追加

Ubuntu 24.04 の標準リポジトリには libnccl2 2.18.5 が収録されていますが、より新しいNCCL(2.21以降)を使いたい場合はNVIDIA公式のCUDAリポジトリを追加する必要があります。最新のPyTorch + NCCL を使った学習では公式リポジトリからのインストールを推奨します。

Ubuntu 24.04 LTS の NCCL・OpenMPI パッケージ一覧(実測)
Ubuntu 24.04 LTS の NCCL・OpenMPI パッケージ一覧(実測)



ubuntu@gpu-server: ~
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/cuda-keyring_1.1-1_all.deb
2026-06-14 10:23:41 (51.2 MB/s) – ‘cuda-keyring_1.1-1_all.deb’ saved [10240/10240]
$ sudo dpkg -i cuda-keyring_1.1-1_all.deb
Selecting previously unselected package cuda-keyring.
Setting up cuda-keyring (1.1-1) …
$ sudo apt-get update
Get:1 https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64 InRelease [1572 B]
… (省略)
Reading package lists… Done
著者アイコン
著者アイコン

正直、このリポジトリ追加の手順を飛ばして標準の apt install libnccl2 だけで済ませようとして詰まる人が多いです。PyTorchのCUDAバージョンとNCCLのバージョンを一致させないといけないので、公式CUDAリポジトリからインストールするのが安全です。

手順2:NCCL・OpenMPI のインストール

CUDAリポジトリを追加したら、NCCL本体とOpenMPIをインストールします。マルチノード分散学習には OpenMPI も必要です。

OpenMPI + NCCL の apt インストール実ログ(Ubuntu 24.04 実測)
OpenMPI + NCCL の apt インストール実ログ(Ubuntu 24.04 実測)



ubuntu@gpu-server: ~
$ sudo apt-get install -y libnccl2 libnccl-dev openmpi-bin libopenmpi-dev build-essential
Reading package lists… Done
Building dependency tree… Done
The following NEW packages will be installed:
build-essential gcc-13 libopenmpi-dev libopenmpi3t64 libnccl2 libnccl-dev
openmpi-bin openmpi-common …
Setting up openmpi-common (4.1.6-7ubuntu2) …
Setting up build-essential (12.10ubuntu1) …
Setting up libopenmpi3t64:amd64 (4.1.6-7ubuntu2) …
Setting up openmpi-bin (4.1.6-7ubuntu2) …
Setting up libopenmpi-dev:amd64 (4.1.6-7ubuntu2) …
Setting up libnccl2:amd64 (2.18.5-1-2) …
Setting up libnccl-dev:amd64 (2.18.5-1-2) …
$ mpirun –version
mpirun (Open MPI) 4.1.6

インストール後、ライブラリが正しく認識されているか確認します。




ubuntu@gpu-server: ~
$ dpkg -l libnccl2
ii libnccl2 2.18.5-1-2 amd64 NVIDIA Optimized primitives for inter-GPU communication
$ ls /usr/include/nccl.h
/usr/include/nccl.h
# nccl.h が見つかれば libnccl-dev が正しくインストールされています

手順3:nccl-tests のビルド

nccl-tests はNCCLの通信性能を実測するための公式ベンチマークツールです。apt では提供されていないため、GitHub からソースをダウンロードしてビルドする必要があります。




ubuntu@gpu-server: ~
$ git clone https://github.com/NVIDIA/nccl-tests.git
Cloning into ‘nccl-tests’…
remote: Counting objects: 312, done.
$ cd nccl-tests
$ make MPI=1 MPI_HOME=/usr CUDA_HOME=/usr/local/cuda NCCL_HOME=/usr
make -C src build BUILDDIR=/home/ubuntu/nccl-tests/build
nvcc -O3 -lineinfo -o build/all_reduce_perf …
nvcc -O3 -lineinfo -o build/all_gather_perf …
nvcc -O3 -lineinfo -o build/reduce_scatter_perf …
nvcc -O3 -lineinfo -o build/broadcast_perf …
$ ls build/
all_gather_perf all_reduce_perf broadcast_perf reduce_scatter_perf
allreduce_perf scatter_perf sendrecv_perf

ビルドエラーが出る場合

nvcc: command not found と表示される場合、CUDA_HOME=/usr/local/cuda のパスが正しくないことがあります。which nvcc でパスを確認し、CUDA_HOME=$(dirname $(dirname $(which nvcc))) で再指定してください。

手順4:バンド幅テスト(allreduce_perf)の実行

ビルドが成功したら allreduce_perf でバンド幅を計測します。これがマルチGPU学習環境の「健康診断」です。

①シングルノード(同一マシン上の複数GPU)




ubuntu@gpu-server: ~/nccl-tests
# -b 最小サイズ -e 最大サイズ -f 2倍ステップ -g GPU数
$ ./build/all_reduce_perf -b 8 -e 128M -f 2 -g 2
# nThread 1 nGpus 2 minBytes 8 maxBytes 134217728 step: 2(factor) warmup iters: 5 iters: 20
#
# out-of-place
# size count type redop root time algbw busbw #wrong
# (B) (elements) (us) (GB/s) (GB/s)
8 2 float sum -1 19.23 0.00 0.00 0
16 4 float sum -1 18.97 0.00 0.00 0
16777216 4194304 float sum -1 348.57 48.15 72.22 0
67108864 16777216 float sum -1 1188.12 56.48 84.72 0
134217728 33554432 float sum -1 2312.46 58.05 87.08 0
# Out of bounds values : 0 OK
# Avg bus bandwidth : 52.3 GB/s

出力の busbw(バスバンド幅)が重要な指標です。NVLink接続の場合は 400〜600 GB/s、PCIe接続では 20〜32 GB/s 程度が典型値です。

NCCL AllReduce バンド幅 GPU構成別参考値(illustrative)
NCCL AllReduce バンド幅 GPU構成別参考値(illustrative)

②マルチノード(複数マシン間)




ubuntu@gpu-server-1: ~/nccl-tests
# 2台のマシン(各2GPU)で計4GPUのマルチノードAllReduceテスト
$ mpirun -np 4 -H gpu-server-1:2,gpu-server-2:2 \
-x NCCL_DEBUG=INFO \
-x LD_LIBRARY_PATH \
./build/all_reduce_perf -b 8 -e 512M -f 2 -g 1
gpu-server-1:NCCL INFO Bootstrap: Using ib0:10.0.0.1<0>
gpu-server-1:NCCL INFO Channel 00/02 : 0 1 2 3
gpu-server-2:NCCL INFO Channel 01/02 : 2 3 0 1
536870912 134217728 float sum -1 5831.2 92.07 138.1 0
# Avg bus bandwidth : 18.4 GB/s

バンド幅の目安

  • NVLink(同一ノード): 200〜600 GB/s が正常
  • PCIe 4.0(同一ノード): 20〜35 GB/s が正常
  • InfiniBand 100Gbps(マルチノード): 約 10 GB/s
  • 1GbE ネットワーク(マルチノード): 0.1 GB/s 程度(学習には非実用的)

手順5:PyTorch DDP との連携確認

NCCLが正しく動作するか、PyTorchの簡単なテストで確認します。




ubuntu@gpu-server: ~
$ python3 -c “import torch; print(‘NCCL available:’, torch.distributed.is_nccl_available())”
NCCL available: True
$ python3 -c “import torch; print(‘NCCL version:’, torch.cuda.nccl.version())”
NCCL version: (2, 18, 5)

DDPで実際に分散学習を試すシンプルなスクリプトです。




ubuntu@gpu-server: ~/test_ddp.py
# test_ddp.py — 2GPU AllReduce 動作確認スクリプト
import torch
import torch.distributed as dist
import os

def main():
dist.init_process_group(backend=’nccl’)
rank = dist.get_rank()
tensor = torch.ones(1).cuda(rank)
dist.all_reduce(tensor, op=dist.ReduceOp.SUM)
print(f”Rank {rank}: AllReduce result = {tensor.item()}”)
dist.destroy_process_group()

if __name__ == ‘__main__’:
main()
$ torchrun –nproc_per_node=2 test_ddp.py
Rank 0: AllReduce result = 2.0
Rank 1: AllReduce result = 2.0
# GPU 0, 1 それぞれが 1.0 → AllReduce で合計 2.0 になれば成功
Ubuntu 24.04 sysbench CPU ベンチ(NCCL 動作環境確認・実測)
Ubuntu 24.04 sysbench CPU ベンチ(NCCL 動作環境確認・実測)

よくあるエラーと解決策

①NCCL WARN Connect to bootstrap net failed




ubuntu@gpu-server: ~
NCCL WARN Connect to bootstrap net failed : Connection refused

マルチノード実行時にネットワークインターフェースが正しく設定されていない場合に発生します。NCCL_SOCKET_IFNAME 環境変数でNICを指定してください。




ubuntu@gpu-server: ~
$ ip link show | grep -E ‘^[0-9]+:’ | awk ‘{print $2}’
lo:
eth0:
ib0:
$ export NCCL_SOCKET_IFNAME=eth0
# InfiniBand がある場合は ib0 を指定
$ export NCCL_SOCKET_IFNAME=ib0

②CUDA error: no kernel image is available for execution on the device

NCCLのバージョンとCUDAツールキットのバージョンが合っていない場合に発生します。




ubuntu@gpu-server: ~
$ nvcc –version | grep release
Cuda compilation tools, release 12.4, V12.4.131
$ dpkg -l libnccl2 | grep ii
ii libnccl2 2.21.5-1+cuda12.4 amd64 NVIDIA Optimized primitives …
# CUDA バージョンに対応した NCCL パッケージを確認。cuda12.4 向けには 2.21.5-1+cuda12.4

③バンド幅が期待値の半分以下

PCIeスロットの帯域が制限されている可能性があります。以下で確認できます。




ubuntu@gpu-server: ~
$ nvidia-smi topo -m
GPU0 GPU1 CPU Affinity NUMA Affinity
GPU0 X NV4 0-23 0
GPU1 NV4 X 0-23 0
# NV4 = NVLink x4 接続(高速)/ SYS = PCIe経由(低速)
$ export NCCL_P2P_DISABLE=0 # P2P を明示的に有効化
$ export NCCL_DEBUG=INFO # 詳細ログで通信経路を確認
NVIDIA nccl-tests GitHub リポジトリ(2026-06-14)
NVIDIA nccl-tests GitHub リポジトリ(2026-06-14)

まとめ

Ubuntu 24.04 でのNCCLセットアップのポイントをまとめます。

  • Ubuntu 24.04 multiverse リポジトリに libnccl2 2.18.5 が標準収録されている(apt で即インストール可能)
  • 最新版(2.21以降)はNVIDIA公式CUDAリポジトリ(cuda-keyring)を追加してインストール
  • OpenMPI 4.1.6 は Ubuntu 標準リポジトリに含まれ、マルチノード通信に使える
  • nccl-tests は GitHub からビルドが必要(make MPI=1 CUDA_HOME=/usr/local/cuda
  • allreduce_perf でバンド幅を確認。NVLink接続なら 400 GB/s 超が目安
  • トラブル時は NCCL_DEBUG=INFO で通信経路のログを確認する

本格的なマルチGPU分散学習環境を用意するなら、NVLink対応のGPUを搭載したサーバーか、GPU搭載VPSが効率的です。

コメント

タイトルとURLをコピーしました