That's Done!

thatsdone's (mostly technical) memorandum

[ja] なんちゃってPrometheus ExporterでGPU利用率を採取する


今回はだいぶ前に作ったものの話。

話は2020年にさかのぼります。 当時、vSphereで動くGPU関連製品を使った検証をしていました。 GPUはNVIDIA製ですが、検証対象の製品自体は独立系のものでした。

CPU等の他のmetricsについてはPrometheusで一元収集していたので、自然な流れで当該GPUの利用率もPrometheusで収集できないのかと思いました。…が、独自仕様の製品を買ってくれと言われ、しかもいいお値段だったので、それなら自分で作ればいいじゃんと考えたのでした(笑)

まず、その製品はESXi Shell上でnvidia-smiが使えるようになっていました。

よく知られているように、nvidia-smiを内部から呼び出してGPUのmetricsを返すExporterは複数存在し、私はPGMEを使っていました。 PGMEは、一般的なPrometheus Exporterと同様にGo言語で書かれており、GoのバイナリということはもしかしたらESXi Shellで動くか?と思って動かしてみたらSEGVしてしまいました...orz

さて、どうするか?

ESXi ShellはミニマムなLinux Distributionなわけで、確認したところ Python3 も入っていました。

また、Python には標準で http.serverがついてきます。

…ということは、PGMEと同等の処理処理を、http.serverのGET method処理ルーチンで動かしてやればいいじゃん…と思い至って作ってみたものが以下においてあります。

https://github.com/thatsdone/junkbox/blob/master/python/PyPGME.py

眺めるとわかるのですが、do_GET() の中で nvidia-smi を呼び出し、結果をparseして、PGME互換のmetricsに整形して返しているだけです。

なお、起動引数はこんな感じで

  • '-p' : Listen port (default: 19101)
  • '-b' : Bind address (default: 0.0.0.0)
  • '-e' : Extended Attribute

最後の'-e'は、オリジナルのPGMEには存在しません。後述のmetrics採取例のように、電力関連の pgme_power_draw と pgme_power_limit を追加出力できるように(後から)しました。

他の目的のPrometheus Exporterが欲しくなった時のひな形としても使えるので、けっこう重宝しています(笑)

metrics採取例(IPはダミー、PyPGME.py 起動時には -p 9101と -e を指定)

$ curl http://192.168.1.1:9101/metrics
# TYPE temperature_gpu gauge
# HELP temperature.gpu of nvidia-smi
temperature_gpu{gpu="Tesla P100-PCIE-16GB[0]"} 32
# TYPE utilization_gpu gauge
# HELP utilization.gpu of nvidia-smi
utilization_gpu{gpu="Tesla P100-PCIE-16GB[0]"} 0
# TYPE utilization_memory gauge
# HELP utilization.memory of nvidia-smi
utilization_memory{gpu="Tesla P100-PCIE-16GB[0]"} 0
# TYPE memory_total gauge
# HELP memory.total of nvidia-smi
memory_total{gpu="Tesla P100-PCIE-16GB[0]"} 16384
# TYPE memory_free gauge
# HELP memory.free of nvidia-smi
memory_free{gpu="Tesla P100-PCIE-16GB[0]"} 16280
# TYPE memory_used gauge
# HELP memory.used of nvidia-smi
memory_used{gpu="Tesla P100-PCIE-16GB[0]"} 0
# TYPE pgme_power_draw gauge
# HELP power.draw of nvidia-smi
pgme_power_draw{gpu="Tesla P100-PCIE-16GB[0]"}  25.63
# TYPE pgme_power_limit gauge
# HELP power.limit of nvidia-smi
pgme_power_limit{gpu="Tesla P100-PCIE-16GB[0]"}  250.00

GPUが2023年にもなってP100なのは愛嬌ということで(笑)