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

UbuntuをOSとするHPC/機械学習ワークロード向けGPUインスタンス構築方法

タグ: #hpc

0. 概要

GPUインスタンスのOSに利用可能なLinuxディストリビューションは、 Oracle Linux をはじめ主要なものが プラットフォーム・イメージ として用意されていますが、GPU上でHPC/機械学習ワークロードを実行する際のOSで主流になっている Ubuntu もこれに含まれます。
ただこの場合、GPUを利用するための以下ソフトウェアは、GPUインスタンス作成後に自身でインストール・セットアップする必要があります。

  • NVIDIA Driver : NVIDIA製GPUドライバソフトウェア
  • NVIDIA CUDA : CUDAライブラリ
  • NVIDIA Fabric Manager : NVSwitchBM.GPU4.8 / BM.GPU.A100-v2.8 に搭載)管理ソフトウェア(※1)
  • NVIDIA HPC SDK : NVIDIA製GPU向けHPC/機械学習アプリケーション開発環境
  • CUDA-aware MPIライブラリ: CUDA IPC / GPUDirect RDMA 対応のデバイスメモリアドレッシング可能なMPIライブラリ

※1)NVSwitch を搭載するシェイプの場合のみインストールします。

本テクニカルTipsは、これらのソフトウェアを Ubuntu をOSとするGPUインスタンスにインストールし、構築した環境で以下のソフトウェア/サンプルプログラムを使用して動作確認を行う手順を、8枚の NVIDIA A100 GPUを搭載するベアメタルシェイプ BM.GPU4.8 を例に解説します。

  1. CUDA Samples
  2. OpenACCサンプルプログラム
  3. cuBLAS サンプルプログラム
  4. OpenACC/MPIハイブリッドサンプルプログラム
  5. NCCL Tests

本テクニカルTipsは、以下のソフトウェアバージョンを前提とします。

  • OS : Ubuntu 24.04(※2)
  • NVIDIA Driver : 575.57.08
  • NVIDIA CUDA : 12.9.1
  • NVIDIA Fabric Manager : 575.57.08
  • NVIDIA HPC SDK : 25.7
  • CUDA-aware MPIライブラリ : OpenMPI 5.0.8

※2) プラットフォーム・イメージCanonical-Ubuntu-24.04-2025.07.23-0 です。

注意 : 本コンテンツ内の画面ショットは、現在のOCIコンソール画面と異なっている場合があります。

1. GPUインスタンス作成

本章は、 Ubuntu をOSとしシェイプに BM.GPU4.8 を使用するGPUインスタンスを作成します。

OCIコンソールにログインし、GPUインスタンスを作成する リージョン を選択後、 コンピュートインスタンス とメニューを辿ります。

次に、表示される以下画面で、インスタンスの作成 ボタンをクリックします。

画面ショット

次に、表示される 基本情報 画面で、以下の情報を入力し ボタンをクリックします。
なお、ここに記載のないフィールドは、デフォルトのままとします。

  • 名前 :インスタンスに付与する名前
  • コンパートメントに作成 :インスタンスを作成する コンパートメント
  • 可用性ドメイン :インスタンスを作成する 可用性ドメイン
  • イメージCanonical-Ubuntu-24.04-2025.07.23-0
    イメージの変更 ボタンをクリックして表示される以下 イメージの選択 サイドバーで Ubuntu を選択し イメージ名 列で Canonical Ubuntu 24.04 を選択し イメージ・ビルド プルダウンメニューで 2025.07.23-0 を選択し、 イメージの選択 ボタンをクリック。)

画面ショット

  • ShapeBM.GPU4.8
    シェイプの変更 ボタンをクリックして表示される以下 すべてのシェイプの参照 サイドバーで ベア・メタル・マシン をクリックして表示される BM.GPU4.8 を選択し 次のドキュメントを確認した上でこれに同意します。 チェックボックスをチェックし、 シェイプの選択 ボタンをクリック。)

画面ショット

次に、表示される セキュリティ 画面で、 ボタンをクリックします。

次に、表示される ネットワーキング 画面で、以下の情報を入力し ボタンをクリックします。
なお、ここに記載のないフィールドは、デフォルトのままとします。

  • プライマリ・ネットワーク : GPUインスタンスを接続する 仮想クラウドネットワーク
  • サブネット : GPUインスタンスを接続する サブネット
  • SSHキーの追加 :GPUインスタンスにSSHログインする際使用するSSH秘密鍵に対応する公開鍵
    (公開鍵ファイルのアップロード( 公開キー・ファイル(.pub)のアップロード )と公開鍵のフィールドへの貼り付け( 公開キーの貼付け )が選択可能)

次に、表示される ストレージ 画面で、以下の情報を入力し ボタンをクリックします。
なお、ここに記載のないフィールドは、デフォルトのままとします。

  • ブート・ボリューム・サイズ(GB) :GPUインスタンスの ブート・ボリューム サイズ
    Specify a custom boot volume size and performance setting チェックボックスをチェックすると指定可能)
    通常GPUノードは、様々な機械学習用ソフトウェアやコンテナイメージを格納する必要があるため、少なくとも200 GBの ブート・ボリューム サイズとします。

次に、表示される 確認 画面で、作成するGPUインスタンスの情報を確認し 作成 ボタンをクリックします。

次に、以下コマンドでGPUインスタンスにSSHログインします。この時、作成時にデフォルトで作成されるユーザが ubuntu であることに留意します。
なお、 BM.GPU4.8 インスタンスの場合、作成開始からSSHログインできるまでに20分程度かかります。

$ ssh ubuntu@aaa.bbb.ccc.ddd

次に、以下コマンドをGPUインスタンスのubuntuユーザで実行し、OSの自動アップデートを停止します。
この手順は、以降の作業でカーネルのバージョンに依存するカーネルモジュールのロードを行うため、それ以降の意図せぬカーネルの自動アップデートを避けるために実施します。

$ sudo cp -p /etc/apt/apt.conf.d/20auto-upgrades /tmp/
$ sudo sed -i 's/Upgrade "1"/Upgrade "0"/g' /etc/apt/apt.conf.d/20auto-upgrades
$ sudo sed -i 's/Lists "1"/Lists "0"/g' /etc/apt/apt.conf.d/20auto-upgrades
$ sudo diff /tmp/20auto-upgrades /etc/apt/apt.conf.d/20auto-upgrades
1,2c1,2
< APT::Periodic::Update-Package-Lists "1";
< APT::Periodic::Unattended-Upgrade "1";
---
> APT::Periodic::Update-Package-Lists "0";
> APT::Periodic::Unattended-Upgrade "0";
$ sudo systemctl disable --now unattended-upgrades
Synchronizing state of unattended-upgrades.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install disable unattended-upgrades
Removed "/etc/systemd/system/multi-user.target.wants/unattended-upgrades.service".
$

次に、以下コマンドをGPUインスタンスのubuntuユーザで実行し、 iptables を永続的に停止します。

$ sudo iptables -P INPUT ACCEPT
$ sudo iptables -P OUTPUT ACCEPT
$ sudo iptables -P FORWARD ACCEPT
$ sudo iptables -F
$ sudo systemctl disable --now iptables

次に、以下コマンドをGPUインスタンスのubuntuユーザで実行し、 AppArmor を永続的に停止します。

$ sudo systemctl disable --now apparmor

2. NVIDIA GPU関連ソフトウェアインストール

2-0. 概要

本章は、GPUインスタンスに以下の NVIDIA GPU関連ソフトウェアをインストールします。

  • NVIDIA Driver
  • NVIDIA CUDA Toolkit
  • NVIDIA Fabric Manager(※3)
  • NVIDIA HPC SDK

※3) NVSwitch を搭載するシェイプの場合のみ実施します。

本テクニカルTipsでのこれらソフトウェアのインストールは、 Ubuntu パッケージマネージャを使用します。

2-1. インストール手順

以下コマンドをGPUインスタンスのubuntuユーザで実行し、 NVIDIA Driver をインストールします。

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID | sed -e 's/\.//g')
$ mkdir ~/`hostname` && cd ~/`hostname` && wget https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/cuda-keyring_1.1-1_all.deb
$ sudo dpkg -i cuda-keyring_1.1-1_all.deb
$ sudo apt update
$ sudo apt install -y cuda-drivers-575
$ echo nvidia_peermem | sudo tee -a /etc/modules

次に、OCIコンソールからGPUインスタンスを再起動します。
この再起動は、 BM.GPU4.8 の場合でSSHログインできるまでに20分程度かかります。

GPUインスタンス起動後、ubuntuユーザでSSHログインして以下コマンドを実行し、先の NVIDIA Driver のインストールでGPUを認識できていることを確認します。

$ nvidia-smi

次に、以下コマンドをGPUインスタンスのubuntuユーザで実行し、 NVIDIA CUDA と後の動作確認で必要なソフトウェアをインストールします。

$ sudo apt install -y cuda-toolkit-12-9 cmake unzip

次に、以下コマンドをGPUインスタンスのubuntuユーザで実行し、 NVIDIA Fabric Manager をインストール・セットアップします。
なおこの手順と次のGPUインスタンス再起動は、 NVSwitch を搭載するシェイプの場合のみ実施します。

$ sudo apt install -y cuda-drivers-fabricmanager-575
$ sudo systemctl enable nvidia-fabricmanager

次に、OCIコンソールからGPUインスタンスを再起動します。
この再起動は、 BM.GPU4.8 の場合でSSHログインできるまでに20分程度かかります。

GPUインスタンス起動後、ubuntuユーザでSSHログインして以下コマンドを実行し、 NVIDIA HPC SDK をインストールします。

$ curl https://developer.download.nvidia.com/hpc-sdk/ubuntu/DEB-GPG-KEY-NVIDIA-HPC-SDK | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-hpcsdk-archive-keyring.gpg
$ echo 'deb [signed-by=/usr/share/keyrings/nvidia-hpcsdk-archive-keyring.gpg] https://developer.download.nvidia.com/hpc-sdk/ubuntu/amd64 /' | sudo tee /etc/apt/sources.list.d/nvhpc.list
$ sudo apt update
$ sudo apt install -y nvhpc-25-7-cuda-multi environment-modules
$ sudo cp -p /opt/nvidia/hpc_sdk/modulefiles/nvhpc/25.7 /usr/share/modules/modulefiles/nvhpc

3. OpenMPIインストール・セットアップ

3-0. 概要

本章は、GPUインスタンスにCUDA-aware OpenMPI とその前提ソフトウェアの以下ソフトウェアをインストールします。

3-1. 前提ソフトウェア・RPMパッケージインストール

以下コマンドをGPUインスタンスのubuntuユーザで実行し、前提RPMパッケージをインストールします。

$ sudo apt install -y libssl-dev autoconf libtool zlib1g-dev

次に、以下コマンドをGPUインスタンスのubuntuユーザで実行し、 libevent/opt ディレクトリにインストールします。
なおmakeコマンドの並列数は、当該ノードのコア数に合わせて調整します。

$ cd ~/`hostname` && wget https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz
$ tar -xvf ./libevent-2.1.12-stable.tar.gz
$ cd libevent-2.1.12-stable && ./configure --prefix=/opt/libevent
$ make -j 128 && sudo make install

次に、以下コマンドをGPUインスタンスのubuntuユーザで実行し、 hwloc/opt ディレクトリにインストールします。
なおmakeコマンドの並列数は、当該ノードのコア数に合わせて調整します。

$ cd ~/`hostname` && wget https://download.open-mpi.org/release/hwloc/v2.12/hwloc-2.12.2.tar.gz
$ tar -xvf ./hwloc-2.12.2.tar.gz
$ cd hwloc-2.12.2 && ./configure --prefix=/opt/hwloc --with-cuda=/usr/local/cuda-12.9
$ make -j 128 && sudo make install

次に、以下コマンドをGPUインスタンスのubuntuユーザで実行し、 OpenPMIx/opt ディレクトリにインストールします。
なおmakeコマンドの並列数は、当該ノードのコア数に合わせて調整します。

$ cd ~/`hostname` && wget https://github.com/openpmix/openpmix/releases/download/v5.0.8/pmix-5.0.8.tar.gz
$ tar -xvf ./pmix-5.0.8.tar.gz
$ cd pmix-5.0.8 && ./configure --prefix=/opt/pmix --with-libevent=/opt/libevent --with-hwloc=/opt/hwloc
$ make -j 128 && sudo make install

次に、以下コマンドをGPUインスタンスのubuntuユーザで実行し、 XPMEM/opt ディレクトリにインストールします。
なおmakeコマンドの並列数は、当該ノードのコア数に合わせて調整します。

$ cd ~/`hostname` && git clone https://github.com/hpc/xpmem.git
$ cd xpmem && ./autogen.sh && ./configure --prefix=/opt/xpmem
$ make -j 128 && sudo make install

次に、以下コマンドをGPUインスタンスのubuntuユーザで実行し、 XPMEM をカーネルモジュールとしてインストールします。

$ sudo install -D -m 644 /opt/xpmem/lib/modules/`uname -r`/kernel/xpmem/xpmem.ko /lib/modules/`uname -r`/extra/xpmem.ko
$ sudo depmod -a
$ echo xpmem | sudo tee /etc/modules-load.d/xpmem.conf
$ sudo modprobe xpmem

次に、以下コマンドをGPUインスタンスのubuntuユーザで実行し、 gdrcopy/opt ディレクトリにインストールします。
なおmakeコマンドの並列数は、当該ノードのコア数に合わせて調整します。

$ cd ~/`hostname` && wget https://github.com/NVIDIA/gdrcopy/archive/refs/tags/v2.5.1.tar.gz
$ tar -xvf ./v2.5.1.tar.gz
$ cd gdrcopy-2.5.1 && make -j 128 CUDA=/usr/local/cuda-12.9 all && sudo make prefix=/opt/gdrcopy install
$ sudo sed 's/src\/gdrdrv/\/lib\/modules\/`uname -r`\/extra/g' ./insmod.sh | sudo tee /opt/gdrcopy/bin/insmod.sh && sudo chmod 755 /opt/gdrcopy/bin/insmod.sh
$ sudo install -D -m 644 ~/`hostname`/gdrcopy-2.5.1/src/gdrdrv/gdrdrv.ko /lib/modules/`uname -r`/extra/gdrdrv.ko
$ sudo depmod -a

次に、以下のファイルを /etc/systemd/system/gdrcopy.service として作成します。

[Unit]
Description=Start gdrcopy

[Service]
ExecStart=/opt/gdrcopy/bin/insmod.sh
Restart=no
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

次に、以下コマンドをGPUインスタンスのubuntuユーザで実行し、 gdrcopy をカーネルモジュールとしてインストールします。

$ sudo systemctl daemon-reload
$ sudo systemctl enable --now gdrcopy

次に、以下コマンドをGPUインスタンスのubuntuユーザで実行し、 OpenUCX/opt ディレクトリにインストールします。
なおmakeコマンドの並列数は、当該ノードのコア数に合わせて調整します。

$ cd ~/`hostname` && wget https://github.com/openucx/ucx/releases/download/v1.19.0/ucx-1.19.0.tar.gz
$ tar -xvf ./ucx-1.19.0.tar.gz
$ cd ucx-1.19.0 && ./contrib/configure-release --prefix=/opt/ucx --with-xpmem=/opt/xpmem --with-cuda=/usr/local/cuda-12.9 -with-gdrcopy=/opt/gdrcopy
$ make -j 128 && sudo make install

次に、以下コマンドをGPUインスタンスのubuntuユーザで実行し、 UCC/opt ディレクトリにインストールします。
なおmakeコマンドの並列数は、当該ノードのコア数に合わせて調整します。
最後のコマンドは、 BM.GPU4.8 の場合で45分程度を要します。

$ cd ~/`hostname` && wget https://github.com/openucx/ucc/archive/refs/tags/v1.5.0.tar.gz
$ tar -xvf ./v1.5.0.tar.gz
$ cd ./ucc-1.5.0/ && ./autogen.sh && ./configure --prefix=/opt/ucc --with-ucx=/opt/ucx --with-cuda=/usr/local/cuda-12.9 --with-nccl=/opt/nvidia/hpc_sdk/Linux_x86_64/25.7/comm_libs/nccl
$ make -j 128 && sudo make install

3-2. インストール

以下コマンドをGPUインスタンスのubuntuユーザで実行します。

$ cd ~/`hostname` && wget https://download.open-mpi.org/release/open-mpi/v5.0/openmpi-5.0.8.tar.gz
$ tar -xvf ./openmpi-5.0.8.tar.gz
$ . /etc/profile.d/modules.sh
$ module load nvhpc
$ cd openmpi-5.0.8 && ./configure --prefix=/opt/openmpi --with-libevent=/opt/libevent --with-hwloc=/opt/hwloc --with-pmix=/opt/pmix --with-ucx=/opt/ucx --with-ucc=/opt/ucc --with-slurm --with-cuda=/usr/local/cuda-12.9 CC=nvc CXX=nvc++ FC=nvfortran CFLAGS="-mno-hle"

次に、カレントディレクトリに作成されたファイル libtool を以下のように修正します。

$ diff libtool_org libtool
10560a10561
> 	  export PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/25.7/compilers/bin:${PATH}
$

次に、以下コマンドをGPUインスタンスのubuntuユーザで実行し、 OpenMPI/opt ディレクトリにインストールします。
なおmakeコマンドの並列数は、当該ノードのコア数に合わせて調整します。

$ make -j 128 all && sudo make install

3-3. セットアップ

本章は、GPU環境利用ユーザが OpenMPI を利用するために必要な環境のセットアップを行います。

以下のファイルを /usr/share/modules/modulefiles/openmpi で作成します。
このファイルは、 Environment modules にモジュール名 openmpi を登録し、これをロードすることで OpenMPI 利用環境の設定が可能になります

#%Module1.0
##
## OpenMPI for NVIDIA compiler 25.7

proc ModulesHelp { } {
        puts stderr "OpenMPI 5.0.8 for NVIDIA compiler 25.7\n"
}

module-whatis   "OpenMPI 5.0.8 for NVIDIA compiler 25.7"

set pkg_root    /opt/openmpi
set ver         5.0.8

setenv MPI_ROOT $pkg_root
setenv MPICC    mpicc
setenv MPICXX   mpicxx
setenv MPIFC    mpif90

prepend-path PATH               $pkg_root/bin:/opt/ucx/bin
prepend-path LD_LIBRARY_PATH    $pkg_root/lib:/opt/gdrcopy/lib
prepend-path LIBRARY_PATH       $pkg_root/lib:/opt/gdrcopy/lib
prepend-path CPATH              $pkg_root/include
prepend-path C_INCLUDE_PATH     $pkg_root/include
prepend-path CPLUS_INCLUDE_PATH $pkg_root/include
prepend-path MANPATH            $pkg_root/share/man

4. 動作確認

4-0. 概要

本章は、ここまでにインストールしたソフトウェアの動作確認を以下の順に実施します。

  1. CUDA SamplesによるNVIDIA CUDA Toolkit動作確認
    NVIDIA CUDA Toolkit に含まれるCUDAコンパイラとCUDAライブラリを使用する CUDA Samples をコンパイル・実行することで、 NVIDIA CUDA Toolkit 含まれるCUDAコンパイラの動作を確認します。

  2. OpenACCサンプルプログラムによるNVIDIA HPC SDK動作確認
    OpenACCのディレクティブを含むCプログラムをコンパイル・実行することで、 NVIDIA HPC SDK に含まれるOpneACC対応Cコンパイラの動作を確認します。

  3. cuBLASサンプルプログラムによるNVIDIA HPC SDK動作確認
    cuBLAS ライブラリコールを含むFortranプログラムをコンパイル・実行することで、 NVIDIA HPC SDK に含まれる cuBLAS の動作を確認します。

  4. OpenACC/MPIハイブリッドプログラムによるCUDA-aware OpenMPI動作確認
    OpenACCのディレクティブを含むMPI Cプログラムをコンパイル・実行することで、CUDA-aware OpenMPI の動作を確認します。

  5. NCCL TestsによるNVIDIA Fabric Manager動作確認
    NCCL Tests で8枚のGPUを使用する NCCL(NVIDIA Collective Communication Library)All-Reduce 通信性能を計測し、十分な性能が出ていることをもって NVIDIA Fabric Manager の動作を確認します。

4-1. CUDA SamplesによるNVIDIA CUDA Toolkit動作確認

以下コマンドをGPUインスタンスのGPU環境利用ユーザで実行し、 CUDA Samples をコンパイルします。
なお、makeコマンドの並列数はGPUインスタンスのコア数に合わせて調整します。

$ mkdir ~/`hostname` && cd ~/`hostname` && wget https://github.com/NVIDIA/cuda-samples/archive/refs/tags/v12.9.zip
$ unzip v12.9.zip
$ export PATH=/usr/local/cuda-12.9/bin:${PATH}
$ cd cuda-samples-12.9 && mkdir build && cd build && cmake .. && make -j 128

次に、以下コマンドをGPUインスタンスのGPU環境利用ユーザで実行し、 CUDA Samples が正しく動作することを確認します。
この時、出力に搭載する全てのGPUの情報が含まれ、最後に出力される Result = 行が PASS となっていることで、 NVIDIA CUDA Toolkit の動作を確認します。

$ ./Samples/1_Utilities/deviceQuery/deviceQuery
:
:
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 12.9, CUDA Runtime Version = 12.9, NumDevs = 8
Result = PASS
$

4-2. OpenACCサンプルプログラムによるNVIDIA HPC SDK動作確認

以下のOpenACCサンプルプログラムをファイル名 test.c として作成します。

#include <stdio.h>
#define N 1000000000
int array[N];
int main() {
#pragma acc parallel loop copy(array[0:N])
   for(int i = 0; i < N; i++) {
      array[i] = 3.0;
   }
   printf("Success!\n");
}

次に、以下コマンドをGPUインスタンスのGPU環境利用ユーザで実行し、このサンプルプログラムをコンパイル・実行することで、OpneACC対応Cコンパイラの動作を確認します。

$ module load nvhpc
$ nvc -acc -gpu=cc80 -o gpu.exe test.c
$ ./gpu.exe & sleep 3; nvidia-smi | tail -3
[1] 18096
Success!
|=========================================================================================|
|    0   N/A  N/A           18096      C   ./gpu.exe                              4234MiB |
+-----------------------------------------------------------------------------------------+
$

4-3. cuBLASサンプルプログラムによるNVIDIA HPC SDK動作確認

以下の cuBLAS を使用するFortranサンプルプログラムをファイル名 test.f90 として作成します。

program main
  use cublas_v2
  implicit none

  integer, parameter :: n = 2
  real(8) :: alpha, beta
  real(8), dimension(n,n) :: a_host, b_host, c_host
  real(8), dimension(n,n), device :: a_dev, b_dev, c_dev
  integer :: i, j
  type(cublashandle) :: handle
  integer :: cublas_status

  alpha = 1.0d0
  beta = 0.0d0
  do j = 1, n
    do i = 1, n
      a_host(i,j) = i + j
      b_host(i,j) = i - j
    end do
  end do

  cublas_status = cublascreate(handle)
  if (cublas_status /= cublas_status_success) then
    print *, 'Error creating cuBLAS handle!'
    stop
  end if
  a_dev = a_host
  b_dev = b_host
  cublas_status = cublasdgemm(handle, cublas_op_n, cublas_op_n, n, n, n, &
                              alpha, a_dev, n, b_dev, n, beta, c_dev, n)
  if (cublas_status /= cublas_status_success) then
    print *, 'Error executing cublasdgemm!'
    stop
  end if
  c_host = c_dev
  cublas_status = cublasdestroy(handle)
  if (cublas_status /= cublas_status_success) then
    print *, 'Error destroying cuBLAS handle!'
    stop
  end if

  print *, 'Matrix c:'
  do i = 1, n
    print *, (c_host(i,j), j = 1, n)
  end do
end program main

次に、以下コマンドをGPUインスタンスのGPU環境利用ユーザで実行し、このサンプルプログラムをコンパイル・実行することで、 cuBLAS の動作を確認します。

$ module load nvhpc
$ nvfortran -cuda -o gpu_blas.exe test.f90
$ ./gpu_blas.exe 
 Matrix c:
    3.000000000000000        -2.000000000000000     
    4.000000000000000        -3.000000000000000
$

4-4. OpenACC/MPIハイブリッドプログラムによるCUDA-aware OpenMPI動作確認

ここで使用するOpenACC/MPIハイブリッドのサンプルプログラムは、 東京大学 情報基盤センター 様がGitHubの以下レポジトリから公開している、並列プログラミング講習会向けのものを利用させて頂くこととします。

https://github.com/hoshino-UTokyo/lecture_openacc_mpi

以下コマンドをGPUインスタンスのGPU環境利用ユーザで実行し、サンプルプログラムのソースツリーをクローンします。

$ cd ~/`hostname` && git clone https://github.com/hoshino-UTokyo/lecture_openacc_mpi.git

以降では、ダウンロードした lecture_openacc_mpi/C/openacc_mpi_basic/04_cuda_aware ディレクトリ配下のサンプルプログラムを使用します。
この際、 東京大学 情報基盤センター 様との環境の違いから、このディレクトリの Makefile を以下のように修正します。

$ diff Makefile_org Makefile
8c8
< CFLAGS    = -O3 -acc -Minfo=accel  -ta=tesla,cc80
---
> CFLAGS    = -O3 -acc -Minfo=accel  -gpu=cc80
$

次に、以下コマンドをGPUインスタンスのGPU環境利用ユーザで実行し、このサンプルプログラムをコンパイル・実行することで、CUDA-aware OpenMPI の動作を確認します。

$ cd ~/`hostname`/lecture_openacc_mpi/C/openacc_mpi_basic/04_cuda_aware
$ module purge
$ module load nvhpc openmpi
$ make
mpicc -O3 -acc -Minfo=accel  -gpu=cc80 -c main.c
"main.c", line 57: warning: The independent loop parallelism with no parallelism level is set to seq when inferring the routine parallelism of the enclosing function [independent_loop_type]
  #pragma acc loop independent
  ^

Remark: individual warnings can be suppressed with "--diag_suppress <warning-name>"

main:
     54, Generating create(a[:16777216],b[:16777216]) [if not already present]
         Generating copyout(b[:16777216],a[:16777216]) [if not already present]
     58, Loop is parallelizable
         Generating NVIDIA GPU code
         58, #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */
     72, Generating implicit copy(sum) [if not already present]
         Generating copyin(b[:16777216]) [if not already present]
     76, Loop is parallelizable
         Generating NVIDIA GPU code
         76, #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */
             Generating reduction(+:sum)
mpicc -O3 -acc -Minfo=accel  -gpu=cc80  main.o   -o run
$ mpirun -n 2 -x UCX_NET_DEVICES=mlx5_4:1 ./run
[inst-v6xda-ao-ub24:17765] SET UCX_NET_DEVICES=mlx5_4:1
num of GPUs = 8
Rank 0: hostname = inst-v6xda-ao-ub24, GPU num = 0
Rank 1: hostname = inst-v6xda-ao-ub24, GPU num = 1
mean = 30.00
Time =    0.007 [sec]
$

4-5. NCCL TestsによるNVIDIA Fabric Manager動作確認

OCI HPCパフォーマンス関連情報NCCL Tests実行方法(BM.GPU4.8/BM.GPU.A100-v2.8 Ubuntu編)2. NCCL Testsコンパイル3. NCCL Tests実行 の手順に従い、1ノード8GPUの NCCL All-Reduce 通信性能を NCCL Tests で計測し、 NVSwitch を搭載する BM.GPU4.8 に期待される性能の 230 GB/s (10 GiBメッセージサイズ)前後の帯域(busbw)性能が出ることをもって、 NVIDIA Fabric Manager の動作を確認します。