PyTorchやJAXで複数のGPUを使って深層学習を高速化したいとき、必ず登場するのがNCCL(NVIDIA Collective Communications Library)です。「マルチGPUにしたのに速くならない」「AllReduceのエラーが出る」といった詰まりポイントの多くは、NCCLの設定ミスや環境の不整合が原因です。
本記事では Ubuntu 24.04 LTS 上でNCCLをセットアップし、nccl-tests の allreduce_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)が得られる
目次
- NCCLとは何か?分散学習における役割
- 前提環境と確認コマンド
- 手順1:NVIDIA CUDAリポジトリの追加
- 手順2:NCCL・OpenMPI のインストール
- 手順3:nccl-tests のビルド
- 手順4:バンド幅テスト(allreduce_perf)の実行
- 手順5:PyTorch DDP との連携確認
- よくあるエラーと解決策
- まとめ
NCCLとは何か?分散学習における役割
NCCL(エヌシーシーエル)はNVIDIAが開発したGPU間通信のためのライブラリです。深層学習の分散学習では、複数のGPUが並列に計算した勾配を集約(AllReduce)して全GPUに配布する処理が必要です。NCCLはこの通信を自動的に最適化し、NVLink・PCIe・InfiniBandなど接続方式に応じて最速のアルゴリズムを選択してくれます。
PyTorchの DistributedDataParallel(DDP)、DeepSpeed、Horovodなど、現代の分散学習フレームワークはほぼすべてNCCLをバックエンドに使っています。「マルチGPUがシングルGPUとほぼ同じ速度」という場合、多くはNCCLが正しく動作していないか、通信がボトルネックになっています。


前提環境と確認コマンド
本記事の手順は以下の環境で検証しています。
| 項目 | バージョン・値 | 備考 |
|---|---|---|
| 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 実行に必要 |
まず現在の環境を確認します。
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 を使った学習では公式リポジトリからのインストールを推奨します。

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
手順2:NCCL・OpenMPI のインストール
CUDAリポジトリを追加したら、NCCL本体とOpenMPIをインストールします。マルチノード分散学習には OpenMPI も必要です。

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
インストール後、ライブラリが正しく認識されているか確認します。
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 からソースをダウンロードしてビルドする必要があります。
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)
$ ./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 程度が典型値です。

②マルチノード(複数マシン間)
$ 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の簡単なテストで確認します。
NCCL available: True
$ python3 -c “import torch; print(‘NCCL version:’, torch.cuda.nccl.version())”
NCCL version: (2, 18, 5)
DDPで実際に分散学習を試すシンプルなスクリプトです。
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 になれば成功

よくあるエラーと解決策
①NCCL WARN Connect to bootstrap net failed
マルチノード実行時にネットワークインターフェースが正しく設定されていない場合に発生します。NCCL_SOCKET_IFNAME 環境変数でNICを指定してください。
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ツールキットのバージョンが合っていない場合に発生します。
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スロットの帯域が制限されている可能性があります。以下で確認できます。
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 # 詳細ログで通信経路を確認

まとめ
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が効率的です。



コメント