Intel GPUの監視を行う

Hardware

かなりVibe Codingでやっつけたので説明は雑ですが、一応できました。緑色は元々仕込んでたNVIDIA向けGPUのかんしテンプレートから引っ張った情報。青いグラフは今回実装したものになります。

xpu-smiを仕込む

まず大前提として、XPU Managerのインストールが必要ですので、これを仕込みます。バージョンは2.1.0としてます。

Release v2.1.0 ?? intel/xpumanager
xpu-smiBug Fixesdump –device -1 now selects all available devicesxpu-smi –count now exit cleanly after the specified n…

ここからダウンロードをしたdebパッケージを指定する形で apt install を実行します。

sudo apt install xpu-smi_2.1.0+26.33.6468cec-1.24.04_amd64.deb

xpu-smiが動けば、それに依存するコンポーネントも概ね入ってるんじゃ無いかなと思われ。

# xpu-smi
+----------------------------------------------+----------------------------+------------------------+
|            Intel XPU-SMI v2.1    Driver: 64290D8E349F41730D761F4    Level Zero: 1.28.6             |
+----------------------------------------------+----------------------------+------------------------+
| GPU  Name                    Persistence-M   | Bus-Id            Disp.A   |   Volatile Uncorr. ECC |
| Fan              Temp  Pwr:Usage/Cap         | Memory-Usage               |   GPU-Util  Compute M. |
+----------------------------------------------+----------------------------+------------------------+
|   0  Intel(R) Arc(TM) Pro B  Off             | 0000:03:00.0      Off      |               Disabled |
|      70 Graphics                             |                            |                        |
| 0%                52C  51W / 250W            | 172MiB / 32656MiB          |      0%        Default |
+----------------------------------------------+----------------------------+------------------------+

+-------+----------+--------+----------------+-------------------------------------------------------+
| Processes:                                                                                         |
|   GPU        PID    Type    Process Name                                          GPU Memory Usage |
+-------+----------+--------+----------------+-------------------------------------------------------+
|     0     627613     C      llama-server                                                   294 MiB |
+-------+----------+--------+----------------+-------------------------------------------------------+

スクリプトを作る

実はxpu-smiはこんな構文で決められた項目だけ出力することが可能になってます。

$ xpu-smi dump --device 0 --metrics 3,4,0,5,1,19,20  --number 1 --format=csv,noheader,nounits
04:24:01.947, 0, 53.00, 56.00, 0.00, 0.53, 52.80, 469, 83

metricは名前で指定しても良いのですが、今回項目を多めに出すことを想定しているため敢えて番号指定で出してます。それぞれの項目はこんな感じです。

# 3  = temperature.gpu
# 4  = temperature.memory
# 0  = utilization.gpu
# 5  = utilization.memory
# 1  = power.draw
# 19 = pcie.rx.throughput.kbs
# 20 = pcie.tx.throughput.kbs

そこで、こんなスクリプトを仕込んで、/usr/local/bin/xpu_smi_metrics.sh として保存しました。

#!/usr/bin/env bash

set -u
set -o pipefail

export LC_ALL=C

DEVICE="${1:-0}"
XPU_SMI="/usr/bin/xpu-smi"

# xpu-smiへ渡すメトリクスの順序。
# 3  = temperature.gpu
# 4  = temperature.memory
# 0  = utilization.gpu
# 5  = utilization.memory
# 1  = power.draw
# 19 = pcie.rx.throughput.kbs
# 20 = pcie.tx.throughput.kbs
METRICS="3,4,0,5,1,19,20"

fail() {
    printf '%s\n' "$*" >&2
    exit 1
}

trim() {
    local value="${1-}"

    value="${value#"${value%%[![:space:]]*}"}"
    value="${value%"${value##*[![:space:]]}"}"

    printf '%s' "$value"
}

is_number() {
    [[ "$1" =~ ^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)([eE][+-]?[0-9]+)?$ ]]
}

if [[ ! "$DEVICE" =~ ^[0-9]+$ ]]; then
    fail "Invalid GPU device number: $DEVICE"
fi

if [[ ! -x "$XPU_SMI" ]]; then
    fail "xpu-smi was not found or is not executable: $XPU_SMI"
fi

if ! OUT="$(
    sudo "$XPU_SMI" dump \
        --device "$DEVICE" \
        --metrics "$METRICS" \
        --interval 1 \
        --number 1 \
        --format=csv,noheader,nounits \
        2>/dev/null
)"; then
    fail "xpu-smi execution failed"
fi

# 改行コードを除去し、最初の空でない行だけを使用する。
LINE="$(
    printf '%s\n' "$OUT" |
        tr -d '\r' |
        awk 'NF { print; exit }'
)"

if [[ -z "$LINE" ]]; then
    fail "xpu-smi returned an empty result"
fi

# 期待する形式:
# Timestamp,DeviceId,v3,v4,v0,v5,v1,v19,v20
IFS=',' read -r ts dev v3 v4 v0 v5 v1 v19 v20 extra <<< "$LINE"

ts="$(trim "$ts")"
dev="$(trim "$dev")"
v3="$(trim "$v3")"
v4="$(trim "$v4")"
v0="$(trim "$v0")"
v5="$(trim "$v5")"
v1="$(trim "$v1")"
v19="$(trim "$v19")"
v20="$(trim "$v20")"
extra="$(trim "${extra-}")"

if [[ -z "$ts" || -z "$dev" ||
      -z "$v3" || -z "$v4" || -z "$v0" || -z "$v5" ||
      -z "$v1" || -z "$v19" || -z "$v20" ]]; then
    fail "Unexpected CSV field count: $LINE"
fi

if [[ -n "$extra" ]]; then
    fail "Unexpected extra CSV field: $extra"
fi

for value in "$v3" "$v4" "$v0" "$v5" "$v1" "$v19" "$v20"; do
    if ! is_number "$value"; then
        fail "Non-numeric metric value returned by xpu-smi: $value"
    fi
done

printf \
    '{"device":%s,"temperature_gpu":%s,"temperature_memory":%s,"utilization_gpu":%s,"utilization_memory":%s,"power_draw":%s,"pcie_rx_throughput_kbs":%s,"pcie_tx_throughput_kbs":%s}\n' \
    "$DEVICE" \
    "$v3" \
    "$v4" \
    "$v0" \
    "$v5" \
    "$v1" \
    "$v19" \
    "$v20"

で、visudoで以下のを追加しときました。xpu-smiがrootじゃないと動かないためです。

zabbix  ALL=NOPASSWD: /usr/bin/xpu-smi

ZABBIXエージェントへの仕込み

/etc/zabbix/zabbix_agent2.conf に仕込みます。

UserParameter=intel.gpu.metrics.raw[*],/usr/local/bin/xpu_smi_metrics.sh "$1"

終わったら zabbix-agent2 を再起動します。

systemctl restart zabbix-agent2

ZABBIXサーバ側の仕込み

まず、Data Collection→Templateへ移動し、以下のように進めていきます。

  • Create Templateをクリックする
  • テンプレート名を任意に入力した後、Macrosタブクリック
  • 数のようにマクロ行を1つ追加し、 {$INTEL_GPU_DEVICE}=0 を設定する
  • Updateをクリックする

続いて、マスターアイテムというものを作ります。このアイテムは通常のアイテムとして作ります。このテンプレートの行にある「items」をクリックし、画面右上の「Create Item」をクリックします。

パラメータは以下の通りです。(私は後で監視間隔のみ15sに変更しています。)終わったら「Update」をクリックしてください。

項目設定値
名前Intel GPU metrics raw
タイプZabbix agent
キー(選択ではなく、直接入力して設定する)intel.gpu.metrics.raw[{$INTEL_GPU_DEVICE}]
データ型Text
監視間隔20s
ヒストリ1d
トレンド0

これが所謂ひな形になり、それ以降は、アイテムの・・・をクリックすると以下のようにメニューがポップアップされます。このなかの「Create dependent item」をクリックして従属するアイテムをつくって行くことになります。

各アイテムの設定値は以下の通りです。

名前キーJSONPathデータ型単位
utilization.gpuintel.gpu.metrics[{$INTEL_GPU_DEVICE},0]$.utilization_gpuNumeric float%
temperature.gpuintel.gpu.metrics[{$INTEL_GPU_DEVICE},3]$.temperature_gpuNumeric floatC
temperature.memoryintel.gpu.metrics[{$INTEL_GPU_DEVICE},4]$.temperature_memoryNumeric floatC
utilization.memoryintel.gpu.metrics[{$INTEL_GPU_DEVICE},5]$.utilization_memoryNumeric float%
power.drawintel.gpu.metrics[{$INTEL_GPU_DEVICE},1]$.power_drawNumeric floatW
pcie.rx.throughput.kbsintel.gpu.metrics[{$INTEL_GPU_DEVICE},19]$.pcie_rx_throughput_kbsNumeric floatkB/s
pcie.tx.throughput.kbsintel.gpu.metrics[{$INTEL_GPU_DEVICE},20]$.pcie_tx_throughput_kbsNumeric floatkB/s

ここで、JSONPathと言う記述がありますけれども、これはアイテム設定画面の Preprocessing のタブをクリックしてください。ここで、ステップを「Add」をクリックして1つ作成し、「Name」に「JSONPath」を選択した上で、その右のParameters欄に指定の内容を書くと良いです。rawdataから対応するIndexの値を拾ってくるようになります。

こうして出来上がったテンプレートを、Intel ARCを搭載した監視対象に適用することで、監視が可能になります。あと、可能であればこれに対応するタグを付与しておくことをお勧めします。いざこのテンプレートの検索をするときに便利です。

あとはテンプレート内にトリガーを作るなどの工夫をすることで、温度監視・通知も可能になってくると思います。それは行く行くやろうかなと思いますが、今のところその気力はありませんです、はい。

コメント

タイトルとURLをコピーしました