ABCIの計算ノードにはNVIDIA DCGMが導入されています。 それを用いることで、ジョブ実行中のGPU利用統計情報を取得することができます。
以下のような情報を取得できます。 この例では1計算ノード上の1GPUの利用統計のみを表示しています。
+------------------------------------------------------------------------------+
| GPU ID: 0 |
+====================================+=========================================+
|----- Execution Stats ------------+-----------------------------------------|
| Start Time | Sun Jan 10 00:42:38 2021 |
| End Time | Sun Jan 10 01:25:35 2021 |
| Total Execution Time (sec) | 2576.78 |
| No. of Processes | 1 |
+----- Performance Stats ----------+-----------------------------------------+
| Energy Consumed (Joules) | 145919 |
| Power Usage (Watts) | Avg: 56.8653, Max: 78.576, Min: 41.041 |
| Max GPU Memory Used (bytes) | 1095761920 |
| SM Clock (MHz) | Avg: 1307, Max: 1312, Min: 135 |
| Memory Clock (MHz) | Avg: 877, Max: 877, Min: 877 |
| SM Utilization (%) | Avg: 6, Max: 27, Min: 0 |
| Memory Utilization (%) | Avg: 0, Max: 3, Min: 0 |
| PCIe Rx Bandwidth (megabytes) | Avg: 1438, Max: 2147, Min: 0 |
| PCIe Tx Bandwidth (megabytes) | Avg: 363, Max: 385, Min: 343 |
+----- Event Stats ----------------+-----------------------------------------+
| Single Bit ECC Errors | 0 |
| Double Bit ECC Errors | 0 |
| PCIe Replay Warnings | 0 |
| Critical XID Errors | 0 |
+----- Slowdown Stats -------------+-----------------------------------------+
| Due to - Power (%) | 0 |
| - Thermal (%) | 0 |
| - Reliability (%) | Not Supported |
| - Board Limit (%) | Not Supported |
| - Low Utilization (%) | Not Supported |
| - Sync Boost (%) | 0 |
+-- Compute Process Utilization ---+-----------------------------------------+
| PID | 128286 |
| Avg SM Utilization (%) | 5 |
| Avg Memory Utilization (%) | 0 |
+----- Overall Health -------------+-----------------------------------------+
| Overall Health | Healthy |
+------------------------------------+-----------------------------------------+
GPU利用統計の取得処理の流れは以下の通りです。
- GPUを使用する計算を実行する前
- GPUグループを定義
- GPUグループに対して、統計取得を有効化
- GPUグループに対して、統計取得を開始
- GPUを使用する計算を実行
- GPUを使用する計算の実行後
- GPUグループに対する、統計取得を終了
- 統計情報の出力
- 統計情報の削除
- GPUグループ定義を削除
ジョブスクリプト中、あるいはインタラクティブジョブにて、GPUを用いた計算の前後に、以下の「Setup DCGM stats」と「Stop DCGM stats」で囲まれたコードブロックを挿入します。
標準入出力ファイルをDCGM関連の出力で汚さないように、DGCMコマンドには&>/dev/null
をつけています。
# Setup DCGM stats ########################################
group=$(dcgmi group -c gpus${JOB_ID} --default)
if [ $? -eq 0 ]; then
groupid=$(echo $group | awk 'NR==1 {print $10}')
dcgmi stats -g $groupid -e &>/dev/null
dcgmi stats -g $groupid -s $JOB_ID &>/dev/null
fi
###########################################################
GPU Computation Here
# Stop DCGM stats #########################################
if [ -n "$groupid" ]; then
dcgmi stats -x $JOB_ID &>/dev/null
dcgmi stats -v -j $JOB_ID > ${JOB_NAME}.dcgm${JOB_ID}
dcgmi stats -r $JOB_ID &>/dev/null
dcgmi group -d $groupid &>/dev/null
fi
###########################################################
dcgmi stats -r $JOB_ID
の代わりにdcgmi stats -a
を実行することで全てのGPU利用統計を削除できます。
プログラムで使用するGPU ID(nvidia-smi
で確認できるGPU ID)と、DCGMで識別されるGPU IDが一致するため、dcgmi
にはプログラムで使用するGPU IDをそのまま指定すれば良い。
Full 1ノードの全4GPU情報の取得に対して、以下の例では2行目のみを変更しています。
# Setup DCGM stats ########################################
group=$(dcgmi group -c gpus${JOB_ID} -a gpu:0,gpu:1)
if [ $? -eq 0 ]; then
groupid=$(echo $group | awk 'NR==1 {print $10}')
dcgmi stats -g $groupid -e &>/dev/null
dcgmi stats -g $groupid -s $JOB_ID &>/dev/null
fi
###########################################################
GPU Computation Here
# Stop DCGM stats #########################################
if [ -n "$groupid" ]; then
dcgmi stats -x $JOB_ID &>/dev/null
dcgmi stats -v -j $JOB_ID > ${JOB_NAME}.dcgm${JOB_ID}
dcgmi stats -r $JOB_ID &>/dev/null
dcgmi group -d $groupid &>/dev/null
fi
###########################################################
dcgmi stats -r $JOB_ID
の代わりにdcgmi stats -a
を実行すると、同じノード上で別のGPUの統計を取得している場合、別のGPUの統計情報まで削除してしまいます。
また、G.largeを用いている場合、同じノード上で他の利用者のC.smallやC.largeのジョブが動いています。
他利用者のジョブがdcgmi stats -a
を実行していた場合、正確にGPU利用統計が取得できなくなります。
プログラムで使用するGPU ID(nvidia-smi
で確認できるGPU ID)と、DCGMで識別されるGPU IDが一致しないため、DCGMにおける、使用するGPUのGPU IDを調べる必要があります。
以下の例では、nvidia-smi
とdcgmi discovery
を用いて使用するGPUのGPU IDを取得しています。
Full 1ノードの全4GPU情報の取得に対する変更点は、「Setup DCGM stats」コードブロックの最初の3行のみです。
# Setup DCGM stats ########################################
gpu_bus_id=$(nvidia-smi --query-gpu=gpu_bus_id --format=csv,noheader)
gpu_id=$(dcgmi discovery -l | sed -n 5,19p | sed -e '/^+/d; N;N;s/\n//g' | grep $gpu_bus_id | awk '{print $2}')
group=$(dcgmi group -c gpus${JOB_ID} -a gpu:${gpu_id})
if [ $? -eq 0 ]; then
groupid=$(echo $group | awk 'NR==1 {print $10}')
dcgmi stats -g $groupid -e &>/dev/null
dcgmi stats -g $groupid -s $JOB_ID &>/dev/null
fi
###########################################################
GPU Computation Here
# Stop DCGM stats #########################################
if [ -n "$groupid" ]; then
dcgmi stats -x $JOB_ID &>/dev/null
dcgmi stats -v -j $JOB_ID > ${JOB_NAME}.dcgm${JOB_ID}
dcgmi stats -r $JOB_ID &>/dev/null
dcgmi group -d $groupid &>/dev/null
fi
###########################################################
Full/G.large 1ノードの特定GPU情報のみの取得同様、dcgmi stats -a
の実行には注意が必要です。
Full 1ノードの全4GPU情報の取得で行っているDCGMのGPU利用統計取得のセットアップ・クリーンアップ処理を全ノードで実施すれば良いです。
ABCI計算ノードにて、nv-hostengineが停止されたため、本手法は使えなくなりました。
nv-hostengineは利用者権限でも起動できますが、以前私が試した限りでは、利用者権限で起動しても、GPU情報の取得はできませんでした。