diff --git a/tutorials/_hpc/benchmark/bios-setting.md b/tutorials/_hpc/benchmark/bios-setting.md index 45121c7ca8..e4863944c8 100644 --- a/tutorials/_hpc/benchmark/bios-setting.md +++ b/tutorials/_hpc/benchmark/bios-setting.md @@ -13,7 +13,7 @@ header: ベアメタルインスタンスは、デプロイ時にBIOS設定を指定することが可能ですが、この中にはHPCワークロードの実行時パフォーマンスに影響する以下の項目が含まれます。 -- **NPS**(NUMA nodes per socket) +- **NUMA nodes per socket** (以降 **NPS** と呼称) **NPS** は、CPUソケット当たりの **NUMA**(Non-Umiform Memory Access)ノード数を指定するBIOS設定です。 現在のサーバ用途CPUでメモリ性能を向上させるために採用されているメモリインタリーブは、インターリーブするメモリチャネルを同一NUMAノードに接続されるものに限定します。このため、NPSを適切に調整することで、あるCPUコアから見て距離的に同じメモリチャネルのみをインターリーブし、 **[STREAM](https://www.cs.virginia.edu/stream/)** ベンチマークのようなメモリアクセスパターンを持つアプリケーションの性能を向上させることが可能でです。 @@ -34,7 +34,7 @@ header: ※1)2CPUソケットを1 **NUMA** ノードとして構成 -- **SMT** (Simultanious Multi Threading) +- **Simultanious Multi Threading** (以降 **SMT** と呼称) **SMT** は、CPUコア当たりに2個の論理スレッドを割当てるかどうかのBIOS設定です。 HPCワークロードにみられるCPUインテンシブなアプリケーションは、この **SMT** を無効化する(CPUコア当たりに1個の論理スレッドを割当てる)ことで、性能が向上することがあります。 diff --git a/tutorials/_hpc/benchmark/openfoam-tuning.md b/tutorials/_hpc/benchmark/openfoam-tuning.md index dea21d30ec..4afcac5efa 100644 --- a/tutorials/_hpc/benchmark/openfoam-tuning.md +++ b/tutorials/_hpc/benchmark/openfoam-tuning.md @@ -17,9 +17,10 @@ header: 2. スケーラビリティーを考慮した最適なノード間並列実行方法 3. NVMe SSDローカルディスクをストレージ領域に活用する方法 -本パフォーマンス関連Tipsの性能計測は、 **[OCI HPCテクニカルTips集](/ocitutorials/hpc/#3-oci-hpcテクニカルtips集)** の **[OpenFOAMインストール・利用方法](/ocitutorials/hpc/tech-knowhow/install-openfoam/)** に従って構築された **OpenFOAM** を使用し、 **[OCI HPCテクニカルTips集](/ocitutorials/hpc/#3-oci-hpcテクニカルtips集)** の **[Slurmによるリソース管理・ジョブ管理システム構築方法](/ocitutorials/hpc/tech-knowhow/setup-slurm-cluster/)** に従って構築された **[Slurm](https://slurm.schedmd.com/)** 環境でバッチジョブとして計測しています。 +本パフォーマンス関連Tipsの性能計測は、 **[OCI HPCテクニカルTips集](/ocitutorials/hpc/#3-oci-hpcテクニカルtips集)** の **[OpenFOAMインストール・利用方法](/ocitutorials/hpc/tech-knowhow/install-openfoam/)** に従って構築された **OpenFOAM** を使用し、 **[OCI HPCテクニカルTips集](/ocitutorials/hpc/#3-oci-hpcテクニカルtips集)** の **[Slurmによるリソース管理・ジョブ管理システム構築方法](/ocitutorials/hpc/tech-knowhow/setup-slurm-cluster/)** に従って構築された **[Slurm](https://slurm.schedmd.com/)** 環境でバッチジョブとして計測しています。 +また、 **NUMA nodes per socket** (以降 **NPS** と呼称)に **NPS1** と **NPS2** を指定して実行する計測は、 **[OCI HPCテクニカルTips集](/ocitutorials/hpc/#3-oci-hpcテクニカルtips集)** の **[Slurmによるリソース管理・ジョブ管理システム運用Tips](/ocitutorials/hpc/tech-knowhow/slurm-tips/)** の **[3. ヘテロジニアス環境下のパーティションを使った計算/GPUノード割り当て制御](/ocitutorials/hpc/tech-knowhow/slurm-tips/#3-ヘテロジニアス環境下のパーティションを使った計算gpuノード割り当て制御)** に従って構築した **Slurm** 環境で行っています。 -また、計算ノードに使用する **BM.Optimized3.36** は、 **OpenFOAM** がメモリ帯域幅依存でハイパースレッディングによる効果は期待できないため、 **[OCI HPCパフォーマンス関連情報](/ocitutorials/hpc/#2-oci-hpcパフォーマンス関連情報)** の **[パフォーマンスに関連するベアメタルインスタンスのBIOS設定方法](/ocitutorials/hpc/benchmark/bios-setting/)** の手順に従い **SMT** を無効化しています。 +計算ノードに使用する **BM.Optimized3.36** は、 **OpenFOAM** がメモリ帯域幅依存でハイパースレッディングによる効果は期待できないため、 **[OCI HPCパフォーマンス関連情報](/ocitutorials/hpc/#2-oci-hpcパフォーマンス関連情報)** の **[パフォーマンスに関連するベアメタルインスタンスのBIOS設定方法](/ocitutorials/hpc/benchmark/bios-setting/)** の手順に従い、 **Simultanious Multi Threading** (以降 **SMT** と呼称)を無効化しています。 *** # 1. メモリ帯域の有効利用を考慮した最適なノード内並列実行方法 @@ -28,7 +29,7 @@ header: 本Tipsは、 **OpenFOAM** の実行性能がプロセッサ演算処理あたり利用可能なメモリ帯域に大きく依存することを念頭に、以下のパラメータを変更することでノード内並列実行時の性能がどのように変化するか、また最も性能の良いパラメータの組み合わせは何かという観点で、性能計測とその考察を行います。 -- **NPS** (Numa node Per Socket)( **NPS1** / **NPS2** ) +- **NPS** ( **NPS1** / **NPS2** ) - MPIプロセス数(8・16・32・36) また、MPIプロセスのバインディングは、 **NPS1** はソケット単位 **NPS2** はNUMAノード単位でサイクリックにCPUコアにMPIプロセスランクを順次割り当てる( **Slurm** のオプションで言うところの **--distribution=block:cyclic** )ことで、各ソケット・NUMAノード当たりの割当てコア数が一定となり、結果各プロセスにメモリ帯域幅が均等に割り当てられるよう配慮します。 @@ -45,7 +46,7 @@ header: - 解析対象モデル : **[OpenFOAM HPC Benchmark Suite](https://develop.openfoam.com/committees/hpc)** の **[HPC_Motorbike](https://develop.openfoam.com/committees/hpc/-/tree/develop/incompressible/simpleFoam/HPC_motorbike)** の **[Small](https://develop.openfoam.com/committees/hpc/-/tree/develop/incompressible/simpleFoam/HPC_motorbike/Small/v1912)** モデル - 計算結果の出力頻度( **writeInterval** ) : 1,000タイムステップ(デフォルト) -※1)NPSの設定方法は、 **[OCI HPCパフォーマンス関連情報](/ocitutorials/hpc/#2-oci-hpcパフォーマンス関連情報)** の **[パフォーマンスに関連するベアメタルインスタンスのBIOS設定方法](/ocitutorials/hpc/benchmark/bios-setting/)** を参照してください。 +※1)**NPS** の設定方法は、 **[OCI HPCパフォーマンス関連情報](/ocitutorials/hpc/#2-oci-hpcパフォーマンス関連情報)** の **[パフォーマンスに関連するベアメタルインスタンスのBIOS設定方法](/ocitutorials/hpc/benchmark/bios-setting/)** を参照してください。 ※2) **[OCI HPCテクニカルTips集](/ocitutorials/hpc/#3-oci-hpcテクニカルtips集)** の **[クラスタネットワーキングイメージの選び方](/ocitutorials/hpc/tech-knowhow/osimage-for-cluster/)** の **[1. クラスタネットワーキングイメージ一覧](/ocitutorials/hpc/tech-knowhow/osimage-for-cluster/#1-クラスタネットワーキングイメージ一覧)** のイメージ **No.1** です。 この結果、以下のことが判明しています。 @@ -59,24 +60,18 @@ header: この方法は、 **[OCI HPCテクニカルTips集](/ocitutorials/hpc/#3-oci-hpcテクニカルtips集)** の **[OpenFOAMインストール・利用方法](/ocitutorials/hpc/tech-knowhow/install-openfoam/)** の **[4. CFD解析フロー実行](/ocitutorials/hpc/tech-knowhow/install-openfoam//#4-cfd解析フロー実行)** を参照し、ここで解説しているチュートリアル付属のオートバイ走行時乱流シミュレーションモデルのバッチ実行の方法を参考に、 **OpenFOAM HPC Benchmark Suite** の **HPC_Motorbike** の **Small** モデルにこれを適用します。 -この際 **NPS2** の場合は、 **Slurm** の設定ファイル **slurm.conf** の **NodeName=DEFAULT** で始まる行を以下のように修正します。 +ジョブスクリプトに指定する **Slurm** のオプションは、以下のように指定します。 -```sh -NodeName=DEFAULT CPUs=36 Boards=1 SocketsPerBoard=4 CoresPerSocket=9 ThreadsPerCore=1 RealMemory=500000 TmpDisk=10000 State=UNKNOWN -``` - -また、ジョブスクリプトに指定する **Slurm** のオプションを以下のように指定します。 - -| NPS | MPIプロセス数 | \-n | \-N | --ntasks-per-node | --cpu-bind | -| :-: | :------: | :-: | :-: | :---------------: | :---------------: | -| 1 | 8 | 8 | 1 | 8 | verbose,cores | -| | 16 | 16 | 1 | 16 | verbose,cores | -| | 32 | 32 | 1 | 32 | verbose,cores | -| | 36 | 36 | 1 | 36 | verbose,cores | -| 2 | 8 | 8 | 1 | 8 | verbose,rank_ldom | -| | 16 | 16 | 1 | 16 | verbose,rank_ldom | -| | 32 | 32 | 1 | 32 | verbose,rank_ldom | -| | 36 | 36 | 1 | 36 | verbose,rank_ldom | +| NPS | MPIプロセス数 | -n | -N | --cpu-bind | +| :-: | :------: | :-: | :-: | :--------: | +| 1 | 8 | 8 | 1 | cores | +| | 16 | 16 | 1 | cores | +| | 32 | 32 | 1 | cores | +| | 36 | 36 | 1 | cores | +| 2 | 8 | 8 | 1 | rank_ldom | +| | 16 | 16 | 1 | rank_ldom | +| | 32 | 32 | 1 | rank_ldom | +| | 36 | 36 | 1 | rank_ldom | また、本テクニカルTipsの **[3. NVMe SSDローカルディスクをストレージ領域に活用する方法](#3-nvme-ssdローカルディスクをストレージ領域に活用する方法)** の結果から、NVMe SSDローカルディスクを解析フローのストレージ領域に使用することが有効であると判明しているため本Tipsもこの方法を採用することとし、 **[3.0. 概要](#3-0-概要)** に記載の7ステップにかかる時間を個別に取得出来るようにした上で、結果の妥当性を確認するために各テストケースをそれぞれ5回計測します。 なお、ここでは計算結果の出力頻度( **writeInterval** )にデフォルトの1,000タイムステップを使用している(計算結果を出力しない)ため、NVMe SSDローカルディスクを使用する効果は限定されます。 @@ -131,7 +126,7 @@ NodeName=DEFAULT CPUs=36 Boards=1 SocketsPerBoard=4 CoresPerSocket=9 ThreadsPerC - 解析対象モデル : **[OpenFOAM HPC Benchmark Suite](https://develop.openfoam.com/committees/hpc)** の **[HPC_Motorbike](https://develop.openfoam.com/committees/hpc/-/tree/develop/incompressible/simpleFoam/HPC_motorbike)** の **[Small](https://develop.openfoam.com/committees/hpc/-/tree/develop/incompressible/simpleFoam/HPC_motorbike/Small/v1912)** モデル - 計算結果の出力頻度( **writeInterval** ) : 1,000タイムステップ(デフォルト) -※3)NPSの設定方法は、 **[OCI HPCパフォーマンス関連情報](/ocitutorials/hpc/#2-oci-hpcパフォーマンス関連情報)** の **[パフォーマンスに関連するベアメタルインスタンスのBIOS設定方法](/ocitutorials/hpc/benchmark/bios-setting/)** を参照してください。 +※3)**NPS** を指定したインスタンスの作成方法は、、 **[OCI HPCパフォーマンス関連情報](/ocitutorials/hpc/#2-oci-hpcパフォーマンス関連情報)** の **[パフォーマンスに関連するベアメタルインスタンスのBIOS設定方法](/ocitutorials/hpc/benchmark/bios-setting/)** を参照してください。 ※4) **[OCI HPCテクニカルTips集](/ocitutorials/hpc/#3-oci-hpcテクニカルtips集)** の **[クラスタネットワーキングイメージの選び方](/ocitutorials/hpc/tech-knowhow/osimage-for-cluster/)** の **[1. クラスタネットワーキングイメージ一覧](/ocitutorials/hpc/tech-knowhow/osimage-for-cluster/#1-クラスタネットワーキングイメージ一覧)** のイメージ **No.1** です。 この結果、ソルバー部分に着目すると、以下のことが判明しています。 @@ -144,24 +139,18 @@ NodeName=DEFAULT CPUs=36 Boards=1 SocketsPerBoard=4 CoresPerSocket=9 ThreadsPerC この方法は、 **[OCI HPCテクニカルTips集](/ocitutorials/hpc/#3-oci-hpcテクニカルtips集)** の **[OpenFOAMインストール・利用方法](/ocitutorials/hpc/tech-knowhow/install-openfoam/)** の **[4. CFD解析フロー実行](/ocitutorials/hpc/tech-knowhow/install-openfoam//#4-cfd解析フロー実行)** を参照し、ここで解説しているチュートリアル付属のオートバイ走行時乱流シミュレーションモデルのバッチ実行の方法を参考に、 **OpenFOAM HPC Benchmark Suite** の **HPC_Motorbike** の **Small** モデルにこれを適用します。 -この際、 **Slurm** の設定ファイル **slurm.conf** の **NodeName=DEFAULT** で始まる行を以下のように修正します。 - -```sh -NodeName=DEFAULT CPUs=36 Boards=1 SocketsPerBoard=4 CoresPerSocket=9 ThreadsPerCore=1 RealMemory=500000 TmpDisk=10000 State=UNKNOWN -``` +ジョブスクリプトに指定する **Slurm** のオプションは、以下のように指定します。 -また、ジョブスクリプトに指定する **Slurm** のオプションを以下のように指定します。 - -| ノード数 | ノード当たりの
MPIプロセス数 | \-n | \-N | --ntasks-per-node | --cpu-bind | -| :--: | :-------------: | :-: | :-: | :---------------: | :---------------: | -| 1 | 32 | 32 | 1 | 32 | verbose,rank_ldom | -| | 36 | 36 | 1 | 36 | verbose,rank_ldom | -| 2 | 32 | 64 | 2 | 32 | verbose,rank_ldom | -| | 36 | 72 | 2 | 36 | verbose,rank_ldom | -| 4 | 32 | 128 | 4 | 32 | verbose,rank_ldom | -| | 36 | 144 | 4 | 36 | verbose,rank_ldom | -| 8 | 32 | 256 | 8 | 32 | verbose,rank_ldom | -| | 36 | 288 | 8 | 36 | verbose,rank_ldom | +| ノード数 | ノード当たりの
MPIプロセス数 | -n | -N | --cpu-bind | +| :--: | :-----------------: | :-: | :-: | :--------: | +| 1 | 32 | 32 | 1 | rank_ldom | +| | 36 | 36 | 1 | rank_ldom | +| 2 | 32 | 64 | 2 | rank_ldom | +| | 36 | 72 | 2 | rank_ldom | +| 4 | 32 | 128 | 4 | rank_ldom | +| | 36 | 144 | 4 | rank_ldom | +| 8 | 32 | 256 | 8 | rank_ldom | +| | 36 | 288 | 8 | rank_ldom | また、本テクニカルTipsの **[3. NVMe SSDローカルディスクをストレージ領域に活用する方法](#3-nvme-ssdローカルディスクをストレージ領域に活用する方法)** の結果から、NVMe SSDローカルディスクを解析フローのストレージ領域に使用することが有効であると判明しているため本Tipsもこの方法を採用することとし、 **[3.0. 概要](#3-0-概要)** に記載の7ステップにかかる時間を個別に取得出来るようにした上で、結果の妥当性を確認するために各テストケースをそれぞれ5回計測します。 なお、ここでは計算結果の出力頻度( **writeInterval** )にデフォルトの1,000タイムステップを使用している(計算結果を出力しない)ため、NVMe SSDローカルディスクを使用する効果は限定されます。 @@ -246,7 +235,7 @@ NodeName=DEFAULT CPUs=36 Boards=1 SocketsPerBoard=4 CoresPerSocket=9 ThreadsPerC - 解析対象モデル : **[OpenFOAM HPC Benchmark Suite](https://develop.openfoam.com/committees/hpc)** の **[HPC_Motorbike](https://develop.openfoam.com/committees/hpc/-/tree/develop/incompressible/simpleFoam/HPC_motorbike)** の **[Small](https://develop.openfoam.com/committees/hpc/-/tree/develop/incompressible/simpleFoam/HPC_motorbike/Small/v1912)** モデル - 計算結果の出力頻度( **writeInterval** ) : 10タイムステップ(デフォルト値:1,000タイムステップ) -※5)NPSの設定方法は、 **[OCI HPCパフォーマンス関連情報](/ocitutorials/hpc/#2-oci-hpcパフォーマンス関連情報)** の **[パフォーマンスに関連するベアメタルインスタンスのBIOS設定方法](/ocitutorials/hpc/benchmark/bios-setting/)** を参照してください。 +※5)**NPS** を指定したインスタンスの作成方法は、、 **[OCI HPCパフォーマンス関連情報](/ocitutorials/hpc/#2-oci-hpcパフォーマンス関連情報)** の **[パフォーマンスに関連するベアメタルインスタンスのBIOS設定方法](/ocitutorials/hpc/benchmark/bios-setting/)** を参照してください。 ※6) **[OCI HPCテクニカルTips集](/ocitutorials/hpc/#3-oci-hpcテクニカルtips集)** の **[クラスタネットワーキングイメージの選び方](/ocitutorials/hpc/tech-knowhow/osimage-for-cluster/)** の **[1. クラスタネットワーキングイメージ一覧](/ocitutorials/hpc/tech-knowhow/osimage-for-cluster/#1-クラスタネットワーキングイメージ一覧)** のイメージ **No.1** です。 この結果、以下のことが判明しています。 @@ -262,17 +251,11 @@ NodeName=DEFAULT CPUs=36 Boards=1 SocketsPerBoard=4 CoresPerSocket=9 ThreadsPerC この際、 **OpenFOAM** の設定ファイル **system/controlDict** の **writeInterval** を **10** に変更します。 この値がデフォルト値 **1,000** のままの場合、計算結果を出力しないため、NVMe SSDローカルディスクの効果を得ることが出来ません。 -また、 **Slurm** の設定ファイル **slurm.conf** の **NodeName=DEFAULT** で始まる行を以下のように修正します。 - -```sh -NodeName=DEFAULT CPUs=36 Boards=1 SocketsPerBoard=4 CoresPerSocket=9 ThreadsPerCore=1 RealMemory=500000 TmpDisk=10000 State=UNKNOWN -``` - -また、ジョブスクリプトに指定する **Slurm** のオプションを以下のように指定します。 +ジョブスクリプトに指定する **Slurm** のオプションは、以下のように指定します。 -| \-n | \-N | --ntasks-per-node | --cpu-bind | -| :-: | :-: | :---------------: | :---------------: | -| 288 | 8 | 36 | verbose,rank_ldom | +| -n | -N | --cpu-bind | +| :-: | :-: | :---------------: | +| 288 | 8 | rank_ldom | また、 **[3.0. 概要](#3-0-概要)** に記載の7ステップにかかる時間を個別に取得出来るようにした上で、結果の妥当性を確認するために各テストケースをそれぞれ5回計測します。 diff --git a/tutorials/_hpc/benchmark/openfoam-tuning/process_binding.png b/tutorials/_hpc/benchmark/openfoam-tuning/process_binding.png index ded3357ce2..fc4c44023c 100644 Binary files a/tutorials/_hpc/benchmark/openfoam-tuning/process_binding.png and b/tutorials/_hpc/benchmark/openfoam-tuning/process_binding.png differ diff --git a/tutorials/_hpc/benchmark/openfoam-tuning/process_binding2.png b/tutorials/_hpc/benchmark/openfoam-tuning/process_binding2.png index 8037778a27..e02dddc983 100644 Binary files a/tutorials/_hpc/benchmark/openfoam-tuning/process_binding2.png and b/tutorials/_hpc/benchmark/openfoam-tuning/process_binding2.png differ diff --git a/tutorials/_hpc/benchmark/topology-aware-cn-tuning.md b/tutorials/_hpc/benchmark/topology-aware-cn-tuning.md index 5cccd8ee39..f13cbc5c22 100644 --- a/tutorials/_hpc/benchmark/topology-aware-cn-tuning.md +++ b/tutorials/_hpc/benchmark/topology-aware-cn-tuning.md @@ -83,7 +83,7 @@ SwitchName=ss0 Switches=ls[0-1] - それ以外のリーフスイッチ定義行を実際のリーフスイッチ数分作成 - リーフスイッチ定義行の **Nodes=** に実際のインスタンスの名前解決可能なホスト名を記載 -次に、Slurmマネージャと全ての計算ノードで **slurm.conf** を以下のように修正します。 +次に、Slurmマネージャ、Slurmクライアント、及び全ての計算ノードで **slurm.conf** を以下のように修正します。 ``` $ diff slurm.conf_org slurm.conf @@ -91,11 +91,21 @@ $ diff slurm.conf_org slurm.conf < SelectType=select/linear --- > SelectType=select/cons_tres -28a29 +22c22 +< NodeName=inst-aaaaa-x9,inst-bbbbb-x9 CPUs=36 Boards=1 SocketsPerBoard=2 CoresPerSocket=18 ThreadsPerCore=1 RealMemory=500000 TmpDisk=10000 State=UNKNOWN +--- +> NodeName=inst-aaaaa-x9,inst-bbbbb-x9,inst-ccccc-x9,inst-ddddd-x9 CPUs=36 Boards=1 SocketsPerBoard=2 CoresPerSocket=18 ThreadsPerCore=1 RealMemory=500000 TmpDisk=10000 State=UNKNOWN +23c23 +< PartitionName=sltest Nodes=ALL Default=YES MaxTime=INFINITE State=UP +--- +> PartitionName=sltest Nodes=ALL Default=YES MaxTime=INFINITE State=UP OverSubscribe=Exclusive +24a25 > TopologyPlugin=topology/tree $ ``` +この設定は、リソース選択アルゴリズムを指定する **SelectType** 行に **Topology-aware resource allocation** を可能にする **select/cons_tres** を指定し、これに伴い計算ノードのジョブ共有が有効となってしまうパーティション **sltest** に **OverSubscribe=Exclusive** を指定することで再度ノード占有パーティションであることを宣言し、スパイン・リーフトポロジーのためのプラグイン **topology/tree** を **TopologyPlugin** 行に定義しています。 + 次に、以下コマンドをSlurmマネージャのopcユーザで実行し、先の **slurm.conf** の修正を反映します。 ``` diff --git a/tutorials/_hpc/tech-knowhow/install-openfoam.md b/tutorials/_hpc/tech-knowhow/install-openfoam.md index 21c1bfd3a4..2c6cffb0b6 100644 --- a/tutorials/_hpc/tech-knowhow/install-openfoam.md +++ b/tutorials/_hpc/tech-knowhow/install-openfoam.md @@ -393,6 +393,7 @@ $ この設定は、GNOMEデスクトップのログインに使用するユーザがパスワード認証を無効にしている場合、スクリーンロックがかかった場合にロック解除が出来なくなることを防止します。 +*** # 4. CFD解析フロー実行 ## 4-0. 概要 diff --git a/tutorials/_hpc/tech-knowhow/setup-slurm-cluster.md b/tutorials/_hpc/tech-knowhow/setup-slurm-cluster.md index 87c392351a..270b3adc4c 100644 --- a/tutorials/_hpc/tech-knowhow/setup-slurm-cluster.md +++ b/tutorials/_hpc/tech-knowhow/setup-slurm-cluster.md @@ -36,8 +36,6 @@ table, th, td { 以上の利点を享受するべく本テクニカルTipsは、 **OpenMPI** のMPI並列アプリケーションを **PMIx** の大規模並列ジョブに対する利点を生かして実行することを念頭に、 **PMIx** と **[UCX](https://openucx.org/)** を取り込んだ **Slurm** 環境を構築し、初期化処理時間の効果を検証すべく、 **[Intel MPI Benchmarks](https://www.intel.com/content/www/us/en/developer/articles/technical/intel-mpi-benchmarks.html)** PingPongのレイテンシに着目して比較・検証を実施します。 -なお、本テクニカルTipsで使用する **OpenMPI** を構築する方法は、**[OCI HPCテクニカルTips集](/ocitutorials/hpc/#3-oci-hpcテクニカルtips集)** の **[Slurm環境での利用を前提とするUCX通信フレームワークベースのOpenMPI構築方法](/ocitutorials/hpc/tech-knowhow/build-openmpi/)** を参照してください。 - *** # 1. 前提システム @@ -57,7 +55,7 @@ table, th, td { ![画面ショット](architecture_diagram.png) ※2)本テクニカルTipsは、 **[VM.Optimized3.Flex](https://docs.oracle.com/ja-jp/iaas/Content/Compute/References/computeshapes.htm#flexible)** を使用します。 -※3)本テクニカルTipsは、 **クラスタ・ネットワーク** に接続された2ノードの **[BM.Optimized3.36](https://docs.oracle.com/ja-jp/iaas/Content/Compute/References/computeshapes.htm#bm-hpc-optimized)** を使用します。 +※3)本テクニカルTipsは、 **クラスタ・ネットワーク** に接続された2ノードの **[BM.Optimized3.36](https://docs.oracle.com/ja-jp/iaas/Content/Compute/References/computeshapes.htm#bm-hpc-optimized)** を、 **[OCI HPCパフォーマンス関連情報](/ocitutorials/hpc/#2-oci-hpcパフォーマンス関連情報)** の **[パフォーマンスに関連するベアメタルインスタンスのBIOS設定方法](/ocitutorials/hpc/benchmark/bios-setting/)** の手順に従い、 **Simultanious Multi Threading** (以降 **SMT** と呼称)を無効化して使用します。 ※4)**ファイル・ストレージ** やベア・メタル・インスタンスNFSサーバ等、任意の手法で構築されたNFSサーバです。NFSでサービスするファイル共有ストレージ構築方法は、 **[OCI HPCテクニカルTips集](/ocitutorials/hpc/#3-oci-hpcテクニカルtips集)** の **[HPC/GPUクラスタ向けファイル共有ストレージの最適な構築手法](/ocitutorials/hpc/tech-knowhow/howto-configure-sharedstorage/)** を参照ください。 ※5)NFSサーバがサービスするジョブ投入ユーザのホームディレクトリは、Slurmクライアントと計算ノードでNFSマウントします。 ※6)**Oracle Linux** 8.10ベースのHPC **[クラスタネットワーキングイメージ](/ocitutorials/hpc/#5-13-クラスタネットワーキングイメージ)** で、 **[OCI HPCテクニカルTips集](/ocitutorials/hpc/#3-oci-hpcテクニカルtips集)** の **[クラスタネットワーキングイメージの選び方](/ocitutorials/hpc/tech-knowhow/osimage-for-cluster/)** の **[1. クラスタネットワーキングイメージ一覧](/ocitutorials/hpc/tech-knowhow/osimage-for-cluster/#1-クラスタネットワーキングイメージ一覧)** のイメージ **No.12** です。Slurmマネージャは、計算ノードにインストールする **Slurm** のRPMをビルドするため、Slurmクライアントは、計算ノードのアプリケーション開発環境の役割を担うため、計算ノードと同じOSを採用します。 @@ -400,18 +398,12 @@ AccountingStorageType=accounting_storage/slurmdbd AccountingStorageHost=slurm-srv AccountingStoragePort=7004 MpiDefault=pmix -NodeName=DEFAULT CPUs=72 Boards=1 SocketsPerBoard=2 CoresPerSocket=18 ThreadsPerCore=2 RealMemory=500000 TmpDisk=10000 State=UNKNOWN -NodeName=inst-aaaaa-x9,inst-bbbbb-x9 +NodeName=inst-aaaaa-x9,inst-bbbbb-x9 CPUs=36 Boards=1 SocketsPerBoard=2 CoresPerSocket=18 ThreadsPerCore=1 RealMemory=500000 TmpDisk=10000 State=UNKNOWN PartitionName=sltest Nodes=ALL Default=YES MaxTime=INFINITE State=UP TaskPlugin=task/affinity ``` -なお、 **SlurmctldHost** 、 **AccountingStorageHost** 、及び **NodeName** の設定値は、自身の環境に合わせて修正します。 -また、計算ノードのSMTが無効化されている場合は、 **NodeName=DEFAULT** で始まる行を以下に変更します。 - -```sh -NodeName=DEFAULT CPUs=36 Boards=1 SocketsPerBoard=2 CoresPerSocket=18 ThreadsPerCore=1 RealMemory=500000 TmpDisk=10000 State=UNKNOWN -``` +なお、 **SlurmctldHost** 、 **AccountingStorageHost** 、及び **NodeName** の設定値は、自身の環境に合わせて修正します。 [ **slurmdbd.conf** ] ```sh diff --git a/tutorials/_hpc/tech-knowhow/slurm-tips.md b/tutorials/_hpc/tech-knowhow/slurm-tips.md index fd4db8c9f9..96efadb84d 100644 --- a/tutorials/_hpc/tech-knowhow/slurm-tips.md +++ b/tutorials/_hpc/tech-knowhow/slurm-tips.md @@ -16,6 +16,7 @@ header: 1. **[Prolog/Epilog](https://slurm.schedmd.com/prolog_epilog.html)** セットアップ方法 2. メンテナンスを考慮した計算/GPUノードの **[ステータス](https://slurm.schedmd.com/scontrol.html#OPT_State_2)** 変更方法 3. ヘテロジニアス環境下のパーティションを使った計算/GPUノード割り当て制御 +4. 複数ジョブによる計算/GPUノード共有方法 これらのTipsは、全て **[OCI HPCテクニカルTips集](/ocitutorials/hpc/#3-oci-hpcテクニカルtips集)** の **[Slurmによるリソース管理・ジョブ管理システム構築方法](/ocitutorials/hpc/tech-knowhow/setup-slurm-cluster/)** に従って構築された **Slurm** 環境を前提に記載します。 @@ -59,7 +60,7 @@ log_file=/var/log/slurm/clean_memory.log ## 1-1. セットアップ手順 -Slurmマネージャと全ての計算/GPUノードの **/opt/slurm/etc/slurm.conf** に以下の記述を追加します。 +Slurmマネージャ、Slurmクライアント、及び全ての計算/GPUノードの **/opt/slurm/etc/slurm.conf** に以下の記述を追加します。 ```sh PrologFlags=Alloc @@ -237,18 +238,28 @@ $ ## 3-0. 概要 HPC/GPUクラスタは、構成する計算/GPUノードが異なるリソースを有するヘテロジニアスな環境となることがあります。 -この際、実行するジョブが想定するリソースを持つ計算/GPUノードで実行されることを保証する必要がありますが、 **Slurm** のパーティションに割り当てられる計算/GPUノードを適切に指定することで、この運用要件を実現することが可能です。 +この際、ジョブが想定するリソースを持つ計算/GPUノードで実行されることを保証する必要がありますが、 **Slurm** のパーティションに割り当てられる計算/GPUノードを適切に指定することで、この運用要件を実現することが可能です。 本Tipsは、前述の運用要件を念頭に、ジョブを投入するパーティションを使い分けることで想定する計算/GPUノードに適切にジョブが割当てられる **Slurm** 環境を構築する方法を解説します。 -構築する **Slurm** 環境は、以下とします。 +構築する **Slurm** 環境は、計算ノードに6ノードの **[BM.Optimized3.36](https://docs.oracle.com/ja-jp/iaas/Content/Compute/References/computeshapes.htm#bm-hpc-optimized)** を使用し、これを **NUMA nodes per socket** (以降 **NPS** と呼称)と **Simultanious Multi Threading** (以降 **SMT** と呼称)の組合せが以下となるパーティション構成とします。(※1) -| パーティション名 | 割当てられる計算/GPUノード名 | デフォルトパーティション(※1) | -| :------: | :-------------------------: | :--------------: | -| nps1 | inst-aaaaa-x9 inst-bbbbb-x9 | Yes | -| nps2 | inst-ccccc-x9 inst-ddddd-x9 | No | +| パーティション名 | 割当てられるノード名 | NPS | SMT | デフォルトパーティション(※2) | +| :------: | :---------------------------------------------------------------------------------------: | :------: | :-: | :--------------: | +| all | inst-aaaaa-x9 inst-bbbbb-x9
inst-ccccc-x9 inst-ddddd-x9
inst-eeeee-x9 inst-fffff-x9 | - | - | Yes | +| nps1 | inst-aaaaa-x9 inst-bbbbb-x9 | **NPS1** | 無効 | No | +| nps2 | inst-ccccc-x9 inst-ddddd-x9 | **NPS2** | 無効 | No | +| smte | inst-eeeee-x9 inst-fffff-x9smt | **NPS1** | 有効 | No | -※1)パーティション名を指定せずに投入したジョブが割当てられるパーティションです。 +※1)**NPS** と **SMT** を指定したインスタンスの作成方法は、 **[OCI HPCパフォーマンス関連情報](/ocitutorials/hpc/#2-oci-hpcパフォーマンス関連情報)** の **[パフォーマンスに関連するベアメタルインスタンスのBIOS設定方法](/ocitutorials/hpc/benchmark/bios-setting/)** を参照してください。 +※2)パーティション名を指定せずに投入したジョブが割当てられるパーティションです。 + +これにより、以下の割り当て制御が可能になります。 + +- **NPS** にこだわらないジョブはパーティションを指定せずに投入(デフォルトの **all** に投入される) +- **NPS1** で **SMT** が無効の計算ノードで実行するジョブはパーティション **nps1** に投入 +- **NPS2** の計算ノードで実行するジョブはパーティション **nps2** に投入 +- **SMT** が有効の計算ノードで実行するジョブはパーティション **smt** に投入 ## 3-1. slurm.conf修正 @@ -257,11 +268,19 @@ HPC/GPUクラスタは、構成する計算/GPUノードが異なるリソース 作成する **slurm.conf** は、 **NodeName** 行と **PartitionName** 行を以下に修正します。 ```sh -NodeName=inst-aaaaa-x9,inst-bbbbb-x9,inst-ccccc-x9,inst-ddddd-x9 -PartitionName=nps1 Nodes=inst-aaaaa-x9,inst-bbbbb-x9 Default=YES MaxTime=INFINITE State=UP +NodeName=inst-aaaaa-x9,inst-bbbbb-x9 CPUs=36 Boards=1 SocketsPerBoard=2 CoresPerSocket=18 ThreadsPerCore=1 RealMemory=500000 TmpDisk=10000 State=UNKNOWN +NodeName=inst-ccccc-x9,inst-ddddd-x9 CPUs=36 Boards=1 SocketsPerBoard=4 CoresPerSocket=9 ThreadsPerCore=1 RealMemory=500000 TmpDisk=10000 State=UNKNOWN +NodeName=inst-eeeee-x9,inst-fffff-x9 CPUs=72 Boards=1 SocketsPerBoard=2 CoresPerSocket=18 ThreadsPerCore=2 RealMemory=500000 TmpDisk=10000 State=UNKNOWN +PartitionName=all Nodes=ALL Default=YES MaxTime=INFINITE State=UP +PartitionName=nps1 Nodes=inst-aaaaa-x9,inst-bbbbb-x9 MaxTime=INFINITE State=UP PartitionName=nps2 Nodes=inst-ccccc-x9,inst-ddddd-x9 MaxTime=INFINITE State=UP +PartitionName=smte Nodes=inst-eeeee-x9,inst-fffff-x9 MaxTime=INFINITE State=UP ``` +この設定は、 **BM.Optimized3.36** がノード当たり2ソケットでソケット当たり18コアでコア当たり2ハードウェアスレッドを搭載することを念頭に、 **NPS1** と **NPS2** と **SMT** 有効・無効の計算ノードを異なるリソース定義の **NodeName** フィールドで定義しています。(※3) + +※3)**slurm.conf** 中の **Socket** は、 **NUMA**(Non-Umiform Memory Access)ノードに相当するため、 **NPS2** の場合は **Socket** がノード当たり4個として定義します。 + ## 3.2. slurm.conf修正の反映 本章は、先に修正した **slurm.conf** を反映します。 @@ -274,12 +293,89 @@ Slurmマネージャ、Slurmクライアント、及び計算/GPUノードで、 $ sudo su - slurm -c "scontrol reconfigure" ``` -次に、Slurmマネージャのopcユーザで以下のコマンドを実行し、修正した内容が反映されていることを確認します。 +次に、Slurmマネージャのopcユーザで以下のコマンドを実行し、パーティションが想定通り作成されていることを確認します。 ```sh $ sinfo PARTITION AVAIL TIMELIMIT NODES STATE NODELIST -nps1* up infinite 2 idle inst-aaaaa-x9,inst-bbbbb-x9 +all* up infinite 6 idle inst-aaaaa-x9,inst-bbbbb-x9,inst-ccccc-x9,inst-ddddd-x9,inst-eeeee-x9,inst-fffff-x9 +nps1 up infinite 2 idle inst-aaaaa-x9,inst-bbbbb-x9 nps2 up infinite 2 idle inst-ccccc-x9,inst-ddddd-x9 +smte up infinite 2 idle inst-eeeee-x9,inst-fffff-x9 +$ +``` + +*** +# 4. 複数ジョブによる計算/GPUノード共有方法 + +## 4-0. 概要 + +計算/GPUノードのノード間を高帯域・低レイテンシで接続する **[クラスタ・ネットワーク](/ocitutorials/hpc/#5-1-クラスタネットワーク)** は、対応するシェイプが **ベア・メタル・インスタンス** となるため、 **クラスタ・ネットワーク** の利用を前提とする **ベア・メタル・インスタンス** ベースのHPC/GPUクラスタで使用するリソース(コア・メモリ)が少ないジョブを実行する場合、リソース有効活用の観点から複数のジョブを1ノードに混在させる運用の必要性が生じます。 +ただこの場合でも、複数ノードを使用するマルチノードジョブを実行する計算/GPUノードでは、これらのジョブの実行を妨げないようにノード占有で実行する必要があります。 + +本Tipsは、前述の運用要件を念頭に、ジョブを投入するパーティションを使い分けることで、ノード占有ジョブとノード共有ジョブが混在する **Slurm** 環境を構築する方法を解説します。 + +構築する **Slurm** 環境は、計算ノードに3ノードの **[BM.Optimized3.36](https://docs.oracle.com/ja-jp/iaas/Content/Compute/References/computeshapes.htm#bm-hpc-optimized)** (搭載コア数: 36、 搭載メモリ量: 512GB(**Slurm** 設定上の利用可能メモリ量を500GBに設定))を使用し、以下のパーティション構成とします。 + +| パーティション名 | 割当てられるノード名 | ノードの占有/共有 | +| :------: | :-------------------------: | :---: | +| large | inst-aaaaa-x9 inst-bbbbb-x9 | 占有 | +| small | inst-ccccc-x9 | 共有 | + +これにより、以下の運用が可能になります。 + +- ノード占有ジョブはパーティション **large** に投入 +- ノード共有ジョブはパーティション **small** に投入 +- パーティション **large** に投入されたジョブは実行中ジョブの総使用ノード数が2ノードを超えない範囲で先着順にノード占有実行 +- パーティション **small** に投入されたジョブは実行中ジョブの総使用コア数と総使用メモリ量がそれぞれ36コアと500GBを超えない範囲で先着順にノード共有実行(※4) + +※4)ジョブ投入時は、使用するメモリ量を **--mem=xxxxM** オプションで指定する必要があります。 +以下は、使用するメモリ量を100,000 MBに指定してジョブを **small** パーティションに投入しています。 + +```sh +$ srun -p small -n 4 --mem=100000M ./a.out +``` + +## 4-1. slurm.conf修正 + +本章は、本Tipsの想定する運用要件を実現するよう **slurm.conf** を修正します。 + +作成する **slurm.conf** は、 **SelectType** 行、 **NodeName** 行、及び **PartitionName** 行を以下に修正します。 + +```sh +: +SelectType=select/cons_tres +: +NodeName=inst-aaaaa-x9,inst-bbbbb-x9,inst-ccccc-x9 CPUs=36 Boards=1 SocketsPerBoard=2 CoresPerSocket=18 ThreadsPerCore=1 RealMemory=500000 TmpDisk=10000 State=UNKNOWN +PartitionName=large Nodes=inst-aaaaa-x9,inst-bbbbb-x9 MaxTime=INFINITE State=UP OverSubscribe=Exclusive +PartitionName=small Nodes=inst-ccccc-x9 MaxTime=INFINITE State=UP +: +``` + +この設定は、リソース選択アルゴリズムを指定する **SelectType** 行にノード共有ジョブを可能にする **select/cons_tres** を指定し、パーティション **large** に **OverSubscribe=Exclusive** を指定することでノード占有パーティションを宣言しています。 + +## 4.2. slurm.conf修正の反映 + +本章は、先に修正した **slurm.conf** を反映します。 + +Slurmマネージャ、Slurmクライアント、及び計算/GPUノードで、先に修正した **slurm.conf** を **/opt/slurm/etc** ディレクトリにコピーします。 + +次に、Slurmマネージャのopcユーザで以下のコマンドを実行し、 **slurm.conf** ファイルの変更を反映、その結果を確認します。 + +```sh +$ sudo su - slurm -c "scontrol reconfigure" +$ sudo su - slurm -c "scontrol show config" | grep "SelectType " +SelectType = select/cons_tres +$ +``` + +次に、Slurmマネージャのopcユーザで以下のコマンドを実行し、パーティションが想定通り作成されていることを確認します。 + +```sh +$ sinfo -l +Tue Dec 24 18:00:11 2024 +PARTITION AVAIL TIMELIMIT JOB_SIZE ROOT OVERSUBS GROUPS NODES STATE RESERVATION NODELIST +small up infinite 1-infinite no NO all 1 idle inst-ccccc-x9 +large up infinite 1-infinite no EXCLUSIV all 2 idle inst-aaaaa-x9,inst-bbbbb-x9 $ ``` \ No newline at end of file