先日、トランジスタ技術 2019年 09 月号を読んでいて、気づいたらJetson nanoを衝動買いしていました。Jetsonというのは、”謎のAI半導体メーカー”であるnvidia社が開発販売している、GPUを積んだ1ボードPCです。
いくつかバリエーションがあり「nano」は、エントリーモデルになっていて20W (5V, 4A)の電力でcudaコードを回す事ができます。
つい先日、Raspberry Pi 4が日本で販売開始されたのに、なんで?と思う向きもあるかと思いますが、メモリを4GB積んでいるのが魅力だったんです。
Contents
さっそく火を入れてみる
nvidiaのサイトからイメージを落としてセットアップしてみると、中身はubuntuです。普段GUIは使わないので(必要なときはvnc)、セッションマネージャを落としたり、設定をいじっていると、ヒートシンクが思ったよりも暖かくなりました。
このあたりはRaspberry Piとは違うところ。ヒートシンクはついていますが、やはりFANつけたほうがいいかなぁということで、5Vで動く小さなFANを増設しました。
こうなると温度が気になりますよね。というわけでcactiでグラフ化してみました。
Jetsonの温度を知る方法
lm-sensorsが使えるかなーと思ったのですが
1 2 3 4 |
root@jetson:~# sensors thermal-fan-est-virtual-0 Adapter: Virtual device temp1: +19.2°C |
これしか出てこないので、sysfsから直接読み出す方法を使うことにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
root@jetson:~# cat /sys/devices/virtual/thermal/thermal_zone*/type AO-therm CPU-therm GPU-therm PLL-therm PMIC-Die thermal-fan-est root@jetson:~# cat /sys/devices/virtual/thermal/thermal_zone*/temp 28000 19000 19500 17500 100000 19000 |
これならば、net-snmpのextensionを使って、簡単にsnmp経由で読み出せるようにできそうです。
値を読み出すshell scriptを書いた
受け取った引数に応じて該当する値を読み取ります。Jetson側の温度単位は、[m℃]ですから、[℃]に変換して返すようにしました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# cat /usr/local/bin/get_jetson_nano_thermal.sh #!/bin/bash SYS_PATH='/sys/devices/virtual/thermal/thermal_zone' VAL_TYPES=('A0' 'CPU' 'GPU' 'PLL' 'PMIC-Die') function usage() { echo "${1} type" echo "Type is .." <span class="pl-k">for</span> <span class="pl-smi">i</span> <span class="pl-k">in</span> <span class="pl-s"><span class="pl-pds">$(</span>seq 0 <span class="pl-pds">$((</span><span class="pl-smi">${<span class="pl-k">#</span>VAL_TYPES[*]}</span><span class="pl-k">-</span><span class="pl-c1">1</span><span class="pl-pds">))</span><span class="pl-pds">)</span></span><span class="pl-k">;</span> <span class="pl-k">do</span> echo "${i} : ${VAL_TYPES[$i]}" done exit } [ ${#} -eq 1 ] || usage $0 echo "scale=3;$(cat ${SYS_PATH}${1}/temp) / 1000" | bc |
ちゃんと動くことも確認しましょう。
1 2 |
root@jetson:~# /usr/local/bin/get_jetson_nano_thermal.sh 2 19.000 |
net-snmp経由で読み出せるようにする
Jetson側のnet-snmpの設定に以下を追加します。呼び出される度にshellが起動するので効率は悪そうですが。
snmpdの設定ファイルは、/etc/snmp/snmpd.conf です。
1 2 3 4 5 |
extend JSTA0 /usr/local/bin/get_jetson_nano_thermal.sh 1 extend JSTCPU /usr/local/bin/get_jetson_nano_thermal.sh 2 extend JSTGPU /usr/local/bin/get_jetson_nano_thermal.sh 3 extend JSTPLL /usr/local/bin/get_jetson_nano_thermal.sh 4 extend JSTPMIC /usr/local/bin/get_jetson_nano_thermal.sh 5 |
設定が終わったら、snmpd service をrestartしておきます。
リモートから読み出してみる
Jetson側のsnmpdのACLが適切に設定されていて、リモートから接続できるようになっていれば、こんな形で値が返ってきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$ snmpwalk -v2c -c public jetson's_ip_addr. nsExtensions NET-SNMP-EXTEND-MIB::nsExtendNumEntries.0 = INTEGER: 5 NET-SNMP-EXTEND-MIB::nsExtendCommand."JSTA0" = STRING: /usr/local/bin/get_jetson_nano_thermal.sh NET-SNMP-EXTEND-MIB::nsExtendCommand."JSTCPU" = STRING: /usr/local/bin/get_jetson_nano_thermal.sh NET-SNMP-EXTEND-MIB::nsExtendCommand."JSTGPU" = STRING: /usr/local/bin/get_jetson_nano_thermal.sh NET-SNMP-EXTEND-MIB::nsExtendCommand."JSTPLL" = STRING: /usr/local/bin/get_jetson_nano_thermal.sh NET-SNMP-EXTEND-MIB::nsExtendCommand."JSTPMIC" = STRING: /usr/local/bin/get_jetson_nano_thermal.sh (snip) NET-SNMP-EXTEND-MIB::nsExtendOutLine."JSTA0".1 = STRING: 18.000 NET-SNMP-EXTEND-MIB::nsExtendOutLine."JSTCPU".1 = STRING: 18.000 NET-SNMP-EXTEND-MIB::nsExtendOutLine."JSTGPU".1 = STRING: 16.000 NET-SNMP-EXTEND-MIB::nsExtendOutLine."JSTPLL".1 = STRING: 100.000 NET-SNMP-EXTEND-MIB::nsExtendOutLine."JSTPMIC".1 = STRING: 17.000 |
cactiの設定
リモートからJetsonの温度をsnmp経由で読み出すことまで実現できました。次は、いよいよcactiで可視化する作業に進みます。基本的なcactiの設定は終わっていて、Jetsonのgenericなデータは読みだせて可視化できているものとします。つまり、device設定は完了している前提です。
cacti:データソーステンプレート作成
取得したい温度の数だけ、データソーステンプレートを作成します。ぼくは、A0, CPU, GPUの温度を取得したかったので、3つのデータソーステンプレートを作成しました。
こんなかんじで、データソーステンプレートを作成していきます。OIDは間違えやすいので注意。
cacti:グラフテンプレート作成
データソーステンプレートを作成したら、そのデータを元にしてグラフをどう作成するか?を定義する、グラフテンプレートを作成します。他のグラフのように現在値、最小値、最大値を載せたかったら、GPRINTの項目を追加してあげればOKです。
cacti:グラフ完成
すこしGPU回してみました。少し温度が上がってますが、FANのおかげか30℃くらいで抑えられています。
日付がGMTになっちゃってますが、これは phpの設定をミスってるのかしら・・・
番外編: リモートから電源を入れる
以前、Raspberry Piの電源をリモートから入れるという記事を書きました。今は、その仕組で、Jetsonの電源のOn/Offをしています。
出先から(仕事の空き時間とか!)遊べるように環境の方は、導入すると楽しいかと思います。温度が上がりすぎていないか確認できるので、安心ですね!