Skip to content

Instantly share code, notes, and snippets.

@stakizawa
Last active December 20, 2021 09:06
Show Gist options
  • Save stakizawa/f3d3eccef2f61fce4efde147d52b2b41 to your computer and use it in GitHub Desktop.
Save stakizawa/f3d3eccef2f61fce4efde147d52b2b41 to your computer and use it in GitHub Desktop.
ABCI計算ノード上でDCGMを用いてGPU利用統計を取得

ABCI計算ノード上でDCGMを用いてGPU利用統計を取得

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利用統計の取得処理の流れは以下の通りです。

  1. GPUを使用する計算を実行する前
    • GPUグループを定義
    • GPUグループに対して、統計取得を有効化
    • GPUグループに対して、統計取得を開始
  2. GPUを使用する計算を実行
  3. GPUを使用する計算の実行後
    • GPUグループに対する、統計取得を終了
    • 統計情報の出力
    • 統計情報の削除
    • GPUグループ定義を削除

Full 1ノードの全4GPU情報の取得

ジョブスクリプト中、あるいはインタラクティブジョブにて、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利用統計を削除できます。

Full/G.large 1ノードの特定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利用統計が取得できなくなります。

G.small 1ノードの1GPU情報の取得

プログラムで使用するGPU ID(nvidia-smiで確認できるGPU ID)と、DCGMで識別されるGPU IDが一致しないため、DCGMにおける、使用するGPUのGPU IDを調べる必要があります。

以下の例では、nvidia-smidcgmi 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 複数ノードの全GPU情報の取得

Full 1ノードの全4GPU情報の取得で行っているDCGMのGPU利用統計取得のセットアップ・クリーンアップ処理を全ノードで実施すれば良いです。

参考文献

@stakizawa
Copy link
Author

ABCI計算ノードにて、nv-hostengineが停止されたため、本手法は使えなくなりました。
nv-hostengineは利用者権限でも起動できますが、以前私が試した限りでは、利用者権限で起動しても、GPU情報の取得はできませんでした。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment