OSU Micro-Benchmarks実行方法(BM.GPU4.8/BM.GPU.A100-v2.8編)
本ドキュメントで解説する OSU Micro-Benchmarks は、GPUクラスタのノード間接続インターコネクトを介するGPUデバイスメモリ間MPI通信性能の評価を念頭に、 OpenMPI でコンパイルしたバイナリを使用して以下5種類の性能指標を計測する実行方法を解説します。
- ノード内GPUデバイスメモリ間レイテンシ
- ノード内GPUデバイスメモリ間帯域幅
- 2ノードに跨るGPUデバイスメモリ間レイテンシ
- 2ノードに跨るGPUデバイスメモリ間帯域幅
- ノード内8個のGPUを使用するNCCL Allreduce通信性能
- 2ノードに跨る16個のGPUを使用するNCCL Allreduce通信性能
本ドキュメントで OSU Micro-Benchmarks を実行するGPUクラスタは、GPUノードに8枚の NVIDIA A100 GPUを搭載するベア・メタル・シェイプ BM.GPU4.8/BM.GPU.A100-v2.8 を使用してこれを クラスタ・ネットワーク で接続しており、 OCI HPCチュートリアル集 の GPUクラスタを構築する(Ubuntu OS編) のチュートリアルに従い予め構築しておきます。
本ドキュメントは、以下の実行環境で OSU Micro-Benchmarks を実行し、
- GPUノード
- ノード数: 2
- シェイプ : BM.GPU4.8 ( NVIDIA A100 40GB SXM x 8)
- OS : Ubuntu 24.04( プラットフォーム・イメージ - Canonical-Ubuntu-24.04-2025.07.23-0 )
- ノード間接続インターコネクト
- クラスタ・ネットワーク
- リンク速度・数: 100 Gbps x 16
- OpenMPI : 5.0.8
- OSU Micro-Benchmarks : 7.5.1
2 GPU間のレイテンシと帯域幅に関して以下の性能が出ています。
測定項目 | ノード内/2ノード間 | 測定結果 |
---|---|---|
レイテンシ | ノード内 | 2.50 us |
2ノード間 | 3.89 us | |
帯域幅 | ノード内 | 279,568 MB/s |
2ノード間 | 11,962 MB/s |
以降では、以下の順に解説します。
本章は、 NVIDIA CUDA と NCCL(NVIDIA Collective Communication Library) ( NVIDIA HPC SDK に含まれる)を利用できるよう OSU Micro-Benchmarks をCUDA-awareな OpenMPI でビルドし、これを /opt/openmpi/tests/omb にインストールした後、 Environment modules にモジュール名 omb を登録します。
以下コマンドを OSU Micro-Benchmarks を実行する全てのノードのubuntuユーザで実行します。
$ mkdir ~/`hostname` && cd ~/`hostname` && wget https://mvapich.cse.ohio-state.edu/download/mvapich/osu-micro-benchmarks-7.5.1.tar.gz
$ tar -xvf ./osu-micro-benchmarks-7.5.1.tar.gz
$ module purge
$ module load nvhpc openmpi
$ cd osu-micro-benchmarks-7.5.1 && ./configure CC=mpicc CXX=mpicxx --prefix=/opt/openmpi/tests/omb --enable-cuda --with-cuda-include=/usr/local/cuda-12.9/include --with-cuda-libpath=/usr/local/cuda-12.9/lib64 --enable-ncclomb --with-nccl=/opt/nvidia/hpc_sdk/Linux_x86_64/25.7/comm_libs/nccl
次に、カレントディレクトリに作成されたファイル libtool を以下のように修正します。
$ diff libtool_org libtool
1733a1734
> export PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/25.7/compilers/bin:${PATH}
$
次に、以下コマンドを OSU Micro-Benchmarks を実行する全てのノードのubuntuユーザで実行し、 OSU Micro-Benchmarks をインストールします。
なおmakeコマンドの並列数は、当該ノードのコア数に合わせて調整します。
$ make -j 128 && sudo make install
次に、以下のファイルを /usr/share/modules/modulefiles/omb で作成します。
このファイルは、 Environment modules にモジュール名 omb を登録し、これをロードすることで OSU Micro-Benchmarks 利用環境の設定が可能になります
#%Module1.0
##
## OSU Micro-Benchmarks for OpenMPI
proc ModulesHelp { } {
puts stderr "OSU Micro-Benchmarks for OpenMPI\n"
}
module-whatis "OSU Micro-Benchmarks for OpenMPI"
set pkg_root /opt/openmpi/tests/omb/libexec/osu-micro-benchmarks
set ver 7.5.1
prepend-path PATH $pkg_root:$pkg_root/mpi/collective:$pkg_root/mpi/congestion:$pkg_root/mpi/one-sided:$pkg_root/mpi/pt2pt:$pkg_root/mpi/startup:$pkg_root/xccl/collective:$pkg_root/xccl/pt2pt
以下コマンドを対象ノードで OSU Micro-Benchmarks 実行ユーザで実行します。
ここでは、ノード内の0番GPUと1番GPU間のメッセージサイズ1バイトでのレイテンシを計測しています。
使用するGPUが0番と1番になるのは、 OSU Micro-Benchmarks がMPIプロセスを割り当てるGPUを決定する際、 OpenMPI の環境変数 OMPI_COMM_WORLD_LOCAL_RANK 環境変数と同じGPU番号とするためです。
$ module load nvhpc openmpi omb
$ mpirun -n 2 osu_latency -x 1000 -i 10000 -m 1:1 -d cuda D D
# OSU MPI-CUDA Latency Test v7.5
# Datatype: MPI_CHAR.
# Size Avg Latency(us)
1 2.50
$
以下コマンドを対象ノードで OSU Micro-Benchmarks 実行ユーザで実行します。
ここでは、ノード内の0番GPUと1番GPU間のメッセージサイズ256 MiBバイトでの帯域幅を計測しています。
使用するGPUが0番と1番になるのは、 OSU Micro-Benchmarks がMPIプロセスを割り当てるGPUを決定する際、 OpenMPI の環境変数 OMPI_COMM_WORLD_LOCAL_RANK 環境変数と同じGPU番号とするためです。
$ module load nvhpc openmpi omb
$ mpirun -n 2 osu_bw -x 10 -i 10 -m 268435456:268435456 -d cuda D D
# OSU MPI-CUDA Bandwidth Test v7.5
# Datatype: MPI_CHAR.
# Size Bandwidth (MB/s)
268435456 279568.26
$
以下コマンドを何れか1ノードで OSU Micro-Benchmarks を実行するユーザで実行します。
ここでは、2ノードの0番GPU間のメッセージサイズ1バイトでのレイテンシを計測しています。
使用するGPUが0番になるのは、 OSU Micro-Benchmarks がMPIプロセスを割り当てるGPUを決定する際、 OpenMPI の環境変数 OMPI_COMM_WORLD_LOCAL_RANK 環境変数と同じGPU番号とするためです。
$ module load nvhpc openmpi omb
$ mpirun -n 2 -N 1 -hostfile ~/hostlist.txt -x UCX_NET_DEVICES=mlx5_6:1 -x PATH -x LD_LIBRARY_PATH osu_latency -x 1000 -i 10000 -m 1:1 -d cuda D D
[inst-0d12t-ao-ub24:14174] SET UCX_NET_DEVICES=mlx5_6:1
# OSU MPI-CUDA Latency Test v7.5
# Datatype: MPI_CHAR.
# Size Avg Latency(us)
1 3.89
$
以下コマンドを何れか1ノードで OSU Micro-Benchmarks を実行するユーザで実行します。
ここでは、2ノードの0番GPU間のメッセージサイズ256 MiBバイトでの帯域幅を計測しています。
使用するGPUが0番になるのは、 OSU Micro-Benchmarks がMPIプロセスを割り当てるGPUを決定する際、 OpenMPI の環境変数 OMPI_COMM_WORLD_LOCAL_RANK 環境変数と同じGPU番号とするためです。
$ module load nvhpc openmpi omb
$ mpirun -n 2 -N 1 -hostfile ~/hostlist.txt -x UCX_NET_DEVICES=mlx5_6:1 -x PATH -x LD_LIBRARY_PATH osu_bw -x 10 -i 10 -m 268435456:268435456 -d cuda D D
[inst-0d12t-ao-ub24:16701] SET UCX_NET_DEVICES=mlx5_6:1
# OSU MPI-CUDA Bandwidth Test v7.5
# Datatype: MPI_CHAR.
# Size Bandwidth (MB/s)
268435456 11962.21
$
以下コマンドを対象ノードで OSU Micro-Benchmarks 実行ユーザで実行します。
ここでは、ノード内の8枚のGPUを使用する NCCL のAllReduce通信性能を、メッセージサイズ1 GiBバイトでの所要時間で計測しています。
$ module load nvhpc openmpi omb
$ mpirun -n 8 -x UCX_NET_DEVICES=mlx5_6:1 osu_xccl_allreduce -x 10 -i 10 -m 1073741824:1073741824 -d cuda D D
[inst-s08bb-ao-ub24:28293] SET UCX_NET_DEVICES=mlx5_6:1
#Using NCCL
#Using NCCL
#Using NCCL
#Using NCCL
#Using NCCL
#Using NCCL
#Using NCCL
#Using NCCL
# OSU NCCL-CUDA Allreduce Latency Test v7.5
# Size Avg Latency(us)
1073741824 8955.18
$
以下コマンドを何れか1ノードで OSU Micro-Benchmarks を実行するユーザで実行します。
ここでは、2ノードに跨る16枚のGPUを使用する NCCL のAllReduce通信性能を、メッセージサイズ1 GiBバイトでの所要時間で計測しています。
$ module load openmpi
$ mpirun -n 16 -N 8 -hostfile ~/hostlist.txt -x UCX_NET_DEVICES=mlx5_6:1 -x PATH -x LD_LIBRARY_PATH osu_xccl_allreduce -x 10 -i 10 -m 1073741824:1073741824 -d cuda D D
[inst-s08bb-ao-ub24:28899] SET UCX_NET_DEVICES=mlx5_6:1
#Using NCCL
#Using NCCL
#Using NCCL
#Using NCCL
#Using NCCL
#Using NCCL
#Using NCCL
#Using NCCL
#Using NCCL
#Using NCCL
#Using NCCL
#Using NCCL
#Using NCCL
#Using NCCL
#Using NCCL
#Using NCCL
# OSU NCCL-CUDA Allreduce Latency Test v7.5
# Size Avg Latency(us)
1073741824 13482.19
$