HB VM と HC VM を使用するためのベスト プラクティス
概要
H シリーズ仮想マシン (VM) は、Azure 上の最新の HPC オファリングです。 HBシリーズのVMは60コアAMD EPYCプロセッサを提供し、明示的な有限要素分析、流体力学、気象モデリングなど、高いメモリ帯域幅要件を持つアプリケーションを実行するために最適化されています。 HC シリーズ VM には 44 コアの Intel Xeon Skylake プロセッサがあり、分子ダイナミクスや暗黙的な有限要素分析など、集中的な CPU 計算を必要とするアプリケーション向けに最適化されています。 HB および HC VM は 100 Gb/秒の EDR InfiniBand を備え、最新の MPI の種類とバージョンをサポートします。 HPC アプリケーションのスケーリング ガイドには、HB および HC VM で HPC アプリケーションをスケーリングする方法の詳細が記載されています。
Azure CycleCloud では、新しい H シリーズ VM がすぐにサポートされますが、最適なエクスペリエンスとパフォーマンスを実現するには、このページのガイドラインとベスト プラクティスに従ってください。
CentOS 7.6 HPC Marketplace イメージ
CentOS 7.6 HPC Marketplace イメージには、InfiniBand インターフェイスを有効にするためのすべてのドライバーと、 /opt にインストールされているすべての一般的な MPI バリアントの事前コンパイル済みバージョンが含まれています。 画像が提供する必要がある正確な内容の詳細については、 このブログ記事を参照してください。
クラスターの作成時に CentOS 7.6 HPC イメージを使用するには、[詳細設定] パラメーターの [カスタム イメージ] ボックスをオンにし、値OpenLogic:CentOS-HPC:7.6:latest
を入力します。
古い H16r VM シリーズをサポートし、クラスター ヘッド ノードを同じバージョンの CentOS にロックし続けるために、基本 OS ドロップダウンの既定の "Cycle CentOS 7" イメージでは CentOS 7.4 がデプロイされます。 ほとんどの VM シリーズでは問題ありませんが、HB/HC VM には CentOS 7.6 以降と別の Mellanox ドライバーが必要です。
CycleCloud < 7.7.4 で SElinux を無効にする
既定では、SElinux は /root と /home のみをホーム ディレクトリの有効なパスと見なします。 これらのパス以外のホーム ディレクトリを持つユーザーは、SElinux によって、ユーザーのホーム ディレクトリ内の SSH キーペアを使用する SSH をブロックします。 CycleCloud クラスターでは、ユーザー のホーム ディレクトリが /shared/home に作成されます。 7.7.4 より新しい CycleCloud バージョンでは、有効な SElinux homedir コンテキストとして /shared/home パスが自動的に設定されますが、古いバージョンではこれをサポートしていません。 クラスター上のユーザーに対して SSH が正しく機能することを確認するには、クラスター テンプレートで SElinux を無効にする必要があります。
[[node defaults]]
[[[configuration]]]
cyclecloud.selinux.policy = permissive
Slurm を使用した MPI ジョブの実行
HB/HC VM で実行されている MPI ジョブは、同じ VM スケールセット (VMSS) で実行する必要があります。 Slurm で実行されている MPI ジョブ用の VM の適切な自動スケール配置を確実に行うには、クラスター テンプレートで次の属性を設定してください。
[[nodearray execute]]
Azure.SingleScaleset = true
Azure.MaxScalesetSize = 300
Azure.Overprovision = true
OpenMPI および MPICH で使用する pkey の取得
一部の MPI バリアントでは、ジョブの実行時に InfiniBand PKEY を指定する必要があります。 次の Bash 関数を使用して PKEY を決定できます。
get_ib_pkey()
{
key0=$(cat /sys/class/infiniband/mlx5_0/ports/1/pkeys/0)
key1=$(cat /sys/class/infiniband/mlx5_0/ports/1/pkeys/1)
if [ $(($key0 - $key1)) -gt 0 ]; then
export IB_PKEY=$key0
else
export IB_PKEY=$key1
fi
export UCX_IB_PKEY=$(printf '0x%04x' "$(( $IB_PKEY & 0x0FFF ))")
}