diff --git a/content/hpc/benchmark/bios-setting/index.md b/content/hpc/benchmark/bios-setting/index.md index 03e4fb393d..168b7dff8d 100644 --- a/content/hpc/benchmark/bios-setting/index.md +++ b/content/hpc/benchmark/bios-setting/index.md @@ -66,11 +66,11 @@ BIOS設定上 **SMT** を有効化してインスタンスを作成した場合 ## 1-1. インスタンス構成でBIOS設定を指定する方法 -**[インスタンス構成](../../#5-7-インスタンス構成)** を作成する際の以下 **イメージとシェイプ** フィールドで、 +**[インスタンス構成](../../#5-7-インスタンス構成)** を作成する際の以下 **イメージとシェイプ** フィールドで **シェイプの変更** ボタンをクリックし、 ![画面ショット](console_page01.png) -**シェイプの変更** ボタンをクリックして表示される以下 **すべてのシェイプの参照** サイドバーで **ベア・メタル・マシン** をクリックして表示される所望のシェイプ(ここでは **BM.Optimized3.36** )を選択し **詳細BIOS設定** ボタンをクリックし、 +表示される以下 **すべてのシェイプの参照** サイドバーで **ベア・メタル・マシン** をクリックして表示される所望のシェイプ(ここでは **BM.Optimized3.36** )を選択して **詳細BIOS設定** ボタンをクリックし、 ![画面ショット](console_page02.png) @@ -80,16 +80,16 @@ BIOS設定上 **SMT** を有効化してインスタンスを作成した場合 ## 1-2. TerraformスクリプトでBIOS設定を指定する方法 -**[OCI HPCチュートリアル集](../../#1-oci-hpcチュートリアル集)** の **[Terraform](../../#5-12-terraform)** を使用する自動構築でHPC/GPUクラスタを構築する際のBIOS設定を適用する方法は、HPCクラスタの場合は **OCI HPCチュートリアル集** の **[HPCクラスタを構築する(基礎インフラ自動構築編)](../../spinup-hpc-cluster-withterraform/)** の **[0-1-2. スタック作成](../../spinup-hpc-cluster-withterraform/#0-1-2-スタック作成)**(**[リソース・マネージャ](../../#5-2-リソースマネージャ)** を使用する場合)か **[0-2-3. Terraformスクリプト作成](../../spinup-hpc-cluster-withterraform/#0-2-3-terraformスクリプト作成)**(**[Terraform](../../#5-12-terraform)** CLIを使用する場合)を、GPUクラスタの場合は **OCI HPCチュートリアル集** の **[GPUクラスタを構築する(基礎インフラ自動構築編)](../../spinup-gpu-cluster-withterraform/)** の **[0-1-2. スタック作成](../../spinup-gpu-cluster-withterraform/#0-1-2-スタック作成)** ( **リソース・マネージャ** を使用する場合)か **[0-2-2. Terraformスクリプト作成](../../spinup-gpu-cluster-withterraform/#0-2-2-terraformスクリプト作成)** ( **Terraform** CLIを使用する場合)を参照してください。 +**[OCI HPCチュートリアル集](../../#1-oci-hpcチュートリアル集)** の **[Terraform](../../#5-12-terraform)** を使用する自動構築でHPC/GPUクラスタを構築する際のBIOS設定を適用する方法は、HPCクラスタの場合は **OCI HPCチュートリアル集** の **[HPCクラスタを構築する(基礎インフラ自動構築編)](../../spinup-hpc-cluster-withterraform/)** の **[1-1-2. スタック作成](../../spinup-hpc-cluster-withterraform/#1-1-2-スタック作成)**(**[リソース・マネージャ](../../#5-2-リソースマネージャ)** を使用する場合)か **[1-2-3. Terraformスクリプト作成](../../spinup-hpc-cluster-withterraform/#1-2-3-terraformスクリプト作成)**(**[Terraform](../../#5-12-terraform)** CLIを使用する場合)を、GPUクラスタの場合は **OCI HPCチュートリアル集** の **[GPUクラスタを構築する(基礎インフラ自動構築編)](../../spinup-gpu-cluster-withterraform/)** の **[1-1-2. スタック作成](../../spinup-gpu-cluster-withterraform/#1-1-2-スタック作成)** ( **リソース・マネージャ** を使用する場合)か **[1-2-3. Terraformスクリプト作成](../../spinup-gpu-cluster-withterraform/#1-2-3-terraformスクリプト作成)** ( **Terraform** CLIを使用する場合)を参照してください。 ## 1-3. 単一インスタンス作成時にOCIコンソールで指定する方法 -**コンピュート・インスタンスの作成** 画面の以下 **イメージとシェイプ** フィールドで、 +**コンピュート・インスタンスの作成** 画面の以下 **イメージとシェイプ** フィールドで**シェイプの変更** ボタンをクリックし、 ![画面ショット](console_page01.png) -**シェイプの変更** ボタンをクリックして表示される以下 **すべてのシェイプの参照** サイドバーで **ベア・メタル・マシン** をクリックして表示される所望のシェイプ(ここでは **BM.Optimized3.36** )を選択し **詳細BIOS設定** ボタンをクリックし、 +表示される以下 **すべてのシェイプの参照** サイドバーで **ベア・メタル・マシン** をクリックして表示される所望のシェイプ(ここでは **BM.Optimized3.36** )を選択して **詳細BIOS設定** ボタンをクリックし、 ![画面ショット](console_page02.png) diff --git a/content/hpc/benchmark/run-omb-gpu/index.md b/content/hpc/benchmark/run-omb-gpu/index.md index 3157beab03..d150953720 100644 --- a/content/hpc/benchmark/run-omb-gpu/index.md +++ b/content/hpc/benchmark/run-omb-gpu/index.md @@ -47,7 +47,7 @@ params: | 方向 | ノード内/ノード間 | **D** ・ **H** 接続関係 | レイテンシ | 帯域幅 | | :--------------: | :-------: | :----------------: | :-----: | :----------: | | **D** -> **D** | ノード内 | - | 2.48 us | 279,578 MB/s | -| | 2ノード間 | - | 3.89 us | 11,962 MB/s | +| | 2ノード間 | - | 3.89 us | 23,056 MB/s | | **H** -> **D** | ノード内 | 同一NUMAノード | 1.30 us | 23,744 MB/s | | | | 同一ソケットで異なるNUMAノード | 1.66 us | 23,737 MB/s | | | | 異なるソケット | 1.92 us | 23,369 MB/s | @@ -55,6 +55,8 @@ params: | | | 同一ソケットで異なるNUMAノード | 1.65 us | 23,224 MB/s | | | | 異なるソケット | 1.92 us | 23,209 MB/s | +対象のイメージが **Oracle Linux** か **Ubuntu** かで手順の異なる箇所は、都度記載の注釈でどの手順を実行するかを判断します。 + 以降では、以下の順に解説します。 1. **[OSU Micro-Benchmarksインストール](#1-osu-micro-benchmarksインストール)** @@ -141,56 +143,56 @@ prepend-path PATH $pkg_root:$pkg_root/mpi/collective:$pkg_root/mpi/congestion:$p $ module load openmpi omb # For Oracle Linux $ module load nvhpc openmpi omb # For Ubuntu $ mpirun -n 2 --report-bindings osu_latency -x 1000 -i 10000 -m 1:1 -d cuda D D -[inst-wpdlx-ao-ub24:22411] Rank 0 bound to package[0][core:0] -[inst-wpdlx-ao-ub24:22411] Rank 1 bound to package[0][core:1] +[inst-aaaaa-ao-ub24:22411] Rank 0 bound to package[0][core:0] +[inst-aaaaa-ao-ub24:22411] Rank 1 bound to package[0][core:1] # OSU MPI-CUDA Latency Test v7.5 # Datatype: MPI_CHAR. # Size Avg Latency(us) 1 2.48 $ mpirun -n 2 --map-by pe-list=24,25:ordered --report-bindings numactl -l osu_latency -x 1000 -i 10000 -m 1:1 -d cuda H D -[inst-wpdlx-ao-ub24:22459] Rank 0 bound to package[0][core:24] -[inst-wpdlx-ao-ub24:22459] Rank 1 bound to package[0][core:25] +[inst-aaaaa-ao-ub24:22459] Rank 0 bound to package[0][core:24] +[inst-aaaaa-ao-ub24:22459] Rank 1 bound to package[0][core:25] # OSU MPI-CUDA Latency Test v7.5 # Datatype: MPI_CHAR. # Size Avg Latency(us) 1 1.30 $ mpirun -n 2 --map-by pe-list=0,25:ordered --report-bindings numactl -l osu_latency -x 1000 -i 10000 -m 1:1 -d cuda H D -[inst-wpdlx-ao-ub24:22511] Rank 0 bound to package[0][core:0] -[inst-wpdlx-ao-ub24:22511] Rank 1 bound to package[0][core:25] +[inst-aaaaa-ao-ub24:22511] Rank 0 bound to package[0][core:0] +[inst-aaaaa-ao-ub24:22511] Rank 1 bound to package[0][core:25] # OSU MPI-CUDA Latency Test v7.5 # Datatype: MPI_CHAR. # Size Avg Latency(us) 1 1.66 $ mpirun -n 2 --map-by pe-list=32,25:ordered --report-bindings numactl -l osu_latency -x 1000 -i 10000 -m 1:1 -d cuda H D -[inst-wpdlx-ao-ub24:22558] Rank 0 bound to package[1][core:32] -[inst-wpdlx-ao-ub24:22558] Rank 1 bound to package[0][core:25] +[inst-aaaaa-ao-ub24:22558] Rank 0 bound to package[1][core:32] +[inst-aaaaa-ao-ub24:22558] Rank 1 bound to package[0][core:25] # OSU MPI-CUDA Latency Test v7.5 # Datatype: MPI_CHAR. # Size Avg Latency(us) 1 1.92 $ mpirun -n 2 --map-by pe-list=25,24:ordered --report-bindings numactl -l osu_latency -x 1000 -i 10000 -m 1:1 -d cuda D H -[inst-wpdlx-ao-ub24:22630] Rank 0 bound to package[0][core:25] -[inst-wpdlx-ao-ub24:22630] Rank 1 bound to package[0][core:24] +[inst-aaaaa-ao-ub24:22630] Rank 0 bound to package[0][core:25] +[inst-aaaaa-ao-ub24:22630] Rank 1 bound to package[0][core:24] # OSU MPI-CUDA Latency Test v7.5 # Datatype: MPI_CHAR. # Size Avg Latency(us) 1 1.32 $ mpirun -n 2 --map-by pe-list=25,0:ordered --report-bindings numactl -l osu_latency -x 1000 -i 10000 -m 1:1 -d cuda D H -[inst-wpdlx-ao-ub24:22675] Rank 0 bound to package[0][core:25] -[inst-wpdlx-ao-ub24:22675] Rank 1 bound to package[0][core:0] +[inst-aaaaa-ao-ub24:22675] Rank 0 bound to package[0][core:25] +[inst-aaaaa-ao-ub24:22675] Rank 1 bound to package[0][core:0] # OSU MPI-CUDA Latency Test v7.5 # Datatype: MPI_CHAR. # Size Avg Latency(us) 1 1.65 $ mpirun -n 2 --map-by pe-list=25,32:ordered --report-bindings numactl -l osu_latency -x 1000 -i 10000 -m 1:1 -d cuda D H -[inst-wpdlx-ao-ub24:22722] Rank 0 bound to package[0][core:25] -[inst-wpdlx-ao-ub24:22722] Rank 1 bound to package[1][core:32] +[inst-aaaaa-ao-ub24:22722] Rank 0 bound to package[0][core:25] +[inst-aaaaa-ao-ub24:22722] Rank 1 bound to package[1][core:32] # OSU MPI-CUDA Latency Test v7.5 # Datatype: MPI_CHAR. @@ -208,56 +210,56 @@ $ $ module load openmpi omb # For Oracle Linux $ module load nvhpc openmpi omb # For Ubuntu $ mpirun -n 2 --report-bindings osu_bw -x 10 -i 10 -m 268435456:268435456 -d cuda D D -[inst-wpdlx-ao-ub24:22768] Rank 0 bound to package[0][core:0] -[inst-wpdlx-ao-ub24:22768] Rank 1 bound to package[0][core:1] +[inst-aaaaa-ao-ub24:22768] Rank 0 bound to package[0][core:0] +[inst-aaaaa-ao-ub24:22768] Rank 1 bound to package[0][core:1] # OSU MPI-CUDA Bandwidth Test v7.5 # Datatype: MPI_CHAR. # Size Bandwidth (MB/s) 268435456 279577.81 $ mpirun -n 2 --map-by pe-list=24,25:ordered --report-bindings numactl -l osu_bw -x 10 -i 10 -m 268435456:268435456 -d cuda H D -[inst-wpdlx-ao-ub24:22814] Rank 0 bound to package[0][core:24] -[inst-wpdlx-ao-ub24:22814] Rank 1 bound to package[0][core:25] +[inst-aaaaa-ao-ub24:22814] Rank 0 bound to package[0][core:24] +[inst-aaaaa-ao-ub24:22814] Rank 1 bound to package[0][core:25] # OSU MPI-CUDA Bandwidth Test v7.5 # Datatype: MPI_CHAR. # Size Bandwidth (MB/s) 268435456 23744.00 $ mpirun -n 2 --map-by pe-list=0,25:ordered --report-bindings numactl -l osu_bw -x 10 -i 10 -m 268435456:268435456 -d cuda H D -[inst-wpdlx-ao-ub24:22877] Rank 0 bound to package[0][core:0] -[inst-wpdlx-ao-ub24:22877] Rank 1 bound to package[0][core:25] +[inst-aaaaa-ao-ub24:22877] Rank 0 bound to package[0][core:0] +[inst-aaaaa-ao-ub24:22877] Rank 1 bound to package[0][core:25] # OSU MPI-CUDA Bandwidth Test v7.5 # Datatype: MPI_CHAR. # Size Bandwidth (MB/s) 268435456 23736.96 $ mpirun -n 2 --map-by pe-list=32,25:ordered --report-bindings numactl -l osu_bw -x 10 -i 10 -m 268435456:268435456 -d cuda H D -[inst-wpdlx-ao-ub24:22932] Rank 0 bound to package[1][core:32] -[inst-wpdlx-ao-ub24:22932] Rank 1 bound to package[0][core:25] +[inst-aaaaa-ao-ub24:22932] Rank 0 bound to package[1][core:32] +[inst-aaaaa-ao-ub24:22932] Rank 1 bound to package[0][core:25] # OSU MPI-CUDA Bandwidth Test v7.5 # Datatype: MPI_CHAR. # Size Bandwidth (MB/s) 268435456 23369.30 $ mpirun -n 2 --map-by pe-list=25,24:ordered --report-bindings numactl -l osu_bw -x 10 -i 10 -m 268435456:268435456 -d cuda D H -[inst-wpdlx-ao-ub24:23111] Rank 0 bound to package[0][core:25] -[inst-wpdlx-ao-ub24:23111] Rank 1 bound to package[0][core:24] +[inst-aaaaa-ao-ub24:23111] Rank 0 bound to package[0][core:25] +[inst-aaaaa-ao-ub24:23111] Rank 1 bound to package[0][core:24] # OSU MPI-CUDA Bandwidth Test v7.5 # Datatype: MPI_CHAR. # Size Bandwidth (MB/s) 268435456 23229.60 $ mpirun -n 2 --map-by pe-list=25,0:ordered --report-bindings numactl -l osu_bw -x 10 -i 10 -m 268435456:268435456 -d cuda D H -[inst-wpdlx-ao-ub24:23191] Rank 0 bound to package[0][core:25] -[inst-wpdlx-ao-ub24:23191] Rank 1 bound to package[0][core:0] +[inst-aaaaa-ao-ub24:23191] Rank 0 bound to package[0][core:25] +[inst-aaaaa-ao-ub24:23191] Rank 1 bound to package[0][core:0] # OSU MPI-CUDA Bandwidth Test v7.5 # Datatype: MPI_CHAR. # Size Bandwidth (MB/s) 268435456 23223.68 $ mpirun -n 2 --map-by pe-list=25,32:ordered --report-bindings numactl -l osu_bw -x 10 -i 10 -m 268435456:268435456 -d cuda D H -[inst-wpdlx-ao-ub24:23246] Rank 0 bound to package[0][core:25] -[inst-wpdlx-ao-ub24:23246] Rank 1 bound to package[1][core:32] +[inst-aaaaa-ao-ub24:23246] Rank 0 bound to package[0][core:25] +[inst-aaaaa-ao-ub24:23246] Rank 1 bound to package[1][core:32] # OSU MPI-CUDA Bandwidth Test v7.5 # Datatype: MPI_CHAR. @@ -272,9 +274,8 @@ $ 本章は、2ノードに跨るGPU番号0同士のメッセージサイズ1バイトでのレイテンシとメッセージサイズ256 MiBでの帯域幅を計測します。 -使用するGPU番号が0になるのは、 **OSU Micro-Benchmarks** がMPIプロセスを割り当てるGPUを決定する際、 **OpenMPI** の環境変数 **OMPI_COMM_WORLD_LOCAL_RANK** 環境変数と同じGPU番号とするためです。 - -使用するノード間接続ネットワークインターフェースは、GPU番号0と同一PCIeスイッチに接続する **mlx5_6** を指定しています。 +使用するGPU番号が0になるのは、 **OSU Micro-Benchmarks** がMPIプロセスを割り当てるGPUを決定する際、 **OpenMPI** の環境変数 **OMPI_COMM_WORLD_LOCAL_RANK** 環境変数と同じGPU番号とするためです。 +また、使用するノード間接続ネットワークインターフェースは、GPU番号0と同一PCIeスイッチに接続する **mlx5_6** と **mlx5_7** を指定しています。 ### 2-2-1. レイテンシ @@ -284,8 +285,8 @@ $ ```sh $ module load openmpi omb # For Oracle Linux $ module load nvhpc openmpi omb # For Ubuntu -$ 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 +$ mpirun -n 2 -N 1 -hostfile ~/hostlist.txt -x UCX_NET_DEVICES=mlx5_6:1,mlx5_7:1 -x PATH -x LD_LIBRARY_PATH osu_latency -x 1000 -i 10000 -m 1:1 -d cuda D D +[inst-aaaaa-ao:100892] SET UCX_NET_DEVICES=mlx5_6:1,mlx5_7:1 # OSU MPI-CUDA Latency Test v7.5 # Datatype: MPI_CHAR. @@ -302,13 +303,13 @@ $ ```sh $ module load openmpi omb # For Oracle Linux $ module load nvhpc openmpi omb # For Ubuntu -$ 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 +$ mpirun -n 2 -N 1 -hostfile ~/hostlist.txt -x UCX_NET_DEVICES=mlx5_6:1,mlx5_7:1 -x PATH -x LD_LIBRARY_PATH osu_bw -x 10 -i 10 -m 268435456:268435456 -d cuda D D +[inst-aaaaa-ao:100977] SET UCX_NET_DEVICES=mlx5_6:1,mlx5_7:1 # OSU MPI-CUDA Bandwidth Test v7.5 # Datatype: MPI_CHAR. # Size Bandwidth (MB/s) -268435456 11962.21 +268435456 23055.69 $ ``` @@ -323,7 +324,7 @@ $ $ module load openmpi omb # For Oracle Linux $ module load nvhpc openmpi omb # For Ubuntu $ 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 +[inst-aaaaa-ao-ub24:28293] SET UCX_NET_DEVICES=mlx5_6:1 #Using NCCL #Using NCCL #Using NCCL @@ -350,7 +351,7 @@ $ $ module load openmpi omb # For Oracle Linux $ module load nvhpc openmpi omb # For Ubuntu $ 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 +[inst-aaaaa-ao-ub24:28899] SET UCX_NET_DEVICES=mlx5_6:1 #Using NCCL #Using NCCL #Using NCCL diff --git a/content/hpc/benchmark/run-omb-hpc/index.md b/content/hpc/benchmark/run-omb-hpc/index.md index daf3928804..8213aa8d8e 100644 --- a/content/hpc/benchmark/run-omb-hpc/index.md +++ b/content/hpc/benchmark/run-omb-hpc/index.md @@ -136,7 +136,7 @@ $ ```sh $ module load openmpi omb $ mpirun -n 2 -N 1 -hostfile ~/hostlist.txt -x UCX_NET_DEVICES=mlx5_2:1 -x PATH osu_latency -x 1000 -i 10000 -m 1:1 -[inst-xsyjo-x9-ol905:263038] SET UCX_NET_DEVICES=mlx5_2:1 +[inst-aaaaa-x9:263038] SET UCX_NET_DEVICES=mlx5_2:1 # OSU MPI Latency Test v7.5 # Datatype: MPI_CHAR. @@ -153,7 +153,7 @@ $ ```sh $ module load openmpi omb $ mpirun -n 2 -N 1 -hostfile ~/hostlist.txt -x UCX_NET_DEVICES=mlx5_2:1 -x PATH osu_bw -x 10 -i 10 -m 268435456:268435456 -[inst-xsyjo-x9-ol905:263198] SET UCX_NET_DEVICES=mlx5_2:1 +[inst-aaaaa-x9:263198] SET UCX_NET_DEVICES=mlx5_2:1 # OSU MPI Bandwidth Test v7.5 # Datatype: MPI_CHAR. @@ -170,7 +170,7 @@ $ ```sh $ module load openmpi omb $ mpirun -n 144 -N 36 -hostfile ~/hostlist.txt -x UCX_NET_DEVICES=mlx5_2:1 -x PATH osu_allreduce -x 10 -i 10 -m 4:268435456 -[inst-ztgl1-x9-ol810:227754] SET UCX_NET_DEVICES=mlx5_2:1 +[inst-aaaaa-x9:227754] SET UCX_NET_DEVICES=mlx5_2:1 # OSU MPI Allreduce Latency Test v7.5 # Datatype: MPI_INT. @@ -213,7 +213,7 @@ $ ```sh $ module load openmpi omb $ mpirun -n 144 -N 36 -hostfile ~/hostlist.txt -x UCX_NET_DEVICES=mlx5_2:1 -x PATH osu_init -[inst-ntoae-x9-ol810:19647] SET UCX_NET_DEVICES=mlx5_2:1 +[inst-aaaaa-x9:19647] SET UCX_NET_DEVICES=mlx5_2:1 # OSU MPI Init Test v7.5 nprocs: 144, min: 2170 ms, max: 2216 ms, avg: 2187 ms $ diff --git a/content/hpc/tech-knowhow/build-openmpi/index.md b/content/hpc/tech-knowhow/build-openmpi/index.md index 2582a43680..83f8044ae1 100644 --- a/content/hpc/tech-knowhow/build-openmpi/index.md +++ b/content/hpc/tech-knowhow/build-openmpi/index.md @@ -56,6 +56,7 @@ params: - **[NAS Parallel Benchmarks](https://www.nas.nasa.gov/software/npb.html)** 本テクニカルTipsは、以下の環境を前提とし、 + - 計算ノード - シェイプ: **[BM.Optimized3.36](https://docs.oracle.com/ja-jp/iaas/Content/Compute/References/computeshapes.htm#bm-hpc-optimized)** - イメージ: **Oracle Linux** 8.10 / 9.05ベースのHPC **[クラスタネットワーキングイメージ](../../#5-13-クラスタネットワーキングイメージ)** (※1) @@ -70,7 +71,7 @@ params: ※1)**[OCI HPCテクニカルTips集](../../#3-oci-hpcテクニカルtips集)** の **[クラスタネットワーキングイメージの選び方](../../tech-knowhow/osimage-for-cluster/)** の **[1. クラスタネットワーキングイメージ一覧](../../tech-knowhow/osimage-for-cluster/#1-クラスタネットワーキングイメージ一覧)** のイメージ **No.12** / **No.13** です。 ※2)**[OCI HPCテクニカルTips集](../../#3-oci-hpcテクニカルtips集)** の **[クラスタネットワーキングイメージの選び方](../../tech-knowhow/osimage-for-cluster/)** の **[1. クラスタネットワーキングイメージ一覧](../../tech-knowhow/osimage-for-cluster/#1-クラスタネットワーキングイメージ一覧)** のイメージ **No.15** です。 -**Oracle Linux** のバージョンと計算ノードかGPUノードかによる構築方法の違いは、以降の構築手順中の注釈で判断します。 +**Oracle Linux** のバージョンと計算ノードかGPUノードかで手順の異なる箇所は、都度記載の注釈でどの手順を実行するかを判断します。 本テクニカルTipsに従い **OpenMPI** 環境を構築する計算/GPUノードは、 **[クラスタ・ネットワーク](../../#5-1-クラスタネットワーク)** でノード間を接続し、稼働確認を行うために少なくとも2ノード用意します。 この構築手順は、 **[OCI HPCチュートリアル集](../../#1-oci-hpcチュートリアル集)** の **[HPCクラスタを構築する(基礎インフラ手動構築編)](../../spinup-cluster-network/)** / **[GPUクラスタを構築する(基礎インフラ自動構築編)](../../spinup-gpu-cluster/)** が参考になります。 @@ -346,7 +347,7 @@ $ for hname in `cat ~/hostlist.txt`; do echo $hname; ssh -oStrictHostKeyChecking **OpenMPI** 利用ユーザのホームディレクトリがノード間で共有されていることを前提に、以下コマンドを何れか1ノードで **OpenMPI** を利用するユーザで実行し、 **NAS Parallel Benchmarks** をインストールします。 ```sh -$ cd ~ && wget https://www.nas.nasa.gov/assets/npb/NPB3.4.3-MZ.tar.gz +$ mkdir -p ~/`hostname` && cd ~/`hostname` && wget https://www.nas.nasa.gov/assets/npb/NPB3.4.3-MZ.tar.gz $ tar -xvf ./NPB3.4.3-MZ.tar.gz $ cd NPB3.4.3-MZ/NPB3.4-MZ-MPI $ cp config/make.def.template config/make.def diff --git a/content/hpc/tech-knowhow/container-with-containerd/index.md b/content/hpc/tech-knowhow/container-with-containerd/index.md index 19f6c50d9a..609322cdea 100644 --- a/content/hpc/tech-knowhow/container-with-containerd/index.md +++ b/content/hpc/tech-knowhow/container-with-containerd/index.md @@ -18,10 +18,10 @@ params: - rootlessコンテナ: **[rootlesskit](https://github.com/rootless-containers/rootlesskit)** - rootlessコンテナ通信速度高速化: **[bypass4netns](https://github.com/rootless-containers/bypass4netns)** -本テクニカルTipsは、 **[OCI HPCチュートリアル集](../../#1-oci-hpcチュートリアル集)** のカテゴリ **[機械学習環境](../../#1-2-機械学習環境)** のチュートリアル **[GPUインスタンスで分散機械学習環境を構築する](../../spinup-ml-instance-cntnd/)** / **[GPUクラスタを構築する(基礎インフラ手動構築編)](../../spinup-gpu-cluster/)** / **[GPUクラスタを構築する(基礎インフラ自動構築編)](../../spinup-gpu-cluster-withterraform/)** の手順に従う等により、NVIDIA GPUを搭載するGPUインスタンスが予め作成されていることを前提に、ここに **containerd** と前述のソフトウェア群をインストールして **[NGC Catalog](https://catalog.ngc.nvidia.com/)** から提供されるコンテナを非特権ユーザ(以降"コンテナ起動ユーザ"と呼称します。)権限で起動するまでの手順を、以下の順に解説します。 +本テクニカルTipsは、 **[OCI HPCチュートリアル集](../../#1-oci-hpcチュートリアル集)** のカテゴリ **[機械学習環境](../../#1-2-機械学習環境)** のチュートリアル **[GPUインスタンスで分散機械学習環境を構築する](../../spinup-ml-instance-cntnd/)** / **[GPUクラスタを構築する(基礎インフラ手動構築編)](../../spinup-gpu-cluster/)** / **[GPUクラスタを構築する(基礎インフラ自動構築編)](../../spinup-gpu-cluster-withterraform/)** の手順に従う等により、NVIDIA GPUを搭載するGPUインスタンスが予め作成されていることを前提に、ここに **containerd** と前述のソフトウェア群をインストールして **[NGC Catalog](https://catalog.ngc.nvidia.com/)** から提供されるコンテナを非特権ユーザ(以降"コンテナユーザ"と呼称します。)権限で起動するまでの手順を、以下の順に解説します。 1. **[コンテナ環境構築](#1-コンテナ環境構築)** -2. **[コンテナ起動ユーザ作成](#2-コンテナ起動ユーザ作成)** +2. **[コンテナユーザ作成](#2-コンテナユーザ作成)** 3. **[コンテナランタイム起動](#3-コンテナランタイム起動)** 4. **[コンテナ起動・稼働確認](#4-コンテナ起動稼働確認)** @@ -120,9 +120,9 @@ $ tar -xvf ./v0.4.2.tar.gz $ cd bypass4netns-0.4.2 && make -j 128 && sudo make install ``` -# 2. コンテナ起動ユーザ作成 +# 2. コンテナユーザ作成 -本章は、コンテナ起動ユーザを作成し、このユーザでコンテナを起動するための必要な設定を行います。 +本章は、コンテナユーザを作成し、このユーザでコンテナを起動するための必要な設定を行います。 以下コマンドをGPUインスタンスのopcユーザで実行し、ユーザのmemlock設定値を無制限に変更します。 なお、この設定が既に入っている場合は、改めて実施する必要はありません。 @@ -134,15 +134,15 @@ $ cat < EOF ``` -次に、GPUインスタンスでコンテナ起動ユーザ(ここでは **usera** とします。)を作成し、SSHでログイン可能となるようにSSH公開鍵を登録します。 +次に、GPUインスタンスでコンテナユーザ(ここでは **usera** とします。)を作成し、SSHでログイン可能となるようにSSH公開鍵を登録します。 -次に、以下コマンドをGPUインスタンスのopcユーザで実行し、コンテナ起動ユーザのコンテナイメージ等のファイルを格納するディレクトリをNVMe SSDローカルディスク領域( **/mnt/localdisk** にマウントされているとします。)に作成します。 +次に、以下コマンドをGPUインスタンスのopcユーザで実行し、コンテナユーザのコンテナイメージ等のファイルを格納するディレクトリをNVMe SSDローカルディスク領域( **/mnt/localdisk** にマウントされているとします。)に作成します。 ```sh $ sudo mkdir -p /mnt/localdisk/usera/root /mnt/localdisk/usera/state && sudo chown -R usera:usera /mnt/localdisk/usera ``` -次に、SSHでGPUインスタンスにコンテナ起動ユーザでログインして以下コマンドを実行し、コンテナイメージ等のファイルを格納するディレクトリを登録します。 +次に、SSHでGPUインスタンスにコンテナユーザでログインして以下コマンドを実行し、コンテナイメージ等のファイルを格納するディレクトリを登録します。 ```sh $ mkdir -p ~/.config/containerd @@ -156,7 +156,7 @@ $ cat << EOF > ~/.config/containerd/config.toml 本章は、rootlessコンテナの **rootlesskit** とrootlessコンテナの通信速度を高速化する **bypass4netns** のコンテナランタイム関連サービスを起動します。 -SSHでGPUインスタンスにコンテナ起動ユーザでログインして以下コマンドを実行し、 **rootlesskit** と **bypass4netns** をユーザモードの **systemd** サービスとして起動し、コマンド出力からその起動を確認します。 +SSHでGPUインスタンスにコンテナユーザでログインして以下コマンドを実行し、 **rootlesskit** と **bypass4netns** をユーザモードの **systemd** サービスとして起動し、コマンド出力からその起動を確認します。 ```sh $ containerd-rootless-setuptool.sh install @@ -192,7 +192,7 @@ $ ## 4-0. 概要 -本章は、コンテナ起動ユーザで **NGC Catalog** から提供されるコンテナを起動し、起動するコンテナ上で稼働確認を実施します。 +本章は、コンテナユーザで **NGC Catalog** から提供されるコンテナを起動し、起動するコンテナ上で稼働確認を実施します。 この際、以下のユースケース毎にコンテナ起動・稼働確認の手順を解説します。 @@ -203,7 +203,7 @@ $ ## 4-1. 単一GPUインスタンスに閉じたコンテナ利用 -以下コマンドをGPUインスタンスのコンテナ起動ユーザで実行し、 **NGC Catalog** から提供される **Ubuntu** コンテナをブリッジネットワークモードで起動します。 +以下コマンドをGPUインスタンスのコンテナユーザで実行し、 **NGC Catalog** から提供される **Ubuntu** コンテナをブリッジネットワークモードで起動します。 ```sh $ nerdctl run -it --rm --gpus all --annotation nerdctl/bypass4netns=true nvcr.io/nvidia/base/ubuntu:22.04_20240212 @@ -266,7 +266,7 @@ $ ## 4-2. 異なるGPUインスタンスに跨るコンテナ利用 -以下コマンドを全てのGPUインスタンスのコンテナ起動ユーザで実行し、 **NGC Catalog** から提供される **Ubuntu** コンテナをホストネットワークモードで起動します。 +以下コマンドを全てのGPUインスタンスのコンテナユーザで実行し、 **NGC Catalog** から提供される **Ubuntu** コンテナをホストネットワークモードで起動します。 ```sh $ nerdctl run -it --rm --gpus all --network=host nvcr.io/nvidia/base/ubuntu:22.04_20240212 diff --git a/content/hpc/tech-knowhow/container-with-singularity/index.md b/content/hpc/tech-knowhow/container-with-singularity/index.md index f164a16dbd..1e698020e7 100644 --- a/content/hpc/tech-knowhow/container-with-singularity/index.md +++ b/content/hpc/tech-knowhow/container-with-singularity/index.md @@ -14,51 +14,57 @@ params: - 可搬性に優れ改変不可能なシングルファイル形式 **SIF(Singularity Image Format)** の採用 - ホスト・コンテナ間の隔離より統合を重視することでコンテナからインターコネクトやGPUを容易に利用することが可能 -- Linuxカーネルのユーザ名前空間を活用した非特権ユーザのコンテナ実行による堅牢なセキュリティ +- Linuxカーネルのユーザ名前空間を活用した非特権ユーザ(※1)のコンテナ実行による堅牢なセキュリティ - **[OCI(Open Container Initiative)仕様](https://github.com/opencontainers/image-spec)** に準拠するコンテナイメージへの対応 -本テクニカルTipsは、 **[クラスタ・ネットワーク](../../#5-1-クラスタネットワーク)** でノード間接続するHPCクラスタ上に **SingularityCE** で構築されたコンテナ環境でMPI並列アプリケーションを実行することを念頭に、計算ノードに **SingularityCE** をインストールし、ここで起動する **Ubuntu** のコンテナに **[OpenMPI](https://www.open-mpi.org/)** と **[OSU Micro-Benchmarks](https://mvapich.cse.ohio-state.edu/benchmarks/)** をインストールして **SIF** のカスタムコンテナイメージを作成、このコンテナイメージを使用して2ノード間のレイテンシと帯域幅を計測します。 +※1)以降"コンテナユーザ"と呼称します。 + +本テクニカルTipsは、 **[クラスタ・ネットワーク](../../#5-1-クラスタネットワーク)** でノード間接続するHPC/GPUクラスタ上に **SingularityCE** で構築されたコンテナ環境でMPI並列アプリケーションを実行することを念頭に、計算/GPUノードに **SingularityCE** をインストールし、ここで起動する **Ubuntu** のコンテナに **[OpenMPI](https://www.open-mpi.org/)** ・ **[NVIDIA HPC SDK](https://developer.nvidia.com/hpc-sdk)** ・ **[OSU Micro-Benchmarks](https://mvapich.cse.ohio-state.edu/benchmarks/)** 等のソフトウェアをインストールしてHPC/GPUクラスタで有用な **SIF** のカスタムコンテナイメージを作成、このコンテナイメージを使用して性能検証を含めた稼働確認を実施します。 またこの計測を **[Slurm](https://slurm.schedmd.com/)** 環境で実行し、コンテナ上で実行するMPI並列アプリケーションがバッチジョブでも実行できることを確認します。 -本テクニカルTipsは、 **[OCI HPCチュートリアル集](../../#1-oci-hpcチュートリアル集)** の **[HPCクラスタを構築する(基礎インフラ手動構築編)](../../spinup-cluster-network/)** / **[HPCクラスタを構築する(基礎インフラ自動構築編)](../../spinup-hpc-cluster-withterraform/)** に従い予め **[クラスタ・ネットワーク](../../#5-1-クラスタネットワーク)** に接続するHPCクラスタが作成されており、 **[OCI HPCテクニカルTips集](../../#3-oci-hpcテクニカルtips集)** の **[Slurmによるリソース管理・ジョブ管理システム構築方法](../../tech-knowhow/setup-slurm-cluster/)** に従い予め **Slurm** 環境が構築されている(※1)ことを前提に、計算ノードに **SingularityCE** をインストールしてコンテナ環境を構築する手順を以下の順に解説します。 +本テクニカルTipsは、 **[OCI HPCチュートリアル集](../../#1-oci-hpcチュートリアル集)** の **[HPCクラスタを構築する(基礎インフラ手動構築編)](../../spinup-cluster-network/)** / **[GPUクラスタを構築する(基礎インフラ自動構築編)](../../spinup-gpu-cluster/)** の手順に従う等で予め **[クラスタ・ネットワーク](../../#5-1-クラスタネットワーク)** に接続する少なくとも2ノードの計算/GPUノードを有するHPC/GPUクラスタが作成されており、 **[OCI HPCテクニカルTips集](../../#3-oci-hpcテクニカルtips集)** の **[Slurmによるリソース管理・ジョブ管理システム構築方法](../../tech-knowhow/setup-slurm-cluster/)** に従い予め **Slurm** 環境が構築されている(※2)ことを前提に、計算/GPUノードに **SingularityCE** をインストールしてコンテナ環境を構築する手順を以下の順に解説します。 1. **[OpenMPIインストール](#1-openmpiインストール)** -2. **[計算ノードのSlurm環境への登録](#2-計算ノードのslurm環境への登録)** +2. **[計算/GPUノードのSlurm環境への登録](#2-計算gpuノードのslurm環境への登録)** 3. **[SingularityCEインストール](#3-singularityceインストール)** -4. **[コンテナ起動ユーザ作成](#4-コンテナ起動ユーザ作成)** +4. **[コンテナユーザ作成](#4-コンテナユーザ作成)** 5. **[コンテナイメージ作成](#5-コンテナイメージ作成)** 6. **[稼働確認](#6-稼働確認)** -※1)コンテナ上で実行するMPI並列アプリケーションをバッチジョブで実行する必要がない場合は、 **Slurm** 環境が予め構築されている必要はありません。 +※2)コンテナ上で実行するMPI並列アプリケーションをバッチジョブで実行する必要がない場合は、 **Slurm** 環境が予め構築されている必要はありません。 -本テクニカルTipsは、以下の環境を前提とします。 +本テクニカルTipsは、以下の環境を前提とし、 - 計算ノード - - **シェイプ** : **[BM.Optimized3.36](https://docs.oracle.com/ja-jp/iaas/Content/Compute/References/computeshapes.htm#bm-hpc-optimized)** - - **イメージ** : **Oracle Linux** 9.5ベースのHPC **[クラスタネットワーキングイメージ](../../#5-13-クラスタネットワーキングイメージ)** (※1) - - ノード数: 2 - - ノード間接続インターコネクト : **クラスタ・ネットワーク** + - シェイプ: **[BM.Optimized3.36](https://docs.oracle.com/ja-jp/iaas/Content/Compute/References/computeshapes.htm#bm-hpc-optimized)** + - イメージ: **Oracle Linux** 9.05ベースのHPC **[クラスタネットワーキングイメージ](../../#5-13-クラスタネットワーキングイメージ)** (※3) +- GPUノード + - シェイプ: **[BM.GPU4.8/BM.GPU.A100-v2.8](https://docs.oracle.com/ja-jp/iaas/Content/Compute/References/computeshapes.htm#bm-gpu)** + - イメージ: **Oracle Linux** 9.05ベースのGPU **[クラスタネットワーキングイメージ](../../#5-13-クラスタネットワーキングイメージ)** (※4) - **SingularityCE** : 4.3.4 -※1)**[OCI HPCテクニカルTips集](../../#3-oci-hpcテクニカルtips集)** の **[クラスタネットワーキングイメージの選び方](../../tech-knowhow/osimage-for-cluster/)** の **[1. クラスタネットワーキングイメージ一覧](../../tech-knowhow/osimage-for-cluster/#1-クラスタネットワーキングイメージ一覧)** のイメージ **No.13** です。 +※3)**[OCI HPCテクニカルTips集](../../#3-oci-hpcテクニカルtips集)** の **[クラスタネットワーキングイメージの選び方](../../tech-knowhow/osimage-for-cluster/)** の **[1. クラスタネットワーキングイメージ一覧](../../tech-knowhow/osimage-for-cluster/#1-クラスタネットワーキングイメージ一覧)** のイメージ **No.13** です。 +※4)**[OCI HPCテクニカルTips集](../../#3-oci-hpcテクニカルtips集)** の **[クラスタネットワーキングイメージの選び方](../../tech-knowhow/osimage-for-cluster/)** の **[1. クラスタネットワーキングイメージ一覧](../../tech-knowhow/osimage-for-cluster/#1-クラスタネットワーキングイメージ一覧)** のイメージ **No.15** です。 + +対象がHPCクラスタかGPUクラスタかで手順の異なる箇所は、都度記載の注釈でどの手順を実行するかを判断します。 -また本テクニカルTipsは、コンテナ起動ユーザのホームディレクトリが全ての計算ノードで共有されていることを前提に記載します。 +また本テクニカルTipsは、コンテナユーザのホームディレクトリが全ての計算ノードで共有されていることを前提に記載します。 # 1. OpenMPIインストール -本章は、計算ノードに **OpenMPI** をインストールします。 +本章は、計算/GPUノードに **OpenMPI** をインストールします。 **OpenMPI** のインストールは、 **[OCI HPCテクニカルTips集](../../#3-oci-hpcテクニカルtips集)** の **[Slurm環境での利用を前提とするUCX通信フレームワークベースのOpenMPI構築方法](../../tech-knowhow/build-openmpi/)** の **[1. インストール・セットアップ](../../tech-knowhow/build-openmpi/#1-インストールセットアップ)** の手順に従い実施します。 -# 2. 計算ノードのSlurm環境への登録 +# 2. 計算/GPUノードのSlurm環境への登録 -本章は、計算ノードを既存の **Slurm** 環境に登録します。 +本章は、計算/GPUノードを既存の **Slurm** 環境に登録します。 -計算ノードの **Slurm** 環境への登録は、 **[OCI HPCテクニカルTips集](../../#3-oci-hpcテクニカルtips集)** の **[Slurmによるリソース管理・ジョブ管理システム構築方法](../../tech-knowhow/setup-slurm-cluster/)** の **[2. 環境構築](../../tech-knowhow/setup-slurm-cluster/#2-環境構築)** の計算ノードに対する手順を実施することで行います。 +計算/GPUノードの **Slurm** 環境への登録は、 **[OCI HPCテクニカルTips集](../../#3-oci-hpcテクニカルtips集)** の **[Slurmによるリソース管理・ジョブ管理システム構築方法](../../tech-knowhow/setup-slurm-cluster/)** の **[2. 環境構築](../../tech-knowhow/setup-slurm-cluster/#2-環境構築)** の計算/GPUノードに対する手順を実施することで行います。 # 3. SingularityCEインストール -本章は、計算ノードに **SingularityCE** をインストールします。 +本章は、計算/GPUノードに **SingularityCE** をインストールします。 以下コマンドをopcユーザで実行し、 **SingularityCE** をインストールします。 なお、makeコマンドの並列数は当該ノードのコア数に合わせて調整します。 @@ -74,19 +80,19 @@ $ tar -xvf singularity-ce-4.3.4.tar.gz $ cd singularity-ce-4.3.4 && ./mconfig && make -j 36 -C builddir && sudo make -C builddir install; echo $? ``` -# 4. コンテナ起動ユーザ作成 +# 4. コンテナユーザ作成 -本章は、計算ノードにコンテナ起動ユーザを作成し、このユーザでコンテナを起動するための必要な設定を行います。 +本章は、計算/GPUノードにコンテナユーザを作成し、このユーザでコンテナを起動するための必要な設定を行います。 -コンテナ起動ユーザ(ここでは **usera** とします。)をLinuxのユーザとして作成します。 +コンテナユーザ(ここでは **usera** とします。)をLinuxのユーザとして作成します。 -次に、以下コマンドをopcユーザで実行し、コンテナ起動ユーザのコンテナイメージファイル等を格納するディレクトリをNVMe SSDローカルディスク領域( **/mnt/localdisk** にマウントされているとします。)に作成します。 +次に、以下コマンドをopcユーザで実行し、コンテナユーザのコンテナイメージファイル等を格納するディレクトリをNVMe SSDローカルディスク領域( **/mnt/localdisk** にマウントされているとします。)に作成します。 ```sh $ sudo mkdir -p /mnt/localdisk/usera && sudo chown usera:usera /mnt/localdisk/usera ``` -次に、以下コマンドを何れかの計算ノードでコンテナ起動ユーザで実行し、コンテナイメージファイル等を格納するディレクトリを指定する環境変数を設定します。 +次に、以下コマンドを何れかの計算/GPUノードでコンテナユーザで実行し、コンテナイメージファイル等を格納するディレクトリを指定する環境変数を設定します。 ```sh $ echo "export SINGULARITY_CACHEDIR=/mnt/localdisk/usera" | tee -a ~/.bashrc @@ -94,7 +100,7 @@ $ echo "export SINGULARITY_TMPDIR=/mnt/localdisk/usera" | tee -a ~/.bashrc $ source ~/.bashrc ``` -次に、以下コマンドをコンテナ起動ユーザで実行し、コンテナの起動を確認します。 +次に、以下コマンドをコンテナユーザで実行し、コンテナの起動を確認します。 ```sh $ singularity exec docker://ubuntu:noble-20251013 grep PRETTY /etc/os-release @@ -111,10 +117,28 @@ $ # 5. コンテナイメージ作成 -本章は、 **Ubuntu** のコンテナイメージを元に **sandbox** コンテナを作成し、このコンテナに **OpenMPI** と **OSU Micro-Benchmarks** をインストール、このコンテナから **SIF** のコンテナイメージを作成します。 +## 5-0. 概要 + +本章は、 **Ubuntu** のコンテナイメージを元に **sandbox** コンテナを作成・起動してHPC/GPUクラスタに有用なソフトウェアをインストールし、このコンテナから **SIF** のコンテナイメージを作成します。 +ここでインストールするソフトウェアは、対象がHPCクラスタかGPUクラスタかにより以下とします。 + +- HPCクラスタ向けコンテナにインストールするソフトウェア + - **OpenMPI** + - **OSU Micro-Benchmarks** +- GPUクラスタ向けコンテナにインストールするソフトウェア + - **[NVIDIA Driver](https://docs.nvidia.com/datacenter/tesla/driver-installation-guide/index.html#)** + - **[NVIDIA CUDA](https://docs.nvidia.com/cuda/cuda-installation-guide-linux/contents.html)** + - **NVIDIA HPC SDK** + - **OpenMPI** + - **OSU Micro-Benchmarks** + +以降では、HPC/GPUクラスタ向けのコンテナ毎にその作成手順を解説します。 + なお、コマンドブロック中の **Singularity>** はコンテナ内のプロンプトを表しており、これに続くコマンドは起動したコンテナ上で実行することを意味します。 -以下コマンドをコンテナ起動ユーザで実行し、 **sandbox** コンテナ用のディレクトリを作成してここからコンテナを起動します。 +## 5-1. HPCクラスタ向けコンテナ作成 + +以下コマンドをコンテナユーザで実行し、 **sandbox** コンテナ用のディレクトリを作成してここからコンテナを起動します。 ```sh $ cd /mnt/localdisk/usera && singularity build --sandbox ubuntu_noble_ompi/ docker://ubuntu:noble-20251013 @@ -125,7 +149,8 @@ $ module purge $ singularity run --writable --fakeroot --bind /mnt/localdisk/usera:/mnt/localdisk/root ubuntu_noble_ompi/ ``` -次に、以下コマンドをコンテナ起動ユーザで実行し、 **OpenMPI** の前提ソフトウェアを **sandbox** コンテナにインストールします。 +次に、以下コマンドをコンテナユーザで実行し、 **OpenMPI** の前提ソフトウェアを **sandbox** コンテナにインストールします。 +なお、makeコマンドの並列数は当該ノードのコア数に合わせて調整します。 ```sh Singularity> apt update @@ -154,7 +179,8 @@ Singularity> cd ./ucc-1.5.0/ && ./autogen.sh && ./configure --prefix=/opt/ucc -- Singularity> make -j 36 && make install; echo $? ``` -次に、以下コマンドをコンテナ起動ユーザで実行し、 **OpenMPI** を **sandbox** コンテナの **/opt/openmpi** にインストールします。 +次に、以下コマンドをコンテナユーザで実行し、 **OpenMPI** を **sandbox** コンテナの **/opt/openmpi** にインストールします。 +なお、makeコマンドの並列数は当該ノードのコア数に合わせて調整します。 ```sh Singularity> cd /mnt/localdisk/root/`hostname` && wget https://download.open-mpi.org/release/open-mpi/v5.0/openmpi-5.0.8.tar.gz @@ -197,7 +223,7 @@ prepend-path CPLUS_INCLUDE_PATH $pkg_root/include prepend-path MANPATH $pkg_root/share/man ``` -次に、以下コマンドをコンテナ起動ユーザで実行し、 **OSU Micro-Benchmarks** を **sandbox** コンテナの **/opt/openmpi/tests/omb** にインストールします。 +次に、以下コマンドをコンテナユーザで実行し、 **OSU Micro-Benchmarks** を **sandbox** コンテナの **/opt/openmpi/tests/omb** にインストールします。 ```sh Singularity> cd /mnt/localdisk/root/`hostname` && wget https://mvapich.cse.ohio-state.edu/download/mvapich/osu-micro-benchmarks-7.5.1.tar.gz @@ -208,7 +234,7 @@ Singularity> make -j 36 && make install; echo $? ``` 次に、以下のファイルを **sandbox** コンテナ上の **/usr/share/Modules/modulefiles/omb** で作成します。 -このファイルは、 **[Environment Modules](https://envmodules.io/)** にモジュール名 **omb** を登録し、これをロードすることで **OSU Micro-Benchmarks** 利用環境の設定を可能にします。 +このファイルは、 **Environment Modules** にモジュール名 **omb** を登録し、これをロードすることで **OSU Micro-Benchmarks** 利用環境の設定を可能にします。 ```sh #%Module1.0 @@ -237,34 +263,245 @@ source /etc/profile.d/modules.sh module load openmpi omb ``` -次に、以下コマンドをコンテナ起動ユーザで実行し、作成した **sandbox** コンテナを使用して - **OSU Micro-Benchmarks** が動作することを確認します。 +次に、以下コマンドをコンテナユーザで実行し、作成した **sandbox** コンテナから **SIF** のコンテナイメージを作成します。 +この際、 **SIF** ファイルを作成するディレクトリが全ての計算ノードで共有されている点に留意します。 + +```sh +$ mkdir -p ~/singularity && singularity build ~/singularity/ubuntu_noble_ompi.sif ubuntu_noble_ompi/ +``` + +## 5-2. GPUクラスタ向けコンテナ作成 +以下コマンドをコンテナユーザで実行し、 **sandbox** コンテナ用のディレクトリを作成してここからコンテナを起動します。 ```sh +$ cd /mnt/localdisk/usera && singularity build --sandbox ubuntu_noble_gpu/ docker://ubuntu:noble-20251013 +$ singularity run --writable --fakeroot ubuntu_noble_gpu/ +Singularity> mkdir -p /mnt/localdisk/root /lib/modules /usr/src/kernels Singularity> exit -$ module load openmpi -$ mpirun -n 36 singularity exec ubuntu_noble_ompi/ osu_alltoall -x 1 -i 1 -m 67108864:67108864 +$ module purge +$ singularity run --writable --fakeroot --bind /mnt/localdisk/usera:/mnt/localdisk/root --bind /lib/modules:/lib/modules --bind /usr/src/kernels:/usr/src/kernels ubuntu_noble_gpu/ +``` -# OSU MPI All-to-All Personalized Exchange Latency Test v7.5 -# Datatype: MPI_CHAR. -# Size Avg Latency(us) -67108864 772123.24 -$ +次に、以下コマンドをコンテナユーザで実行し、以降でインストールするソフトウェアの前提ソフトウェアを **sandbox** コンテナにインストールします。 + +```sh +Singularity> apt update +Singularity> apt install -y locales +Singularity> locale-gen en_US.UTF-8 && update-locale LANG=en_US.UTF-8 +Singularity> export LANG=en_US.UTF-8 +Singularity> echo "tzdata tzdata/Areas select Asia" | debconf-set-selections +Singularity> echo "tzdata tzdata/Zones/Asia select Tokyo" | debconf-set-selections +Singularity> echo "keyboard-configuration keyboard-configuration/layout select us" | debconf-set-selections +Singularity> DEBIAN_FRONTEND=noninteractive apt install -y tzdata wget build-essential openssl libssl-dev zlib1g-dev autoconf libtool vim environment-modules libnuma-dev libibverbs-dev librdmacm-dev tcl curl gnupg pkg-config cmake unzip keyboard-configuration git +Singularity> dpkg-reconfigure -f noninteractive keyboard-configuration ``` -次に、以下コマンドをコンテナ起動ユーザで実行し、作成した **sandbox** コンテナから **SIF** のコンテナイメージを作成します。 -この際、 **SIF** ファイルを作成するディレクトリが全ての計算ノードで共有されている点に留意します。 +次に、以下コマンドをコンテナユーザで実行し、 **NVIDIA Driver** 、 **NVIDIA CUDA** 、及び **NVIDIA HPC SDK** を **sandbox** コンテナにインストールします。 +なお、ここでインストールする **NVIDIA Driver** のバージョンは、ホストOSの **NVIDIA Driver** のバージョンと一致する必要がある点に留意します。 ```sh -$ mkdir -p ~/singularity && singularity build ~/singularity/ubuntu_noble_ompi.sif ubuntu_noble_ompi/ +Singularity> distribution=$(. /etc/os-release;echo $ID$VERSION_ID | sed -e 's/\.//g') +Singularity> mkdir /mnt/localdisk/root/`hostname` && cd /mnt/localdisk/root/`hostname` && wget https://developer.download.nvidia.com/compute/cuda/repos/$distribution/x86_64/cuda-keyring_1.1-1_all.deb +Singularity> dpkg -i cuda-keyring_1.1-1_all.deb +Singularity> curl https://developer.download.nvidia.com/hpc-sdk/ubuntu/DEB-GPG-KEY-NVIDIA-HPC-SDK | gpg --dearmor -o /usr/share/keyrings/nvidia-hpcsdk-archive-keyring.gpg +Singularity> echo 'deb [signed-by=/usr/share/keyrings/nvidia-hpcsdk-archive-keyring.gpg] https://developer.download.nvidia.com/hpc-sdk/ubuntu/amd64 /' | tee /etc/apt/sources.list.d/nvhpc.list +Singularity> apt update +Singularity> apt install -y cuda-drivers-570 cuda-toolkit-12-9 nvhpc-25-7-cuda-multi +Singularity> mkdir -p /usr/share/Modules +Singularity> ln -s /usr/share/modules/modulefiles /usr/share/Modules/modulefiles +Singularity> ln -s /usr/lib/x86_64-linux-gnu /usr/share/Modules/libexec +Singularity> cp -p /opt/nvidia/hpc_sdk/modulefiles/nvhpc/25.7 /usr/share/Modules/modulefiles/nvhpc +``` + +次に、以下コマンドをコンテナユーザで実行し、 **OpenMPI** の前提ソフトウェアを **sandbox** コンテナにインストールします。 +なお、makeコマンドの並列数は当該ノードのコア数に合わせて調整します。 + +```sh +Singularity> cd /mnt/localdisk/root/`hostname` && wget https://github.com/libevent/libevent/releases/download/release-2.1.12-stable/libevent-2.1.12-stable.tar.gz +Singularity> tar -xvf ./libevent-2.1.12-stable.tar.gz --no-same-owner +Singularity> cd libevent-2.1.12-stable && ./configure --prefix=/opt/libevent +Singularity> make -j 64 && make install; echo $? +Singularity> cd /mnt/localdisk/root/`hostname` && wget https://download.open-mpi.org/release/hwloc/v2.12/hwloc-2.12.2.tar.gz +Singularity> tar -xvf ./hwloc-2.12.2.tar.gz --no-same-owner +Singularity> cd hwloc-2.12.2 && ./configure --prefix=/opt/hwloc --with-cuda=/usr/local/cuda +Singularity> make -j 64 && make install; echo $? +Singularity> cd /mnt/localdisk/root/`hostname` && wget https://github.com/openpmix/openpmix/releases/download/v5.0.8/pmix-5.0.8.tar.gz +Singularity> tar -xvf ./pmix-5.0.8.tar.gz --no-same-owner +Singularity> cd pmix-5.0.8 && ./configure --prefix=/opt/pmix --with-libevent=/opt/libevent --with-hwloc=/opt/hwloc +Singularity> make -j 64 && make install; echo $? +Singularity> cd /mnt/localdisk/root/`hostname` && wget https://github.com/NVIDIA/gdrcopy/archive/refs/tags/v2.5.1.tar.gz +Singularity> tar -xvf ./v2.5.1.tar.gz --no-same-owner +Singularity> cd gdrcopy-2.5.1 && make -j 64 CUDA=/usr/local/cuda all && make prefix=/opt/gdrcopy install; echo $? +Singularity> cd /mnt/localdisk/root/`hostname` && wget https://github.com/openucx/ucx/releases/download/v1.19.0/ucx-1.19.0.tar.gz +Singularity> tar -xvf ./ucx-1.19.0.tar.gz --no-same-owner +Singularity> cd ucx-1.19.0 && ./contrib/configure-release --prefix=/opt/ucx --with-cuda=/usr/local/cuda -with-gdrcopy=/opt/gdrcopy +Singularity> make -j 64 && make install; echo $? +Singularity> cd /mnt/localdisk/root/`hostname` && wget https://github.com/openucx/ucc/archive/refs/tags/v1.5.0.tar.gz +Singularity> tar -xvf ./v1.5.0.tar.gz --no-same-owner +Singularity> cd ./ucc-1.5.0/ && ./autogen.sh && ./configure --prefix=/opt/ucc --with-ucx=/opt/ucx --with-cuda=/usr/local/cuda --with-nccl=/opt/nvidia/hpc_sdk/Linux_x86_64/25.7/comm_libs/nccl +Singularity> make -j 64 && make install; echo $? +``` + +次に、以下コマンドをコンテナユーザで実行し、 **OpenMPI** を **sandbox** コンテナの **/opt/openmpi** にインストールします。 +なお、makeコマンドの並列数は当該ノードのコア数に合わせて調整します。 + +```sh +Singularity> cd /mnt/localdisk/root/`hostname` && wget https://download.open-mpi.org/release/open-mpi/v5.0/openmpi-5.0.8.tar.gz +Singularity> tar -xvf ./openmpi-5.0.8.tar.gz --no-same-owner +Singularity> module load nvhpc +Singularity> 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 CC=nvc CXX=nvc++ FC=nvfortran +Singularity> make -j 64 && make install; echo $? +Singularity> mkdir -p /usr/share/Modules +Singularity> ln -s /usr/share/modules/modulefiles /usr/share/Modules/modulefiles +Singularity> ln -s /usr/lib/x86_64-linux-gnu /usr/share/Modules/libexec +``` + +次に、以下のファイルを **sandbox** コンテナ上の **/usr/share/Modules/modulefiles/openmpi** で作成します。 +このファイルは、 **[Environment Modules](https://envmodules.io/)** にモジュール名 **openmpi** を登録し、これをロードすることで **OpenMPI** 利用環境の設定を可能にします。 + +```sh +#%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 +``` + +次に、以下コマンドをコンテナユーザで実行し、 **OSU Micro-Benchmarks** を **sandbox** コンテナの **/opt/openmpi/tests/omb** にインストールします。 + +```sh +Singularity> cd /mnt/localdisk/root/`hostname` && wget https://mvapich.cse.ohio-state.edu/download/mvapich/osu-micro-benchmarks-7.5.1.tar.gz +Singularity> tar -xvf ./osu-micro-benchmarks-7.5.1.tar.gz --no-same-owner +Singularity> module load nvhpc openmpi +Singularity> 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/include --with-cuda-libpath=/usr/local/cuda/lib64 --enable-ncclomb --with-nccl=/opt/nvidia/hpc_sdk/Linux_x86_64/25.7/comm_libs/nccl +Singularity> make -j 64 && make install; echo $? +``` + +次に、以下のファイルを **sandbox** コンテナ上の **/usr/share/Modules/modulefiles/omb** で作成します。 +このファイルは、 **Environment Modules** にモジュール名 **omb** を登録し、これをロードすることで **OSU Micro-Benchmarks** 利用環境の設定を可能にします。 + +```sh +#%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 +``` + +次に、以下のファイルを **sandbox** コンテナ上の **/.singularity.d/env/99-auto-modules.sh** で作成します。 +このファイルは、コンテナ起動時に **NVIDIA HPC SDK** 、 **OpenMPI** 、及び **OSU Micro-Benchmarks** のモジュールをロードします。 + +```sh +#!/bin/bash +# Source the module initialization script and load your module +source /etc/profile.d/modules.sh +module load nvhpc openmpi omb +``` + +次に、以下コマンドをコンテナユーザで実行し、作成した **sandbox** コンテナから **SIF** のコンテナイメージを作成します。 +この際、 **SIF** ファイルを作成するディレクトリが全てのGPUノードで共有されている点に留意します。 + +```sh +$ mkdir -p ~/singularity && singularity build ~/singularity/ubuntu_noble_gpu.sif ubuntu_noble_gpu/ ``` # 6. 稼働確認 -本章は、先に作成した **SIF** のコンテナイメージを使用し、 **OSU Micro-Benchmarks** でノード間のレイテンシと帯域幅を計測します。 -この際、この計測をインタラクティブに実行し構築したコンテナ環境の稼働を確認するとともに、この計測をバッチジョブとして実行しコンテナ上で動作するMPI並列アプリケーションを **Slurm** 環境でも利用できることを確認します。 +## 6-0. 概要 + +本章は、先に作成した **SIF** のコンテナイメージを使用し、コンテナにインストールしたソフトウェアの稼働確認と、コンテナ上で得られる性能がホストOS上のものと同等であることを確認します。 +この際、対象がHPCクラスタかGPUクラスタかにより、以下の稼働確認を実施します。 + +1. **[HPCクラスタ向け稼働確認](#6-1-hpcクラスタ向け稼働確認)** + 1. **[OpenMPI稼働確認](#6-1-1-openmpi稼働確認)** + MPIのサンプルプログラムをコンパイル・実行することで、 **OpenMPI** の稼働確認を実施します。 + 2. **[OSU Micro-Benchmarksによるノード間レイテンシ・帯域幅計測](#6-1-2-osu-micro-benchmarksによるノード間レイテンシ帯域幅計測)** + **OSU Micro-Benchmarks** を使用し、 **[クラスタ・ネットワーク](../../#5-1-クラスタネットワーク)** を介する2ノード間のレイテンシと帯域幅を計測、その結果がホストOS上のものと同等であることを確認します。 + 3. **[Slurm環境バッチジョブでのMPI並列アプリケーション稼働確認](#6-1-3-slurm環境バッチジョブでのmpi並列アプリケーション稼働確認)** + **2.** と同様の稼働確認を **Slurm** 環境のバッチジョブとして実施し、MPI並列アプリケーションを **Slurm** 環境で実行できることを確認します。 +2. **[GPUクラスタ向け稼働確認](#6-2-gpuクラスタ向け稼働確認)** + 1. **[CUDA SamplesによるNVIDIA CUDA稼働確認](#6-2-1-cuda-samplesによるnvidia-cuda稼働確認)** + **NVIDIA CUDA** に含まれるCUDAコンパイラを使用して **CUDA Samples** をコンパイル・実行し、 **NVIDIA CUDA** の稼働確認を実施します。 + 2. **[OpenACCサンプルプログラムによるNVIDIA HPC SDK稼働確認](#6-2-2-openaccサンプルプログラムによるnvidia-hpc-sdk稼働確認)** + **NVIDIA HPC SDK** に含まれるOpneACC対応Cコンパイラを使用してOpenACCのディレクティブを含むC言語のサンプルプログラムをコンパイル・実行し、 **NVIDIA HPC SDK** の稼働確認を実施します。 + 3. **[OpenACC/MPIハイブリッドプログラムによるCUDA-aware OpenMPI稼働確認](#6-2-3-openaccmpiハイブリッドサンプルプログラムによるcuda-aware-openmpi稼働確認)** +OpenACCのディレクティブを含むMPIプログラムをコンパイル・実行し、CUDA-aware **OpenMPI** の稼働確認を実施します。 + 4. **[OSU Micro-Benchmarksによるデバイスメモリ間レイテンシ・帯域幅計測](#6-2-4-osu-micro-benchmarksによるデバイスメモリ間レイテンシ帯域幅計測)** + **OSU Micro-Benchmarks** で **[クラスタ・ネットワーク](../../#5-1-クラスタネットワーク)** を介する2ノード間のレイテンシと帯域幅を計測し、その結果がホストOS上のものと同等であることを確認します。 + 5. **[NCCL TestsによるNCCL通信性能計測](#6-2-5-nccl-testsによるnccl通信性能計測)** + **[NCCL Tests](https://github.com/nvidia/nccl-tests)** で **[NCCL(NVIDIA Collective Communication Library)](https://developer.nvidia.com/nccl)** の **All-Reduce** 通信性能を計測し、その結果がホストOS上のものと同等であることを確認します。 + 6. **[Slurm環境バッチジョブでのMPI並列アプリケーション稼働確認](#6-2-6-slurm環境バッチジョブでのmpi並列アプリケーション稼働確認)** + **4.** と同様の稼働確認を **Slurm** 環境のバッチジョブとして実施し、MPI並列アプリケーションを **Slurm** 環境で実行できることを確認します。 -以下コマンドを何れかの計算ノードでコンテナ起動ユーザで実行し、 **OSU Micro-Benchmarks** でノード間レイテンシ・帯域幅の計測をインタラクティブに実施します。 +なお、コマンドブロック中の **Singularity>** はコンテナ内のプロンプトを表しており、これに続くコマンドは起動したコンテナ上で実行することを意味します。 + +## 6-1. HPCクラスタ向け稼働確認 + +### 6-1-1. OpenMPI稼働確認 + +以下のMPIサンプルプログラムをファイル名 **mpi_hello.c** で作成します。 + +```sh +#include +#include + +int main(int argc, char **argv) { + int rank, size; + + MPI_Init(&argc, &argv); + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &size); + + printf("Hello world! I am %d of %d\n", rank, size); + + MPI_Finalize(); + return 0; +} +``` + +次に、以下コマンドを計算ノードのコンテナユーザで実行し、このサンプルプログラムをコンパイル・実行します。 + +```sh +$ mkdir -p ~/`hostname` && singularity exec --nv ~/singularity/ubuntu_noble_gpu.sif mpicc -o ~/`hostname`/mpi_hello mpi_hello.c +$ module load openmpi +$ mpirun -n 2 singularity exec --nv ~/singularity/ubuntu_noble_gpu.sif ~/`hostname`/mpi_hello +Hello world! I am 1 of 2 +Hello world! I am 0 of 2 +$ +``` + +### 6-1-2. OSU Micro-Benchmarksによるノード間レイテンシ・帯域幅計測 + +以下コマンドを何れかの計算ノードのコンテナユーザで実行し、 **OSU Micro-Benchmarks** で2ノード間のレイテンシと帯域幅を計測します。 ```sh $ module load openmpi @@ -283,8 +520,12 @@ $ SINGULARITYENV_UCX_NET_DEVICES=mlx5_2:1 mpirun -n 2 -N 1 --hostfile ~/hostlist $ ``` -次に、以下のファイルをSlurmクライアントに **slurm.sh** で作成します。 -このファイルは、 **OSU Micro-Benchmarks** でノード間レイテンシ・帯域幅の計測を行う **Slurm** に投入するジョブスクリプトです。 +以上の計測に関する詳細とホストOS上の性能値は、**[OCI HPCパフォーマンス関連情報](../../#2-oci-hpcパフォーマンス関連情報)** の **[OSU Micro-Benchmarks実行方法(BM.Optimized3.36編)](../../benchmark/run-omb-hpc/)** を参照してください。 + +### 6-1-3. Slurm環境バッチジョブでのMPI並列アプリケーション稼働確認 + +以下のファイルをSlurmクライアントに **slurm.sh** で作成します。 +このファイルは、 **OSU Micro-Benchmarks** で2ノード間のレイテンシと帯域幅の計測を行う **Slurm** に投入するジョブスクリプトです。 ```sh #!/bin/bash @@ -305,7 +546,7 @@ echo "Start osu_bw" srun singularity exec ~/singularity/ubuntu_noble_ompi.sif osu_bw -x 10 -i 10 -m 268435456:268435456 ``` -次に、以下コマンドをSlurmクライアントのコンテナ起動ユーザで実行し、先に作成したジョブスクリプトを投入、その結果を確認します。 +次に、以下コマンドをSlurmクライアントのコンテナユーザで実行し、先に作成したジョブスクリプトを投入、その結果を確認します。 ```sh $ sbatch slurm.sh @@ -325,4 +566,297 @@ Start osu_bw # Size Bandwidth (MB/s) 268435456 12254.21 $ -``` \ No newline at end of file +``` + +## 6-2. GPUクラスタ向け稼働確認 + +### 6-2-1. CUDA SamplesによるNVIDIA CUDA稼働確認 + +以下コマンドをGPUノードのコンテナユーザで実行し、 **CUDA Samples** をコンパイルします。 + +```sh +$ singularity run --nv ~/singularity/ubuntu_noble_gpu.sif +Singularity> module purge +Singularity> mkdir -p ~/`hostname` && cd ~/`hostname` && wget https://github.com/NVIDIA/cuda-samples/archive/refs/tags/v12.9.zip +Singularity> unzip v12.9.zip +Singularity> export PATH=/usr/local/cuda-12.9/bin:${PATH} +Singularity> cd cuda-samples-12.9 && mkdir build && cd build && cmake .. && make -j 64; echo $? +Singularity> exit +``` + +次に、以下コマンドをGPUノードのコンテナユーザで実行し、 **CUDA Samples** を実行します。 +この時、出力に搭載する全てのGPUの情報が含まれ、最後に出力される **Result =** 行が **PASS** となっていることを確認します。 + +```sh +$ singularity exec --nv ~/singularity/ubuntu_noble_gpu.sif ~/`hostname`/cuda-samples-12.9/build/Samples/1_Utilities/deviceQuery/deviceQuery +: +: +deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 12.8, CUDA Runtime Version = 12.9, NumDevs = 8 +Result = PASS +$ +``` + +### 6-2-2. OpenACCサンプルプログラムによるNVIDIA HPC SDK稼働確認 + +以下のOpenACCサンプルプログラムをファイル名 **test.c** で作成します。 + +```sh +#include +#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ノードのコンテナユーザで実行し、このサンプルプログラムをコンパイル・実行します。 + +```sh +$ mkdir -p ~/`hostname` && singularity exec --nv ~/singularity/ubuntu_noble_gpu.sif nvc -acc -gpu=cc80 -o ~/`hostname`/gpu.exe test.c +$ singularity exec --nv ~/singularity/ubuntu_noble_gpu.sif bash -c "~/`hostname`/gpu.exe & sleep 1; nvidia-smi | tail -3" +Success! +|=========================================================================================| +| 0 N/A N/A 430730 C ...a/inst-wjv0a-ao-ol905/gpu.exe 4234MiB | ++-----------------------------------------------------------------------------------------+ +$ +``` + +### 6-2-3. OpenACC/MPIハイブリッドサンプルプログラムによるCUDA-aware OpenMPI稼働確認 + +ここで使用するOpenACC/MPIハイブリッドのサンプルプログラムは、 **[東京大学 情報基盤センター](https://www.itc.u-tokyo.ac.jp/)** 様がGitHubの以下レポジトリから公開している、並列プログラミング講習会向けのものを利用させて頂くこととします。 + +**[https://github.com/hoshino-UTokyo/lecture_openacc_mpi](https://github.com/hoshino-UTokyo/lecture_openacc_mpi)** + +以下コマンドをGPUノードのコンテナユーザで実行し、サンプルプログラムのソースツリーをクローンします。 + +```sh +$ singularity run --nv ~/singularity/ubuntu_noble_gpu.sif +Singularity> mkdir -p ~/`hostname` && cd ~/`hostname` && git clone https://github.com/hoshino-UTokyo/lecture_openacc_mpi.git +``` + +以降では、ダウンロードした **lecture_openacc_mpi/C/openacc_mpi_basic/04_cuda_aware** ディレクトリ配下のサンプルプログラムを使用します。 +この際、 **東京大学 情報基盤センター** 様との環境の違いから、このディレクトリの **Makefile** を以下のように修正します。 + +```sh +$ diff Makefile_org Makefile +8c8 +< CFLAGS = -O3 -acc -Minfo=accel -ta=tesla,cc80 +--- +> CFLAGS = -O3 -acc -Minfo=accel -gpu=cc80 +$ +``` + +次に、以下コマンドをGPUノードのコンテナユーザで実行し、このサンプルプログラムをコンパイル・実行します。 + +```sh +Singularity> cd ~/`hostname`/lecture_openacc_mpi/C/openacc_mpi_basic/04_cuda_aware +Singularity> 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 " + +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 +Singularity> exit +$ module load openmpi +$ SINGULARITYENV_UCX_NET_DEVICES=mlx5_4:1 mpirun -n 2 singularity exec --nv ~/singularity/ubuntu_noble_gpu.sif ~/`hostname`/lecture_openacc_mpi/C/openacc_mpi_basic/04_cuda_aware/run +num of GPUs = 8 +Rank 1: hostname = inst-wjv0a-ao-ol905, GPU num = 1 +Rank 0: hostname = inst-wjv0a-ao-ol905, GPU num = 0 +mean = 30.00 +Time = 0.008 [sec] +``` + +### 6-2-4. OSU Micro-Benchmarksによるデバイスメモリ間レイテンシ・帯域幅計測 + +以下コマンドをGPUノードのコンテナユーザで実行し、 **OSU Micro-Benchmarks** でノード内のデバイスメモリ間のレイテンシと帯域幅を計測します。 + +```sh +$ mpirun -n 2 --report-bindings singularity exec --nv ~/singularity/ubuntu_noble_gpu.sif osu_latency -x 1000 -i 10000 -m 1:1 -d cuda D D +[inst-3egdh-ao-ol905:730888] Rank 0 bound to package[0][core:0] +[inst-3egdh-ao-ol905:730888] Rank 1 bound to package[0][core:1] + +# OSU MPI-CUDA Latency Test v7.5 +# Datatype: MPI_CHAR. +# Size Avg Latency(us) +1 2.39 +$ mpirun -n 2 --report-bindings singularity exec --nv ~/singularity/ubuntu_noble_gpu.sif osu_bw -x 10 -i 10 -m 268435456:268435456 -d cuda D D +[inst-3egdh-ao-ol905:731019] Rank 0 bound to package[0][core:0] +[inst-3egdh-ao-ol905:731019] Rank 1 bound to package[0][core:1] + +# OSU MPI-CUDA Bandwidth Test v7.5 +# Datatype: MPI_CHAR. +# Size Bandwidth (MB/s) +268435456 279625.67 +$ +``` + +次に、以下コマンドを何れかのGPUノードのコンテナユーザで実行し、 **OSU Micro-Benchmarks** で2ノード間のデバイスメモリ間のレイテンシと帯域幅を計測します。 + +```sh +$ mpirun -n 2 -N 1 -hostfile ~/hostlist.txt -x UCX_NET_DEVICES=mlx5_6:1,mlx5_7:1 singularity exec --nv ~/singularity/ubuntu_noble_gpu.sif osu_latency -x 1000 -i 10000 -m 1:1 -d cuda D D +[inst-aaaaa-ao:101107] SET UCX_NET_DEVICES=mlx5_6:1,mlx5_7:1 + +# OSU MPI-CUDA Latency Test v7.5 +# Datatype: MPI_CHAR. +# Size Avg Latency(us) +1 3.89 +$ mpirun -n 2 -N 1 -hostfile ~/hostlist.txt -x UCX_NET_DEVICES=mlx5_6:1,mlx5_7:1 singularity exec --nv ~/singularity/ubuntu_noble_gpu.sif osu_bw -x 10 -i 10 -m 268435456:268435456 -d cuda D D +[inst-aaaaa-ao:101229] SET UCX_NET_DEVICES=mlx5_6:1,mlx5_7:1 + +# OSU MPI-CUDA Bandwidth Test v7.5 +# Datatype: MPI_CHAR. +# Size Bandwidth (MB/s) +268435456 23068.54 +$ +``` + +以上の計測に関する詳細とホストOS上の性能値は、 **[OCI HPCパフォーマンス関連情報](../../#2-oci-hpcパフォーマンス関連情報)** の **[OSU Micro-Benchmarks実行方法(BM.GPU4.8/BM.GPU.A100-v2.8編)](../../benchmark/run-omb-gpu/)** を参照してください。 + +### 6-2-5. NCCL TestsによるNCCL通信性能計測 + +以下コマンドをGPUノードのコンテナユーザで実行し、 **NCCL Tests** をコンパイルします。 + +```Sh +$ singularity run --nv ~/singularity/ubuntu_noble_gpu.sif +Singularity> mkdir -p ~/`hostname` && cd ~/`hostname` && git clone https://github.com/NVIDIA/nccl-tests.git +Singularity> cd nccl-tests && make -j 64 MPI=1 MPI_HOME=/opt/openmpi CUDA_HOME=/usr/local/cuda NCCL_HOME=/opt/nvidia/hpc_sdk/Linux_x86_64/25.7/comm_libs/nccl; echo $? +Singularity> exit +``` + +次に、以下コマンドをGPUノードのコンテナユーザで実行し、1ノード8GPUの **NCCL** の **All-Reduce** 通信性能を **NCCL Tests** で計測します。 + +```sh +$ module load openmpi +$ mpirun -n 8 singularity exec --nv ~/singularity/ubuntu_noble_gpu.sif ~/`hostname`/nccl-tests/build/all_reduce_perf -b 10G -e 10G -t 1 -g 1 +# nccl-tests version 2.17.6 nccl-headers=22605 nccl-library=22605 +# 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 729729 on inst-3egdh-ao-ol905 device 0 [0000:0f:00] NVIDIA A100-SXM4-40GB +# Rank 1 Group 0 Pid 729730 on inst-3egdh-ao-ol905 device 1 [0000:15:00] NVIDIA A100-SXM4-40GB +# Rank 2 Group 0 Pid 729727 on inst-3egdh-ao-ol905 device 2 [0000:51:00] NVIDIA A100-SXM4-40GB +# Rank 3 Group 0 Pid 729728 on inst-3egdh-ao-ol905 device 3 [0000:54:00] NVIDIA A100-SXM4-40GB +# Rank 4 Group 0 Pid 729765 on inst-3egdh-ao-ol905 device 4 [0000:8d:00] NVIDIA A100-SXM4-40GB +# Rank 5 Group 0 Pid 729764 on inst-3egdh-ao-ol905 device 5 [0000:92:00] NVIDIA A100-SXM4-40GB +# Rank 6 Group 0 Pid 729763 on inst-3egdh-ao-ol905 device 6 [0000:d6:00] NVIDIA A100-SXM4-40GB +# Rank 7 Group 0 Pid 729762 on inst-3egdh-ao-ol905 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 80545.0 133.31 233.29 0 80545.7 133.31 233.29 0 +# Out of bounds values : 0 OK +# Avg bus bandwidth : 233.291 +# +# Collective test concluded: all_reduce_perf +``` + +次に、以下コマンドを何れかのGPUノードのコンテナユーザで実行し、2ノード16GPUの **NCCL** の **All-Reduce** 通信性能を **NCCL Tests** で計測します。 + +```sh +$ mpirun -n 16 -N 8 -hostfile ~/hostlist.txt -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" singularity exec --nv ~/singularity/ubuntu_noble_gpu.sif ~/`hostname`/nccl-tests/build/all_reduce_perf -b 10G -e 10G -t 1 -g 1 +[inst-aaaaa-ao:87032] SET NCCL_IB_QPS_PER_CONNECTION=4 +[inst-aaaaa-ao:87032] SET NCCL_IB_GID_INDEX=3 +[inst-aaaaa-ao:87032] SET UCX_NET_DEVICES=eth0 +[inst-aaaaa-ao:87032] SET 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 +# nccl-tests version 2.17.6 nccl-headers=22605 nccl-library=22605 +# 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 87266 on inst-aaaaa-ao device 0 [0000:0f:00] NVIDIA A100-SXM4-40GB +# Rank 1 Group 0 Pid 87197 on inst-aaaaa-ao device 1 [0000:15:00] NVIDIA A100-SXM4-40GB +# Rank 2 Group 0 Pid 87196 on inst-aaaaa-ao device 2 [0000:51:00] NVIDIA A100-SXM4-40GB +# Rank 3 Group 0 Pid 87250 on inst-aaaaa-ao device 3 [0000:54:00] NVIDIA A100-SXM4-40GB +# Rank 4 Group 0 Pid 87230 on inst-aaaaa-ao device 4 [0000:8d:00] NVIDIA A100-SXM4-40GB +# Rank 5 Group 0 Pid 87216 on inst-aaaaa-ao device 5 [0000:92:00] NVIDIA A100-SXM4-40GB +# Rank 6 Group 0 Pid 87202 on inst-aaaaa-ao device 6 [0000:d6:00] NVIDIA A100-SXM4-40GB +# Rank 7 Group 0 Pid 87288 on inst-aaaaa-ao device 7 [0000:da:00] NVIDIA A100-SXM4-40GB +# Rank 8 Group 0 Pid 87901 on inst-bbbbb-ao device 0 [0000:0f:00] NVIDIA A100-SXM4-40GB +# Rank 9 Group 0 Pid 87853 on inst-bbbbb-ao device 1 [0000:15:00] NVIDIA A100-SXM4-40GB +# Rank 10 Group 0 Pid 87866 on inst-bbbbb-ao device 2 [0000:51:00] NVIDIA A100-SXM4-40GB +# Rank 11 Group 0 Pid 87854 on inst-bbbbb-ao device 3 [0000:54:00] NVIDIA A100-SXM4-40GB +# Rank 12 Group 0 Pid 87904 on inst-bbbbb-ao device 4 [0000:8d:00] NVIDIA A100-SXM4-40GB +# Rank 13 Group 0 Pid 87948 on inst-bbbbb-ao device 5 [0000:92:00] NVIDIA A100-SXM4-40GB +# Rank 14 Group 0 Pid 87903 on inst-bbbbb-ao device 6 [0000:d6:00] NVIDIA A100-SXM4-40GB +# Rank 15 Group 0 Pid 87870 on inst-bbbbb-ao 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 90330 118.87 222.88 0 91945 116.78 218.96 0 +# Out of bounds values : 0 OK +# Avg bus bandwidth : 220.921 +# +# Collective test concluded: all_reduce_perf + +$ +``` + +以上の計測に関する詳細とホストOS上の性能値は、 **[OCI HPCパフォーマンス関連情報](../../#2-oci-hpcパフォーマンス関連情報)** の **[NCCL Tests実行方法(BM.GPU4.8/BM.GPU.A100-v2.8 Oracle Linux編)](../../benchmark/run-nccltests/)** を参照してください。 + +### 6-2-6. Slurm環境バッチジョブでのMPI並列アプリケーション稼働確認 + +以下のファイルをSlurmクライアントに **slurm_gpu.sh** で作成します。 +このファイルは、 **OSU Micro-Benchmarks** で2ノード間のデバイスメモリ間のレイテンシと帯域幅の計測を行う、 **Slurm** に投入するジョブスクリプトです。 + +```sh +#!/bin/bash +#SBATCH -p sltest +#SBATCH -n 2 +#SBATCH -N 2 +#SBATCH --gres=gpu:nvidia_a100-sxm4-40gb:1 +#SBATCH -J omb_gpu +#SBATCH -o stdout.%J +#SBATCH -e stderr.%J + +export SINGULARITYENV_UCX_NET_DEVICES=mlx5_0:1,mlx5_1:1 + +echo "Start osu_latency" +srun singularity exec --nv ~/singularity/ubuntu_noble_gpu.sif osu_latency -x 1000 -i 10000 -m 1:1 -d cuda D D +echo +echo "Start osu_bw" +srun singularity exec --nv ~/singularity/ubuntu_noble_gpu.sif osu_bw -x 10 -i 10 -m 268435456:268435456 -d cuda D D +``` + +次に、以下コマンドをSlurmクライアントのコンテナユーザで実行し、先に作成したジョブスクリプトを投入、その結果を確認します。 + +```sh +$ sbatch slurm_gpu.sh +Submitted batch job 61 +$ cat stdout.61 +Start osu_latency + +# OSU MPI-CUDA Latency Test v7.5 +# Datatype: MPI_CHAR. +# Size Avg Latency(us) +1 3.89 + +Start osu_bw + +# OSU MPI-CUDA Bandwidth Test v7.5 +# Datatype: MPI_CHAR. +# Size Bandwidth (MB/s) +268435456 23069.18 + +$ \ No newline at end of file diff --git a/content/hpc/tech-knowhow/gpu-with-ubuntu/index.md b/content/hpc/tech-knowhow/gpu-with-ubuntu/index.md index eda0d7b39a..a1f9ee210f 100644 --- a/content/hpc/tech-knowhow/gpu-with-ubuntu/index.md +++ b/content/hpc/tech-knowhow/gpu-with-ubuntu/index.md @@ -138,7 +138,7 @@ $ sudo systemctl disable --now apparmor 本章は、GPUインスタンスに以下の **NVIDIA** GPU関連ソフトウェアをインストールします。 - **NVIDIA Driver** -- **NVIDIA CUDA Toolkit** +- **NVIDIA CUDA** - **NVIDIA Fabric Manager**(※3) - **NVIDIA HPC SDK** @@ -390,8 +390,8 @@ prepend-path MANPATH $pkg_root/share/man 本章は、ここまでにインストールしたソフトウェアの動作確認を以下の順に実施します。 -1. **[CUDA SamplesによるNVIDIA CUDA Toolkit動作確認](#4-1-cuda-samplesによるnvidia-cuda-toolkit動作確認)** - **NVIDIA CUDA Toolkit** に含まれるCUDAコンパイラとCUDAライブラリを使用する **CUDA Samples** をコンパイル・実行することで、 **NVIDIA CUDA Toolkit** 含まれるCUDAコンパイラの動作を確認します。 +1. **[CUDA SamplesによるNVIDIA CUDA動作確認](#4-1-cuda-samplesによるnvidia-cuda動作確認)** + **NVIDIA CUDA** に含まれるCUDAコンパイラとCUDAライブラリを使用する **CUDA Samples** をコンパイル・実行することで、 **NVIDIA CUDA** に含まれるCUDAコンパイラの動作を確認します。 2. **[OpenACCサンプルプログラムによるNVIDIA HPC SDK動作確認](#4-2-openaccサンプルプログラムによるnvidia-hpc-sdk動作確認)** OpenACCのディレクティブを含むCプログラムをコンパイル・実行することで、 **NVIDIA HPC SDK** に含まれるOpneACC対応Cコンパイラの動作を確認します。 @@ -405,7 +405,7 @@ OpenACCのディレクティブを含むMPI Cプログラムをコンパイル 5. **[NCCL TestsによるNVIDIA Fabric Manager動作確認](#4-5-nccl-testsによるnvidia-fabric-manager動作確認)** **NCCL Tests** で8枚のGPUを使用する **[NCCL(NVIDIA Collective Communication Library)](https://developer.nvidia.com/nccl)** の **All-Reduce** 通信性能を計測し、十分な性能が出ていることをもって **NVIDIA Fabric Manager** の動作を確認します。 -## 4-1. CUDA SamplesによるNVIDIA CUDA Toolkit動作確認 +## 4-1. CUDA SamplesによるNVIDIA CUDA動作確認 以下コマンドをGPUインスタンスのGPU環境利用ユーザで実行し、 **CUDA Samples** をコンパイルします。 なお、makeコマンドの並列数はGPUインスタンスのコア数に合わせて調整します。 @@ -418,7 +418,7 @@ $ cd cuda-samples-12.9 && mkdir build && cd build && cmake .. && make -j 128 ``` 次に、以下コマンドをGPUインスタンスのGPU環境利用ユーザで実行し、 **CUDA Samples** が正しく動作することを確認します。 -この時、出力に搭載する全てのGPUの情報が含まれ、最後に出力される **Result =** 行が **PASS** となっていることで、 **NVIDIA CUDA Toolkit** の動作を確認します。 +この時、出力に搭載する全てのGPUの情報が含まれ、最後に出力される **Result =** 行が **PASS** となっていることで、 **NVIDIA CUDA** の動作を確認します。 ```sh $ ./Samples/1_Utilities/deviceQuery/deviceQuery @@ -588,4 +588,4 @@ $ ## 4-5. NCCL TestsによるNVIDIA Fabric Manager動作確認 -**[OCI HPCパフォーマンス関連情報](../../#2-oci-hpcパフォーマンス関連情報)** の **[NCCL Tests実行方法(BM.GPU4.8/BM.GPU.A100-v2.8 Ubuntu編)](../../benchmark/run-nccltests-ubuntu/)** の **[2. NCCL Testsコンパイル](../../benchmark/run-nccltests-ubuntu/#2-nccl-testsコンパイル)** と **[3. NCCL Tests実行](../../benchmark/run-nccltests-ubuntu/#3-nccl-tests実行)** の手順に従い、1ノード8GPUの **NCCL** **All-Reduce** 通信性能を **NCCL Tests** で計測し、 **NVSwitch** を搭載する **BM.GPU4.8** に期待される性能の **230 GB/s** (10 GiBメッセージサイズ)前後の帯域(busbw)性能が出ることをもって、 **NVIDIA Fabric Manager** の動作を確認します。 \ No newline at end of file +**[OCI HPCパフォーマンス関連情報](../../#2-oci-hpcパフォーマンス関連情報)** の **[NCCL Tests実行方法(BM.GPU4.8/BM.GPU.A100-v2.8 Ubuntu編)](../../benchmark/run-nccltests-ubuntu/)** の **[2. NCCL Testsコンパイル](../../benchmark/run-nccltests-ubuntu/#2-nccl-testsコンパイル)** と **[3. NCCL Tests実行](../../benchmark/run-nccltests-ubuntu/#3-nccl-tests実行)** の手順に従い、1ノード8GPUの **NCCL** **All-Reduce** 通信性能を **NCCL Tests** で計測し、 **NVSwitch** を搭載する **BM.GPU4.8** に期待される性能の **230 GB/s** (10 GiBメッセージサイズ)前後の帯域(busbw)性能が出ることをもって、 **NVIDIA Fabric Manager** の動作を確認します。 \ No newline at end of file diff --git a/content/hpc/tech-knowhow/setup-slurm-cluster-withubuntu/index.md b/content/hpc/tech-knowhow/setup-slurm-cluster-withubuntu/index.md index d7fccd53f5..bc0003c31d 100644 --- a/content/hpc/tech-knowhow/setup-slurm-cluster-withubuntu/index.md +++ b/content/hpc/tech-knowhow/setup-slurm-cluster-withubuntu/index.md @@ -324,7 +324,7 @@ $ sudo mkdir /opt/slurm/etc && sudo chown slurm:slurm /opt/slurm/etc ## 2-7. Slurm設定ファイル作成 -本章は、以下3種類の **Slurm** 設定ファイルを作成し、これらを各サブシステムの **/opt/slurm/etc** ディレクトリに配布します。 +本章は、以下5種類の **Slurm** 設定ファイルを作成し、これらを各サブシステムの **/opt/slurm/etc** ディレクトリに配布します。 この際、これらファイルのオーナーユーザ・オーナーグループを **slurm** とします。 また、 **slurmdbd.conf** のパーミッションを **600** に設定します。 diff --git a/content/hpc/tech-knowhow/setup-slurm-cluster/index.md b/content/hpc/tech-knowhow/setup-slurm-cluster/index.md index d3cc71be1a..c5c2f84d60 100644 --- a/content/hpc/tech-knowhow/setup-slurm-cluster/index.md +++ b/content/hpc/tech-knowhow/setup-slurm-cluster/index.md @@ -36,6 +36,8 @@ table, th, td { 以上を踏まえて本テクニカルTipsは、 **OpenMPI** のMPI並列アプリケーションを **PMIx** の大規模並列ジョブに対する利点を生かして実行すること、GPUクラスタに於けるGPUリソースを有効に活用すること、を念頭に **Slurm** 環境を構築します。 また構築した環境の稼働確認として、HPCクラスタでは **[OSU Micro-Benchmarks](https://mvapich.cse.ohio-state.edu/benchmarks/)** で2ノード間のレイテンシと4ノード間のMPI_Init所要時間に着目して初期化処理時間の効果を検証し、GPUクラスタでは設定したGPUリソース管理機能が想定通りに動作することを検証します。 +以降では、対象がHPCクラスタかGPUクラスタかで手順の異なる箇所は、都度記載の注釈でどの手順を実行するかを判断します。 + なお、 **Ubuntu** をOSとするGPUクラスタのリソース管理やジョブ管理を **Slurm** で行う環境の構築方法は、 **[OCI HPCテクニカルTips集](../../#3-oci-hpcテクニカルtips集)** の **[Slurmによるリソース管理・ジョブ管理システム構築方法(Ubuntu OS編)](../setup-slurm-cluster-withubuntu/)** を参照してください。 # 1. 前提システム @@ -429,8 +431,7 @@ SelectType=select/cons_tres TaskPlugin=task/cgroup,task/affinity # # GPU node specifications -NodeName=inst-aaaa-ao Gres=gpu:nvidia_a100-sxm4-40gb:8 Sockets=2 CoresPerSocket=32 ThreadsPerCore=1 RealMemory=2000000 TmpDisk=10000 State=UNKNOWN -NodeName=inst-bbbb-ao Gres=gpu:nvidia_a100-sxm4-40gb:8 Sockets=2 CoresPerSocket=32 ThreadsPerCore=1 RealMemory=2000000 TmpDisk=10000 State=UNKNOWN +NodeName=inst-aaaa-ao,inst-bbbb-ao Gres=gpu:nvidia_a100-sxm4-40gb:8 Sockets=2 CoresPerSocket=32 ThreadsPerCore=1 RealMemory=2000000 TmpDisk=10000 State=UNKNOWN PartitionName=sltest Nodes=ALL DefMemPerGPU=250000 Default=YES MaxTime=INFINITE State=UP ``` @@ -678,28 +679,26 @@ $ srun -p sltest -n 1 --gres=gpu:nvidia_a100-sxm4-40gb:8 nvidia-smi | grep SXM | $ ``` -次に、以下コマンドをSlurmクライアントの **Slurm** 利用ユーザで実行し、GPUデバイスメモリ間のレイテンシを確認します。 +次に、以下コマンドをSlurmクライアントの **Slurm** 利用ユーザで実行し、 **OSU Micro-Benchmarks** で2ノード間のデバイスメモリ間のレイテンシと帯域幅を計測します。 +ここでは、最初のコマンドの出力から **Slurm** が割り当てるGPU番号が2となるため、使用するノード間接続ネットワークインターフェースにこのGPUと同一PCIeスイッチに接続する **mlx5_0** と **mlx5_1** を指定しています。 ```sh $ module load openmpi omb -$ srun -p sltest -n 2 --gres=gpu:nvidia_a100-sxm4-40gb:2 osu_latency -x 1000 -i 10000 -m 1:1 -d cuda D D +$ srun -p sltest -n 2 -N 2 --gres=gpu:nvidia_a100-sxm4-40gb:1 nvidia-smi | grep SXM +| 0 NVIDIA A100-SXM4-40GB On | 00000000:51:00.0 Off | 0 | +| 0 NVIDIA A100-SXM4-40GB On | 00000000:51:00.0 Off | 0 | +$ UCX_NET_DEVICES=mlx5_0:1,mlx5_1:1 srun -p sltest -n 2 -N 2 --gres=gpu:nvidia_a100-sxm4-40gb:1 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.37 -$ -``` - -次に、以下コマンドをSlurmクライアントの **Slurm** 利用ユーザで実行し、GPUデバイスメモリ間の帯域幅を確認します。 - -```sh -$ srun -p sltest -n 2 --gres=gpu:nvidia_a100-sxm4-40gb:2 osu_bw -x 10 -i 10 -m 268435456:268435456 -d cuda D D +1 3.89 +$ UCX_NET_DEVICES=mlx5_0:1,mlx5_1:1 srun -p sltest -n 2 -N 2 --gres=gpu:nvidia_a100-sxm4-40gb:1 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 279577.30 +268435456 23073.26 $ ``` @@ -719,6 +718,7 @@ $ ``` 次に、以下のスクリプトをSlurmクライアントの **Slurm** 利用ユーザでファイル名 **gpu_affinity.sh** で作成します。 +なお、ホスト名は自身の環境のものに置き換えます。 このスクリプトは、4枚のGPU(ノードに搭載するGPU数の半分)と32個のCPUコア(ノードに搭載するCPUコア数の半分)を要求し、自身が割り当てられたGPUのPCIバスIDとCPUコア番号を表示します。 ```sh @@ -726,6 +726,7 @@ $ #SBATCH -p sltest #SBATCH -n 32 #SBATCH -N 1 +#SBATCH --nodelist=inst-aaaaa-ao #SBATCH --gres=gpu:nvidia_a100-sxm4-40gb:4 #SBATCH -o stdout.%J #SBATCH -e stderr.%J @@ -735,7 +736,7 @@ srun -n 1 nvidia-smi | grep SXM | awk '{print $2, $7}' srun bash -c 'echo -n "Rank $SLURM_PROCID Node $SLURM_NODEID Core "; taskset -cp $$ | cut -d" " -f6' | sort -k 2n,2 ``` -次に、以下コマンドをSlurmクライアントの **Slurm** 利用ユーザで実行し、投入した2本のジョブが同時に実行中になること、先の8枚のGPUを使用した **nvidia-smi** コマンドの出力と比較し割り当てられたGPUとCPUコアが同一ソケットに接続するものであることを確認します。 +次に、以下コマンドをSlurmクライアントの **Slurm** 利用ユーザで実行し、投入した2本のジョブが同一GPUノードで同時に実行中になること、先の8枚のGPUを使用した **nvidia-smi** コマンドの出力と比較し割り当てられたGPUとCPUコアが同一ソケットに接続するものであることを確認します。 なお、GPUノードに使用している **BM.GPU4.8** は、CPUソケットを2個搭載し、ソケット番号0側にGPU番号0~3とCPUコア番号0~31を収容し、ソケット番号1側にGPU番号4~7とCPUコア番号32~63を収容することに留意します。 ```sh @@ -745,7 +746,7 @@ Submitted batch job 6 $ squeue JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) 6 sltest gpu_affi usera R 0:01 1 inst-aaaa-ao - 5 sltest gpu_affi usera R 0:02 1 inst-bbbb-ao + 5 sltest gpu_affi usera R 0:02 1 inst-aaaa-ao $ cat stdout.5 0 00000000:0F:00.0 @@ -777,8 +778,8 @@ $ 次に、以下コマンドをSlurmクライアントの **Slurm** 利用ユーザで実行し、 **--gres-flags=enforce-binding** オプション指定の有無により、定義したGPUとCPUコアのアフィニティを満たせないリソース(4個のGPUと33個のCPUコア)を要求するジョブの投入可否が変化することを確認します。 ```sh -$ srun -p sltest -n 33 --gres=gpu:nvidia_a100-sxm4-40gb:4 bash -c "true" -$ srun -p sltest -n 33 --gres=gpu:nvidia_a100-sxm4-40gb:4 --gres-flags=enforce-binding bash -c "true" +$ srun -p sltest -n 33 -N 1 --gres=gpu:nvidia_a100-sxm4-40gb:4 bash -c "true" +$ srun -p sltest -n 33 -N 1 --gres=gpu:nvidia_a100-sxm4-40gb:4 --gres-flags=enforce-binding bash -c "true" srun: error: Unable to allocate resources: Requested node configuration is not available $ ``` \ No newline at end of file