Skip to content

Commit

Permalink
チュートリアル:OCI HPCテクニカルTips集
Browse files Browse the repository at this point in the history
カテゴリ:OCI HPCポータル
更新内容:"パフォーマンスを考慮したプロセス・スレッドのコア割当て指定方法"新規作成、これらに伴う修正及び誤記訂正・軽微な修正
  • Loading branch information
fwiw6430 committed Jan 10, 2025
1 parent ae7491c commit 9ea58d4
Show file tree
Hide file tree
Showing 11 changed files with 1,135 additions and 18 deletions.
8 changes: 7 additions & 1 deletion _pages/hpc.md
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,12 @@ HPC/機械学習ワークロードを実行する際に有益なテクニカル
また **OpenMPI** は、 **[クラスタ・ネットワーク](/ocitutorials/hpc/#5-1-クラスタネットワーク)** を介して高帯域・低遅延のMPIプロセス間通信を実現するための通信フレームワークに **[UCX](https://openucx.org/)** を採用し、MPI通信性能を最適化するためには **UCX** のパラメータを適切に設定することが求められます。
本テクニカルTipsは、 **OpenMPI** のMPI通信性能に影響するパラメーターやその指定方法に関する有益なTipsを解説します。

- **[パフォーマンスを考慮したプロセス・スレッドのコア割当て指定方法](/ocitutorials/hpc/benchmark/cpu-binding/)**

NUMAアーキテクチャを採用するインスタンスに於けるMPIやOpenMPの並列プログラム実行は、生成されるプロセスやスレッドをどのようにインスタンスのコアに割当てるかでその性能が大きく変動するため、その配置を意識してアプリケーションを実行することが求められます。
このため、使用するシェイプに搭載されるプロセッサのアーキテクチャやアプリケーションの特性に合わせて意図したとおりにプロセスやスレッドをコアに配置するために必要な、MPI実装、OpenMP実装、及びジョブスケジューラがそれぞれ有するコア割当て制御機能に精通している必要があります。
本テクニカルTipsは、 **MPI** 実装に **[OpenMPI](https://www.open-mpi.org/)****OpenMP** 実装にGNUコンパイラ、及びジョブスケジューラに **[Slurm](https://slurm.schedmd.com/)** を取り上げ、これらのコア割当て機能を駆使してMPIプロセスやOpenMPスレッドのコア割当てを行う方法を解説します。

## 2-3. プロファイリング関連Tips集

本章は、HPCアプリケーションのパフォーマンス解析やチューニングに必要な情報を収集する、プロファイリング関連Tips集を提供します。
Expand Down Expand Up @@ -444,7 +450,7 @@ HPC/機械学習ワークロードを実行する際に有益なテクニカル

**[OpenFOAM](https://www.openfoam.com/)** は、CAE分野で多くの利用実績を持つオープンソースのCFDアプリケーションです。
**OpenFOAM** は、メッシュ作成等のプリ処理、ソルバーによる解析処理、及び解析結果を可視化するポスト処理の全てのCFD解析フローを、自身が提供するツール群と外部のツール群を組合せてオープンソースソフトウェアで完結することが可能です。また **OpenFOAM** が提供するソルバーは、MPIで並列化されており、1万コアを超える並列実行の実績も報告されています。
本テクニカルTipsは、 **OpenFOAM** とこれを中核とするCFD解析フローに有用なオープンソースのツール群を、HPCワークロードの実行に最適なベアメタルインスタンスにインストールし、これを利用する方法を解説します。
本テクニカルTipsは、 **OpenFOAM** とこれを中核とするCFD解析フローに有用なオープンソースのツール群をHPCワークロードの実行に最適なベアメタルインスタンスにインストールし、これを利用する方法を解説します。

- **[Slurmによるリソース管理・ジョブ管理システム運用Tips](/ocitutorials/hpc/tech-knowhow/slurm-tips/)**

Expand Down
1,106 changes: 1,106 additions & 0 deletions tutorials/_hpc/benchmark/cpu-binding.md

Large diffs are not rendered by default.

Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
25 changes: 13 additions & 12 deletions tutorials/_hpc/tech-knowhow/build-openmpi.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,26 +11,27 @@ header:
***
# 0. 概要

**[Slurm](https://slurm.schedmd.com/)** 環境で **[OpenMPI](https://www.open-mpi.org/)** のアプリケーションを実行する場合、その動作モードは以下の選択肢があります
**[Slurm](https://slurm.schedmd.com/)** 環境で **[OpenMPI](https://www.open-mpi.org/)** のアプリケーションを実行する場合、計算リソース確保、MPIプロセス起動、及びMPIプロセス間通信初期化をそれぞれ誰が行うか、ノード間リモート実行と起動コマンドに何を使用するかにより、以下3種類の動作モードが存在します

1. 計算リソースの確保、MPIプロセスの起動、及びMPIプロセス間通信の初期化処理を **Slurm****[PMIx](https://pmix.github.io/)** が行う。
2. 計算リソースの確保を **Slurm** が行い、MPIプロセスの起動とMPIプロセス間通信の初期化処理は **Slurm****[PRRTE](https://docs.prrte.org/en/latest/)** が行う。
3. 計算リソースの確保を **Slurm** が行い、MPIプロセスの起動とMPIプロセス間通信の初期化処理は **PRRTE** が行う。
| No. | 計算リソース<br>確保 | MPIプロセス<br>起動 | MPIプロセス間<br>通信初期化 | ノード間<br>リモート実行|起動コマンド |
| :-: | :-------: | :-------: | :-------------------------------------------------------------------------: | :---------------------------------------------------------------: | :--------: |
| 1. | **Slurm** | **Slurm** | **[PMIx](https://pmix.github.io/)** | **Slurm** |**srun** |
| 2. | **Slurm** | **Slurm** | **PMIx** | **Slurm** |**mpirun**<br>(※1) |
| 3. | **Slurm** | **[PRRTE](https://docs.prrte.org/en/latest/)** | **PMIx** | **SSH**<br>(※2) |**mpirun** |

それぞれの動作モードは、MPIアプリケーションの起動に以下のコマンドを使用します。

1. **Slurm** に付属する **srun**
2. **Slurm** と連携するように構築された **OpenMPI** に付属する **mpirun**
3. **Slurm** と連携するように構築されていない **OpenMPI** に付属する **mpirun** (パスフレーズ無しで計算ノード間をSSHアクセス出来る必要があります。)
※1)本テクニカルTipsの手順に従い、 **Slurm** と連携するよう **OpenMPI** がビルドされている必要があります。
※2)パスフレーズ無しで計算ノード間をSSHアクセス出来るよう設定する必要があります。

ここで **1.** の動作モードは、その他の動作モードに対して以下の利点があります。

- 高並列アプリケーションを高速に起動することが可能
- 高並列アプリケーションを高速に起動することが可能(※3)
- プロセスバインディングや終了処理等のプロセス管理を **Slurm** に統合することが可能
- 精度の高いアカウンティング情報を **Slurm** に提供することが可能
- **Slurm** クラスタ内のパスフレーズ無しSSHアクセス設定が不要

また **[UCX](https://openucx.org/)** は、HPCでの利用を念頭に開発されているオープンソースの通信フレームワークで、ノード内・ノード間を問わず以下の多様なトランスポートレベルの通信手段を **OpenMPI** から利用することが出来ます。
※3)この詳細は、**[OCI HPCテクニカルTips集](/ocitutorials/hpc/#3-oci-hpcテクニカルtips集)****[Slurmによるリソース管理・ジョブ管理システム構築方法](/ocitutorials/hpc/tech-knowhow/setup-slurm-cluster/)****[0. 概要](/ocitutorials/hpc/tech-knowhow/setup-slurm-cluster/#0-概要)** を参照してください。

また **[UCX](https://openucx.org/)** は、HPCでの利用を念頭に開発されているトランスポートレベルのオープンソース通信フレームワークで、 **OpenMPI** から利用可能な以下のノード内・ノード間通信手段を提供します。

[ノード内]
- POSIX共有メモリ
Expand Down Expand Up @@ -194,7 +195,7 @@ $ make bt-mz CLASS=C
次に、以下コマンドを **OpenMPI** を利用するユーザで何れか1ノードで実行し、 **NAS Parallel Benchmarks** を実行、その結果を確認します。

```sh
$ mpirun -n 36 -N 18 -hostfile ~/hostlist.txt -x OMP_NUM_THREADS=2 -x UCX_NET_DEVICES=mlx5_2:1 --bind-to none ./bin/bt-mz.C.x
$ mpirun -n 36 -N 18 --hostfile ~/hostlist.txt -x OMP_NUM_THREADS=2 -x UCX_NET_DEVICES=mlx5_2:1 --bind-to none ./bin/bt-mz.C.x


NAS Parallel Benchmarks (NPB3.4-MZ MPI+OpenMP) - BT-MZ Benchmark
Expand Down
2 changes: 2 additions & 0 deletions tutorials/_hpc/tech-knowhow/cluster-with-pdsh.md
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,8 @@ inst-f5fra-x9-ol8: inst-f5fra-x9-ol8
inst-f5fra-x9-ol8: inst-f5fra-x9-ol8
```

**-f 1** オプションを付与した場合の管理対象ノードへのコマンド発行順序は、ホストリストファイルに於ける出現順ではなく、ホスト名のアルファベット順です。

## 2-3. 管理対象ノードがレスポンスしない場合

管理対象ノードが障害等でSSHのコマンド要求に応じられない場合は、当然 **pdsh** の実行も問題の管理対象ノードのところで停止します。
Expand Down
2 changes: 2 additions & 0 deletions tutorials/_hpc/tech-knowhow/compute-host-list.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ PRETTY_NAME="Oracle Linux Server 8.6"
$
```

またMPIプログラムを実行する際も、起動コマンド( **mpirun** 等)への実行ノード指示( **--hostfile** オプション)に上記のホスト名リスト(いわゆるホストファイル)が必要になることがあります。

このホスト名リストは、以下のような方法で効率的に作成することが可能です。

1. **OCI** コンソールを活用する方法
Expand Down
4 changes: 2 additions & 2 deletions tutorials/_hpc/tech-knowhow/install-openfoam.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: "OpenFOAMインストール・利用方法"
excerpt: "OpenFOAMは、CAE分野で多くの利用実績を持つオープンソースのCFDアプリケーションです。OpenFOAMは、メッシュ作成等のプリ処理、ソルバーによる解析処理、及び解析結果を可視化するポスト処理の全てのCFD解析フローを、自身が提供するツール群と外部のツール群を組合せてオープンソースソフトウェアで完結することが可能です。またOpenFOAMが提供するソルバーは、MPIで並列化されており、1万コアを超える並列実行の実績も報告されています。本テクニカルTipsは、OpenFOAMとこれを中核とするCFD解析フローに有用なオープンソースのツール群を、HPCワークロードの実行に最適なベアメタルインスタンスにインストールし、これを利用する方法を解説します。"
excerpt: "OpenFOAMは、CAE分野で多くの利用実績を持つオープンソースのCFDアプリケーションです。OpenFOAMは、メッシュ作成等のプリ処理、ソルバーによる解析処理、及び解析結果を可視化するポスト処理の全てのCFD解析フローを、自身が提供するツール群と外部のツール群を組合せてオープンソースソフトウェアで完結することが可能です。またOpenFOAMが提供するソルバーは、MPIで並列化されており、1万コアを超える並列実行の実績も報告されています。本テクニカルTipsは、OpenFOAMとこれを中核とするCFD解析フローに有用なオープンソースのツール群をHPCワークロードの実行に最適なベアメタルインスタンスにインストールし、これを利用する方法を解説します。"
order: "354"
layout: single
header:
Expand Down Expand Up @@ -130,7 +130,7 @@ MPI言語規格に準拠するMPI実装
- **OpenFOAM** と外部ツールのソースプログラムのダウンロード・展開

前提ソフトウェアの **OpenMPI** をインストール・セットアップします。
この方法は、 **[OCI HPCテクニカルTips集](/ocitutorials/hpc/#3-oci-hpcテクニカルtips集)****[Slurm環境での利用を前提とするOpenMPI構築方法](/ocitutorials/hpc/tech-knowhow/build-openmpi/)** を参照してください。
この方法は、 **[OCI HPCテクニカルTips集](/ocitutorials/hpc/#3-oci-hpcテクニカルtips集)****[Slurm環境での利用を前提とするUCX通信フレームワークベースのOpenMPI構築方法](/ocitutorials/hpc/tech-knowhow/build-openmpi/)** を参照してください。

次に、以下コマンドをopcユーザで実行し、前提rpmパッケージを提供するyumレポジトリを追加します。

Expand Down
6 changes: 3 additions & 3 deletions tutorials/_hpc/tech-knowhow/slurm-tips.md
Original file line number Diff line number Diff line change
Expand Up @@ -240,11 +240,11 @@ $
HPC/GPUクラスタは、構成する計算/GPUノードが異なるリソースを有するヘテロジニアスな環境となることがあります。
この際、ジョブが想定するリソースを持つ計算/GPUノードで実行されることを保証する必要がありますが、 **Slurm** のパーティションに割り当てられる計算/GPUノードを適切に指定することで、この運用要件を実現することが可能です。

本Tipsは、前述の運用要件を念頭に、ジョブを投入するパーティションを使い分けることで想定する計算/GPUノードに適切にジョブが割当てられる **Slurm** 環境を構築する方法を解説します。
前述の運用要件を念頭に本Tipsは、ジョブ投入パーティションを使い分けることで、想定するリソースを持つ計算/GPUノードに適切にジョブが割当てられる **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)

| パーティション名 | 割当てられるノード名 | NPS | SMT | デフォルトパーティション(※2) |
| パーティション名 | 割当てられるノード名 | NPS | SMT | デフォルトパーティション<br>(※2) |
| :------: | :---------------------------------------------------------------------------------------: | :------: | :-: | :--------------: |
| all | inst-aaaaa-x9 inst-bbbbb-x9<br>inst-ccccc-x9 inst-ddddd-x9<br>inst-eeeee-x9 inst-fffff-x9 | - | - | Yes |
| nps1 | inst-aaaaa-x9 inst-bbbbb-x9 | **NPS1** | 無効 | No |
Expand Down Expand Up @@ -279,7 +279,7 @@ 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)**slurm.conf** 中の **Socket** は、NUMA(Non-Umiform Memory Access)ノードに相当するため、 **NPS2** の場合は **Socket** がノード当たり4個として定義します。

## 3.2. slurm.conf修正の反映

Expand Down

0 comments on commit 9ea58d4

Please sign in to comment.