KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

SLURMでInfiniBandを使用してテストする手順

登録日 :2024/12/01 17:58
カテゴリ :SLURM

SLURMでInfiniBandを使用してテストを実行する手順は以下の通りです:
テストスクリプトの作成:

以下の内容でテストスクリプト(例:ib_test.sh)を作成します。

#!/bin/bash
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=1
#SBATCH --partition=<パーティション名>

# サーバーノードでib_write_bwを実行
srun --nodes=1 --ntasks=1 ib_write_bw &

# クライアントノードでib_write_bwを実行
srun --nodes=1 --ntasks=1 ib_write_bw $(scontrol show hostname $SLURM_JOB_NODELIST | head -n1) &

wait

# サーバーノードでib_read_bwを実行
srun --nodes=1 --ntasks=1 ib_read_bw &

# クライアントノードでib_read_bwを実行
srun --nodes=1 --ntasks=1 ib_read_bw $(scontrol show hostname $SLURM_JOB_NODELIST | head -n1) &

wait

テストスクリプトの実行:
作成したスクリプトをSLURMジョブとして投入します。

sbatch ib_test.sh

結果の確認:
ジョブ出力ファイル(slurm-.out)を確認し、帯域幅の結果を分析します。InfiniBandが正しく機能している場合、高い帯域幅(例:FDR InfiniBandで約6100 MB/sec)が報告されるはずです。

レイテンシテストの追加(オプション):
レイテンシも測定したい場合は、スクリプトにib_read_latとib_write_latのテストを追加します。
この方法により、SLURMを使用してInfiniBandの性能を測定し、正しく機能しているかを確認できます。

#!/bin/bash
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=1
#SBATCH --partition=<パーティション名>

# サーバーノードでib_write_latを実行
srun --nodes=1 --ntasks=1 ib_write_lat &

# クライアントノードでib_write_latを実行
srun --nodes=1 --ntasks=1 ib_write_lat $(scontrol show hostname $SLURM_JOB_NODELIST | head -n1) &

wait

# サーバーノードでib_read_latを実行
srun --nodes=1 --ntasks=1 ib_read_lat &

# クライアントノードでib_read_latを実行
srun --nodes=1 --ntasks=1 ib_read_lat $(scontrol show hostname $SLURM_JOB_NODELIST | head -n1) &

wait

スクリプトを実行し、結果を確認します。
レイテンシの結果を分析します。QDR InfiniBandの場合、1-5マイクロ秒程度のレイテンシが期待されます3。

レイテンシテストを追加することで、帯域幅だけでなくネットワークの応答性も評価できます。これにより、InfiniBandネットワークの総合的なパフォーマンスを把握することができます。


10ノードをテストする場合のスクリプトは以下の通り

#!/bin/bash
#SBATCH --nodes=10                   # 使用するノード数
#SBATCH --ntasks-per-node=1          # 各ノードあたりのタスク数
#SBATCH --cpus-per-task=1            # 各タスクあたりのCPU数
#SBATCH --partition=<パーティション名>  # 使用するパーティション名

# 各ノードでib_write_bwを実行
srun ib_write_bw &

# 各ノードでib_read_bwを実行
srun ib_read_bw &

wait

スクリプトの説明

ノード数の指定:
#SBATCH --nodes=10 で10ノードを指定しています。

タスク数の指定:
#SBATCH --ntasks-per-node=1 で各ノードに1つのタスクを割り当てています。必要に応じてこの値を変更できます。

srunコマンド:
srun ib_write_bw & と srun ib_read_bw & により、各ノードで帯域幅テストが並行して実行されます。

waitコマンド:
wait コマンドは、すべてのバックグラウンドプロセスが完了するまで待機します。

実行方法
このスクリプトをファイル(例:ib_test.sh)として保存し、以下のコマンドでジョブを投入します:

sbatch ib_test.sh

注意点
InfiniBandが正しく構成されていることを確認してください。
SLURMの設定やパーティションが適切に設定されているかも確認してください。
ジョブが正常に動作しているかどうかは、出力ファイルやSLURMのジョブログ(例:slurm-.out)を確認して判断します。
この方法で、10ノードを使用したInfiniBandの性能テストが可能です。


このインフィニバンドをテストするスクリプトの実行時間はどのくらいでしょうか。
ソース

インフィニバンドをテストするスクリプトの実行時間は、テストの種類や設定によって異なりますが、一般的には以下のようになります:

帯域幅テスト(ib_read_bw、ib_write_bwなど):
デフォルトでは数秒から数分程度で終了します。
-D オプションを使用して特定の秒数を指定できます。例えば、-D 5 で5秒間テストを実行します。
--run_infinitely フラグを使用すると、ユーザーが中断するまで無限に実行され、5秒ごとに測定された帯域幅を表示します。

レイテンシテスト(ib_read_lat、ib_write_latなど):
デフォルトでは1000回の反復を行い、通常は数秒で完了します。
-n オプションで反復回数を指定できます。例えば、-n 5000 で5000回の反復を行います。

コアテスト(jitterテストを含む):
ベアメタルシステムで約12分かかります。
jitter部分は1〜2分、ストレス部分は正確に10分実行されます。

仮想環境でのテスト:
KVMゲストでの実行は、ベアメタル版よりもやや長く、約14分かかります。


InfiniBandの利用に関する環境変数

  1. IntelMPIの場合
    Intel MPIを使用する場合、以下の環境変数を設定します:
export I_MPI_FABRICS=shm:ofi
export I_MPI_OFI_PROVIDER=mlx
  • I_MPI_FABRICS: 使用するファブリックプロバイダを指定します。ここでは、共有メモリ(shm)とOpen Fabrics Interfaces(ofi)を指定しています。
  • I_MPI_OFI_PROVIDER: InfiniBand用のプロバイダを指定します。mlxはMellanoxのInfiniBandデバイスを指します。

  • Open MPIの場合
    Open MPIを使用する場合、以下のように設定できます:

export UCX_NET_DEVICES=mlx5_0:1  # 特定のデバイスを指定
  • UCX_NET_DEVICES: 使用するInfiniBandデバイスポートを指定します。ここではmlx5_0のポート1を指定しています。

  • MVAPICH2の場合
    MVAPICH2の場合は、特に環境変数を設定しなくても自動的にInfiniBandが選択されることが多いですが、必要に応じて以下のように設定できます:

export MV2_USE_INFINIBAND=1  # InfiniBandの使用を明示的に指定
  1. 確認方法
    これらの環境変数を設定した後、MPIアプリケーションを実行して、正しくInfiniBandが使用されているか確認します。例えば、以下のコマンドでベンチマークテストを実行し、通信速度やレイテンシを測定できます:
mpirun -np 4 ./your_mpi_application

または、Intel MPIの場合は以下のようにして確認できます:

mpirun -np 2 $INTEL_ONEAPI_MPI_ROOT/bin/IMB-MPI1

これにより、InfiniBandが正しく動作しているかどうかを判断することができます。


mpirunのパスが見つからない場合、以下の手順でその場所を特定することができます。

  1. MPIのインストール場所を確認
    一般的に、MPIライブラリ(OpenMPIやMVAPICHなど)がインストールされる場所は次のようになります:

OpenMPIの場合: /usr/lib64/openmpi/bin または /usr/local/bin
MVAPICHの場合: /usr/lib64/mpich/bin または /usr/local/bin

  1. 環境変数の設定
    これらのディレクトリをPATH環境変数に追加することで、mpirunコマンドを簡単に実行できるようになります。以下のコマンドを使用して、適切なパスを追加します。
# OpenMPIの場合
export PATH=/usr/lib64/openmpi/bin:$PATH

# MVAPICHの場合
export PATH=/usr/lib64/mpich/bin:$PATH

この変更を永続化するには、上記の行を~/.bashrcまたは~/.bash_profileに追加し、次のコマンドで設定を反映させます。

source ~/.bashrc
  1. mpirunの場所を検索
    もしインストール先が不明な場合、次のコマンドでシステム全体を検索できます:
which mpirun

または

find / -name mpirun 2>/dev/null

これにより、システム内でmpirunがどこにあるかがわかります。

  1. インストール確認
    MPIが正しくインストールされているか確認するため、次のコマンドを実行します:
mpirun --version

これにより、インストールされているMPIのバージョン情報が表示されるはずです。
これらの手順を通じて、mpirunの場所を特定し、適切に設定することができます。