OCIチュートリアル
タグ検索 トップページへ戻る

NCCL Tests実行方法(BM.GPU4.8/BM.GPU.A100-v2.8 Oracle Linux編)

タグ: #hpc

0. 概要

本ドキュメントで解説する NCCL Tests の実行は、GPUインスタンス上に containerdNVIDIA Container Toolkit で構築されたコンテナ実行環境で TensorFlow NGC Container を起動し、このコンテナに含まれる NCCL(NVIDIA Collective Communication Library) とコンテナ上でビルドする NCCL Tests を使用します。

本ドキュメントで NCCL Tests を実行するGPUインスタンスは、8枚の NVIDIA A100 GPUを搭載するベア・メタル・シェイプ BM.GPU4.8/BM.GPU.A100-v2.8 を使用し、 OCI HPCテクニカルTips集containerdによるコンテナ実行環境構築方法 の手順に従い、 containerdNVIDIA Container Toolkit によるコンテナ実行環境が予め構築されていることを前提に、 TensorFlow NGC Container を起動してこの上で NCCL Tests を実行する手順を、以下の順に解説します。

  1. NCCL Tests計測用コンテナ作成
  2. NCCL Testsコンパイル
  3. NCCL Tests実行

本ドキュメントでは、以下の環境で NCCL TestsAll-Reduce 通信性能をコンテナ環境から計測し、10 GiBのメッセージサイズで 219 GB/s の帯域(busbw)性能が出ています。

  • シェイプ : BM.GPU4.8/BM.GPU.A100-v2.8
  • ノード数 : 2
  • GPU数 : NVIDIA A100 40GB/80GB x 16
  • ノード間接続インターコネクト : クラスタ・ネットワーク (100 Gbps x 16)
  • イメージOracle Linux 9.5ベースのGPU クラスタネットワーキングイメージ (※1)
  • コンテナランタイム : containerd 2.2.0
  • NVIDIA Container Toolkit : 1.18.0
  • コンテナ : TensorFlow NGC Container 25.02-tf2-py3
  • NCCL : 2.25.1(※2)
  • MPI : OpenMPI 4.1.7rc1(※2)

※1) OCI HPCテクニカルTips集クラスタネットワーキングイメージの選び方1. クラスタネットワーキングイメージ一覧 のイメージ No.15 です。
※2)コンテナに含まれるものを使用します。

1. NCCL Tests計測用コンテナ作成

1-0. 概要

本章は、後の章で NCCL Tests の計測を実行するためのコンテナ作成とその事前準備を行います。

本ドキュメントは、 NCCL Tests がコンテナを跨るプログラム実行のコントローラとして OpenMPI を使用しますが、このためにはMPIプログラムをmpirun等で起動するコンテナ(いわゆるヘッドノード)からMPIプログラム実行に参加する他の全てのコンテナに対して、パスフレーズ無しでSSH接続できる必要があります。

またここで使用する TensorFlow NGC Container は、sshdがインストールされていないため、ヘッドノード以外のコンテナでこれをインストールする必要があります。

また OpenMPI の実行は、これを実行するコンテナ間で必要なポートにアクセス出来る必要があるため、これを妨げるGPUノード上で動作するファイアーウォールやGPUノードが接続されるサブネットのセキュリティリストを修正する必要があります。

以上より、本章で実施する作業は以下の手順を経て行います。

  1. コンテナ間SSH接続環境構築
  2. MPI実行を妨げる設定の修正
  3. コンテナ起動
  4. sshdインストール・起動

なお、手順 1.2. 、及び 4. は、単一GPUノードでのみ NCCL Tests の計測を実行する場合実施する必要ありません。

またGPUクラスタの場合は、全てのGPUノード間でコンテナ起動ユーザのホームディレクトリが共有されていることを前提とします。

1-1. コンテナ間SSH接続環境構築

以下コマンドを2ノードのGPUノードのうち1ノード(以降このGPUノードをマスターノード、他のGPUノードをスレーブノードと呼称。)のコンテナ起動ユーザで実行します。(GPUノード間でコンテナ起動ユーザのホームディレクトリが共有されている前提です。)

$ ssh-keygen -f ~/.ssh/id_rsa -N ""
$ cat  ~/.ssh/id_rsa.pub | tee -a ~/.ssh/authorized_keys

1-2. MPI実行を妨げる設定の修正

マスターノードとスレーブノードのコンテナ間でMPI実行を妨げる設定を修正するため、以下を実施します。

  • 全てのGPUノードの firewalld 停止
  • GPUノードが接続するサブネットのセキュリティーリストのイングレス・ルールに同サブネットからのアクセスを全て許可

なお、 OCI HPCチュートリアル集 のカテゴリ 機械学習環境 のチュートリアル GPUクラスタを構築する(基礎インフラ手動構築編)GPUクラスタを構築する(基礎インフラ自動構築編) の手順に従って構築されたGPUクラスタは、既にこの設定が適用されているため、改めて実施する必要はありません。

1-3. コンテナ起動

以下コマンドをマスターノードとスレーブノードのコンテナ起動ユーザでそれぞれ実行し、 NGC Catalog から TensorFlow NGC Container を起動します。
本コンテナのサイズは、約14 GBです。

$ nerdctl run -it --rm --gpus all --network=host --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --shm-size=1g -v ~:/root -v /sys:/sys:ro nvcr.io/nvidia/tensorflow:25.02-tf2-py3

1-4. sshdインストール・起動

以下コマンドをスレーブノードで起動したコンテナ上のrootユーザで実行し、SSHサーバを起動します。

$ apt update
$ apt install -y openssh-server
$ mkdir /run/sshd && /usr/sbin/sshd -p 22222

次に、以下コマンドをマスターノードで起動したコンテナ上のrootユーザで実行し、スレーブノードにSSH接続できることを確認します。
なお、sshコマンドで指定するホスト名は、自身の環境のスレーブノードのホスト名に置き換えます。

$ ssh -p 22222 -oStrictHostKeyChecking=accept-new inst-gpu-slave hostname
Warning: Permanently added '[inst-vm-ol905mg-2]:22222' (ED25519) to the list of known hosts.
inst-gpu-slave
$

2. NCCL Testsコンパイル

本章は、後の章で実行する NCCL Tests のバイナリをビルドします。

以下コマンドをマスターノードで起動したコンテナ上のrootユーザで実行し、 NCCL TestsGitHub からダウンロードしてビルドします。

$ cd ~ && git clone https://github.com/NVIDIA/nccl-tests.git
$ cd nccl-tests && make MPI=1 MPI_HOME=/usr/local/mpi CUDA_HOME=/usr/local/cuda NCCL_HOME=/usr/lib/x86_64-linux-gnu

3. NCCL Tests実行

3-0. 概要

本章は、以下の2パターンで NCCL Tests を実行します。

  1. 1ノード8GPU
  2. 2ノード16GPU

3-1. 1ノード8GPU

以下コマンドをマスターノードとスレーブノードで起動したコンテナ上のrootユーザでそれぞれ実行し、1ノード8枚のGPUを使用する NCCLAll-Reduce 通信性能を計測します。

$ mpirun --allow-run-as-root -n 8 ./build/all_reduce_perf -b 10G -e 10G -t 1 -g 1
# nccl-tests version 2.17.6 nccl-headers=22501 nccl-library=22501
# Collective test starting: all_reduce_perf
# nThread 1 nGpus 1 minBytes 10737418240 maxBytes 10737418240 step: 1048576(bytes) warmup iters: 1 iters: 20 agg iters: 1 validation: 1 graph: 0
#
# Using devices
#  Rank  0 Group  0 Pid   1946 on inst-gpu-master device  0 [0000:0f:00] NVIDIA A100-SXM4-40GB
#  Rank  1 Group  0 Pid   1947 on inst-gpu-master device  1 [0000:15:00] NVIDIA A100-SXM4-40GB
#  Rank  2 Group  0 Pid   1948 on inst-gpu-master device  2 [0000:51:00] NVIDIA A100-SXM4-40GB
#  Rank  3 Group  0 Pid   1949 on inst-gpu-master device  3 [0000:54:00] NVIDIA A100-SXM4-40GB
#  Rank  4 Group  0 Pid   1950 on inst-gpu-master device  4 [0000:8d:00] NVIDIA A100-SXM4-40GB
#  Rank  5 Group  0 Pid   1952 on inst-gpu-master device  5 [0000:92:00] NVIDIA A100-SXM4-40GB
#  Rank  6 Group  0 Pid   1955 on inst-gpu-master device  6 [0000:d6:00] NVIDIA A100-SXM4-40GB
#  Rank  7 Group  0 Pid   1958 on inst-gpu-master device  7 [0000:da:00] NVIDIA A100-SXM4-40GB
#
#                                                              out-of-place                       in-place          
#       size         count      type   redop    root     time   algbw   busbw  #wrong     time   algbw   busbw  #wrong 
#        (B)    (elements)                               (us)  (GB/s)  (GB/s)             (us)  (GB/s)  (GB/s)         
 10737418240    2684354560     float     sum      -1  80646.8  133.14  233.00       0  80528.8  133.34  233.34       0
# Out of bounds values : 0 OK
# Avg bus bandwidth    : 233.168 
#
# Collective test concluded: all_reduce_perf

$

3-2. 2ノード16GPU

以下コマンドをマスターノードで起動したコンテナ上のrootユーザで実行し、マスターノードとスレーブノードの全16枚のGPUと全32ポートのRDMAインタフェースを使用した、2ノード16枚のGPUを使用する NCCLAll-Reduce 通信性能を計測します。
ここで、 -H オプションに指定するマスターノード(inst-gpu-master)とスレーブノード(inst-gpu-slave)のホスト名は、自身の環境に合わせて修正します。

$ mpirun --allow-run-as-root -n 16 -H inst-gpu-master:8,inst-gpu-slave:8 -mca plm_rsh_args "-p 22222" -x NCCL_IB_QPS_PER_CONNECTION=4 -x NCCL_IB_GID_INDEX=3 -x UCX_NET_DEVICES=eth0 -x NCCL_IB_HCA="mlx5_0,mlx5_1,mlx5_2,mlx5_3,mlx5_6,mlx5_7,mlx5_8,mlx5_9,mlx5_10,mlx5_11,mlx5_12,mlx5_13,mlx5_14,mlx5_15,mlx5_16,mlx5_17" ./build/all_reduce_perf -b 10G -e 10G -t 1 -g 1
# nThread 1 nGpus 1 minBytes 10737418240 maxBytes 10737418240 step: 2(factor) warmup iters: 5 iters: 20 agg iters: 1 validation: 1 graph: 0
#
# Using devices
#  Rank  0 Group  0 Pid    417 on inst-gpu-master device  0 [0x0f] NVIDIA A100-SXM4-40GB
#  Rank  1 Group  0 Pid    418 on inst-gpu-master device  1 [0x15] NVIDIA A100-SXM4-40GB
#  Rank  2 Group  0 Pid    419 on inst-gpu-master device  2 [0x51] NVIDIA A100-SXM4-40GB
#  Rank  3 Group  0 Pid    420 on inst-gpu-master device  3 [0x54] NVIDIA A100-SXM4-40GB
#  Rank  4 Group  0 Pid    421 on inst-gpu-master device  4 [0x8d] NVIDIA A100-SXM4-40GB
#  Rank  5 Group  0 Pid    422 on inst-gpu-master device  5 [0x92] NVIDIA A100-SXM4-40GB
#  Rank  6 Group  0 Pid    425 on inst-gpu-master device  6 [0xd6] NVIDIA A100-SXM4-40GB
#  Rank  7 Group  0 Pid    429 on inst-gpu-master device  7 [0xda] NVIDIA A100-SXM4-40GB
#  Rank  8 Group  0 Pid    371 on inst-gpu-slave device  0 [0x0f] NVIDIA A100-SXM4-40GB
#  Rank  9 Group  0 Pid    372 on inst-gpu-slave device  1 [0x15] NVIDIA A100-SXM4-40GB
#  Rank 10 Group  0 Pid    373 on inst-gpu-slave device  2 [0x51] NVIDIA A100-SXM4-40GB
#  Rank 11 Group  0 Pid    374 on inst-gpu-slave device  3 [0x54] NVIDIA A100-SXM4-40GB
#  Rank 12 Group  0 Pid    375 on inst-gpu-slave device  4 [0x8d] NVIDIA A100-SXM4-40GB
#  Rank 13 Group  0 Pid    376 on inst-gpu-slave device  5 [0x92] NVIDIA A100-SXM4-40GB
#  Rank 14 Group  0 Pid    377 on inst-gpu-slave device  6 [0xd6] NVIDIA A100-SXM4-40GB
#  Rank 15 Group  0 Pid    380 on inst-gpu-slave device  7 [0xda] NVIDIA A100-SXM4-40GB
#
#                                                              out-of-place                       in-place          
#       size         count      type   redop    root     time   algbw   busbw #wrong     time   algbw   busbw #wrong
#        (B)    (elements)                               (us)  (GB/s)  (GB/s)            (us)  (GB/s)  (GB/s)       
 10737418240    2684354560     float     sum      -1    90330  118.87  222.88      0    91945  116.78  218.96      0
# Out of bounds values : 0 OK
# Avg bus bandwidth    : 220.921 
#
$