最近、GPUが4個あるGPGPUサーバをさわる機会がありました。
各GPUやメモリがどの程度使われているのか、傾向を確認したいと思って、Muninのpluginを作ってみました。

既に誰かが作っていないか、プラグインが集まっている Munin Exchange | Munin plugin repository を確認してみると、nvidia_smi_ pluginがありました。
ただ、これは複数のGPUをまとめて一つのグラフにするようなので、GPUが4個あると見にくくなりそうです。

ということで、自分で作ってみました。
以下のようなグラフが作成されます。
gpu_monitor

これは CUDA GPU memtest で以下を同時に1.5時間ほど実行した時のものです。
(Test10 は Memory stress test で、Test8 は Modulo 20, random pattern)

./cuda_memtest --device 2 --disable_all --enable_test 10 --num_iterations 10000
./cuda_memtest --device 3 --disable_all --enable_test 8 --num_iterations 10000

複数グラフを出力するプラグインの作成には、以下を参考にしました。
MultigraphSampleOutput - Munin - Trac

GPU,Memoryの使用率、温度は nvidia-smi コマンドで取得できます。
プラグインのスクリプト内で何回も実行するのは、なんとなく気が引けるので、1回だけの実行で済むようにしてみました。
本当は各ノードのtopページのGPUグラフは4個の平均にするとよさそうですが、面倒だったので、手抜きでGPU数にしています。
よければ、どなたか改良してください。

#!/bin/bash
# written by Shigefumi
# Munin plugin to monitor NVIDIA Tesla S2070 GPU statistics

EXEC="/usr/bin/nvidia-smi"
if [ ! -x ${EXEC} ]; then
	echo "${EXEC} not installed."
	exit 1
fi

DATA=$(${EXEC} | egrep "%|Temperature" | \
	egrep -v "Intake Temperature|Fan Speed" | \
	awk '{print $3}' | sed -e 's/%//')
ARRAY=($DATA)
GPU_TOTAL=$((${#ARRAY[*]}/3))

if [ "$1" = "config" ]; then
	# root graph
	echo "multigraph gpu_monitor"
	echo "graph_title Total GPUs"
	echo "graph_args --base 1000 -l 0"
	echo "graph_vlabel GPUs"
	echo "graph_category GPU"
	echo "GPU_COUNT.label GPU count"
	# each graph
	for GPU in $(seq 0 $((GPU_TOTAL-1))) ; do
		echo "multigraph gpu_monitor.gpu${GPU}"
		echo "graph_title GPU${GPU}"
		echo "graph_args --base 1000 -l 0 -u 100"
		echo "graph_vlabel Percent or Degrees C"
		echo "graph_category GPU"
		echo "GPU_UTIL.label GPU utilization (%)"
		echo "GPU_MEM_UTIL.label Memory utilization (%)"
		echo "GPU_TEMP.label GPU temperature (C)"
	done
	exit 0
fi

# root graph value
echo "multigraph gpu_monitor"
echo "GPU_COUNT.value ${GPU_TOTAL}"

# each graph value
for GPU in $(seq 0 $((GPU_TOTAL-1))) ; do
	GPU_TEMP=${ARRAY[$((GPU*3))]}
	GPU_UTIL=${ARRAY[$((GPU*3+1))]}
	GPU_MEM_UTIL=${ARRAY[$((GPU*3+2))]}

	echo "multigraph gpu_monitor.gpu${GPU}"
	echo "GPU_TEMP.value ${GPU_TEMP}"
	echo "GPU_UTIL.value ${GPU_UTIL}"
	echo "GPU_MEM_UTIL.value ${GPU_MEM_UTIL}"
done

以下にも置いてあります。
http://blog.livedoor.jp/hakin/misc/gpu_monitor
動作確認した環境は以下です。

OS: SLES11 SP1
NVIDIA Driver: 260.19.26
CUDA: 3.2
GPU: NVIDIA Tesla S2070(M2070 x4個)

今後、GPGPUサーバも増えてくるでしょうね。
楽しみです。

[2011年 5/29 追記]
デフォルトでは、Muninのページを表示していると、5分ごとに自動で再読み込みされます。
今回設定したクラスタでは自動リロードは必要なかったので、MuninのHTMLテンプレートを変更してみました。

以下の3個のファイルを変更。
/etc/munin/templates/definitions.html
/etc/munin/templates/munin-overview.tmpl
/etc/munin/templates/partial/head.tmpl
変更前
<meta http-equiv="refresh" content="300" />
変更後
<!-- <meta http-equiv="refresh" content="300" /> -->

これで自動リロードされなくなりました。