注目キーワード

【Jetson Nano】そうやってすぐ熱くなるし・・クールに行こうぜ!(CPU温度による冷却ファン制御)

すけろく
あつい。あついぞ!
げんろく
どうした、甲子園見ているのか?
球児たちの暑い夏を。
すけろく
いや、この前買ったJetson Nanoがちょっと使うだけで
すぐ熱くなるのだ。
げんろく
まあ、あれだけのCPU、GPUを小さい面積に
実装しているからな。。。
げんろく
Jetson Nanoなら回転制御可能なFAN端子がついているから
CPUの温度に応じた冷却をやってみようではないか。
Jetson Nano Developer Kitを使っていると、Jetson Nanoボードが非常に熱くなります。
ヒートシンクが搭載されているので放熱はされますが、連続して使用するとかなりなるのです。
そこで、Jetson Nano Developer Kitには、回転制御可能な4ピンのFANコネクタがついています。
このFANコネクタに対応するFANを接続して、ヒートシンクにある穴を使ってFANを固定することができます。

今回の記事で使用した冷却FANはこちら

取付後の画像はこちらです。
ヒートシンクの上に冷却ファンが鎮座する形になります。直接風を送るのでよく冷えるますね。
また、以下のコマンドを使って、ファンの回転数を制御することができます。
# sudo sh -c 'echo 125 > /sys/devices/pwm-fan/target_pwm'
※上記の数字(例:125)の部分を0~255まで変化させることでFANの回転数を最小(0)から最大(255)まで変更することができます。ちなみに0を設定するとFANが停止します。
ただ、毎回ヒートシンクを手で触って、温度確認しながら上記のコマンドを実行するのはめんどくさいですよね。。。
そこで、今回はPythonを使ったプログラムで、起動時に開始してCPU温度によって回転数を変更する仕組みを作ろうと思います。

いつでもクールになれる仕組みを作る

さて、どのような仕組みが良いでしょうか。

以下の機能を実装したいと思います。

  1. Jetson NanoのCPU/GPU/A0の温度を取得する
    CPU,GPU,A0の一番高いものを以降で使用する
  2. 以下の条件で冷却ファンの回転速度を決定する
    <動作例>
    ~30℃   :40
    31℃~40℃ :90
    41℃~50℃ :140
    51℃~60℃ :190
    61℃~   :240(※設定可能上限は255ですが、余裕を持たせ若干低く設定)
  3. 冷却ファンの回転速度を設定する。

※今回の回転速度の設定には、PWM(Pulse Width Modulation)というものを使っています。PWMの仕組みは以下の記事でご紹介しているので興味のある方はご覧ください。

関連記事

この記事では、M5StickCと冷却ファンを使って回転速度制御をしていきます。 M5StickCから冷却ファンの回転を制御できれば、扇風機のように、自由に風量を変えることができます! 今回の冷却ファンは次のものを使います。パソコン用[…]

 

CPUの状態を取得してみる

では最初にJetson NanoのCPU状態を取得してみましょう。

取得すためのコマンドは以下を使います。

# cat /sys/devices/virtual/thermal/thermal_zone[0-2]/temp
30000   #A0の温度
23000 #CPUの温度
22000 #GPUの温度

ということは、Pythonから確認する際には、「/sys/devices/virtual/thermal/」にある「thermal_zone0」から「にある「thermal_zone2」にある「temp」ファイルをReadで開けば、温度値を取得できますよね。

path = "/sys/devices/virtual/thermal/thermal_zone0/temp"
with open(path, "r") as fs:
  for line in fs:
    print(line)

のような感じでしょうか。

 

冷却ファンの回転数を設定する

また、冷却ファンの回転数を設定するには、前述した以下のコマンドが使えます。

# sudo sh -c 'echo 125 > /sys/devices/pwm-fan/target_pwm'

ということは、Pythonから設定を行う際には、この「target_pwm」ファイルを更新すれば設定を変更できます。

pwm = str(125)
cmd = "sudo sh -c \'echo " + pwm + "> /sys/devices/pwm-fan/target_pwm\'"
res = subprocess.run(cmd, 
                                    shell=True, 
                                    check=False, 
                                    stdout=subprocess.PIPE, 
                                    stderr=subprocess.PIPE, 
                                    universal_newlines=True )

のような感じです。

※上記の例は、コマンドをPythonから実行するsubprocessというものを使っています。
sudo shでルートシェルを起動していますので、パスワードを求められそうですが、subprocessは親を継承するのでcrontabで権限を与えれば実行できます。

 

Jetson Nano 温度監視&空冷制御プログラムを作る

それではPythonを使ってプログラムを作ってみましょう。

先ほど考えた仕組みを含め、以下のようにプログラミングします。

  • 1分ごとにJetson Nanoボードの温度を確認します
  • 温度に応じて冷却ファンの回転数を変化させます。
  • 温度とファンの回転制御値の推移データを、再利用性を考慮してCSV形式で出力します。
  • ツールの動作設定値(温度条件と回転制御値[5段階]、ログの保存最大数など)は
    JSON形式ファイルで作成します。
  • ツール実行時ログは、実行単位ごとに出力され、ログファイル数は初期設定では
    10ファイルまで保存されるようにします。
  • Jetson Nano OS(Ubuntu)にてcrontabにスクリプト実行文を追加して1分おきに
    実行されるようにします。
    ※root権限用のcrontabに登録して使うことを想定します。

Jetson Nano 温度監視&空冷制御プログラム

Pythonスクリプト名
:JetCoolerMon.py
ツール動作設定ファイル
:JetCoolerMonSetting.json
プログラム実行想定環境
OSバージョン
Jetson Nano Developer Kit OS Image
(Ubuntu 18.04.5 LTS)
動作確認機器
Jetson Nano Developer Kit(B01:4GB)
Pythonバージョン
Python 3.6.9
ライセンス
MIT License

※プログラムはGitHubにて公開しています。

 GitHub公開情報

プログラムはGitHubにて公開しています。以下からご利用くださいね!

GitHub

Contribute to karakuri-musha/JetCoolerMon development by cre…

 利用方法

1.ツール配置用のディレクトリをJetson Nano OS上に作成します。

sudo mkdir /opt/JetCoolerMon

2.作成したディレクトリにツールをコピーします。

cd /opt/JetCoolerMon
sudo git clone https://github.com/karakuri-musha/JetCoolerMon.git

3.「JetCoolerMon.py」を実行するシェルを記載します。

sudo vi /usr/local/bin/JetCooler_mon.sh

シェルの内容

#!/bin/sh
python3 /opt/JetCoolerMon/JetCoolerMon/JetCoolerMon.py -o output.csv -j JetCoolerMonSetting.json

4.シェルに実行権限を付与します。

sudo chmod +x /usr/local/bin/JetCooler_mon.sh

5.「crontab」をエディタモードで開いてスケジュールを追加します。

sudo crontab -e

ファイルの最後に以下のスケジュールを記述し、保存します。(例は1分間隔で実行する)

* * * * * sh /usr/local/bin/JetCooler_mon.sh

6.「cron」を再起動します。

sudo /etc/init.d/cron restart

 プログラム実行結果

一分間隔で以下のようなログが作成されます。

2021-08-27 13:51:01,471@ __main__ [INFO] <module>: Start the Jetson Nano Cooler Monitor (JetCoolerMon) tool.
2021-08-27 13:51:01,475@ __main__ [INFO] <module>: Input file is [output.csv] I checked the name. The process will start.
2021-08-27 13:51:01,475@ __main__ [INFO] <module>: Input file is [JetCoolerMonSetting.json] I checked the configuration file. The process will start.
2021-08-27 13:51:01,475@ __main__ [INFO] <module>: System Enviroment Check Process Begin
2021-08-27 13:51:01,480@ __main__ [INFO] <module>: The operating system is [Linux]
2021-08-27 13:51:01,485@ __main__ [INFO] <module>: The model name is [NVIDIA Jetson Nano Developer Kit]
2021-08-27 13:51:01,485@ __main__ [INFO] <module>: Jetson Nano temperature measurement started.
2021-08-27 13:51:01,486@ __main__ [INFO] <module>: Zone0: 33.5
2021-08-27 13:51:01,486@ __main__ [INFO] <module>: Zone1: 27.0
2021-08-27 13:51:01,486@ __main__ [INFO] <module>: Zone2: 28.5
2021-08-27 13:51:01,486@ __main__ [INFO] <module>: avarage temp: 29.7
2021-08-27 13:51:01,487@ __main__ [INFO] <module>: PWM Set Value : 40
2021-08-27 13:51:01,487@ __main__ [INFO] update_file: ---- Update file ----
2021-08-27 13:51:01,487@ __main__ [INFO] update_file: ---- Success update file ----
2021-08-27 13:51:01,487@ __main__ [INFO] <module>: Exit the Jetson Nano Cooler Monitor (JetCoolerMon) tool.

 

 Idle時の温度を測定してみよう!!

アイドル状態の温度変化をCSVからグラフにしてみました。

こうやって見える化すると面白いですね。

 Jetson Nano Developer Kitに負荷をかけてみよう!!

次に、代表的な機械学習のモデルの計算をしてみました。
空冷ファンのおかげか、50℃以下に抑えた形で実行できていますね。よし、よし。

計算するモデルによって温度の上昇タイミングが違っていて面白いと思います。

各も出る計算時のFPSもNVIDIA社が公開されているJetson Nano Developer Kitの基準値に近似しているため問題ないありません。

Model Name FPS
inception_v4 10.7
vgg19_N2 10.2
super_resolution_bsd500 15.4
unet-segmentation 16.9
pose_estimation 14.7
yolov3-tiny-416 48
ResNet50_224x224 36.9
ssd-mobilenet-v1 42.9

 結果的にcron使って1分単位でOK!!

作成を考えていたころはサービス化してもっと短い時間でファン制御を入れようかと考えていましたが、試してみるとcronで1分単位で都度実行しても十分に効果が実感できました。現在のほうが、サービス化してリソース消費を増やすよりもリソースの節約ができているでしょう。

 

編集後記

いかがだったでしょうか。

一度設定したらあまり意識することなく運用いただけるので、ぜひご活用ください。(CSV出力は無効にしてくださいね!)

Jetson Nano Developer Kit上で高負荷の処理を実行する際の、温度データ取得ツールとしても使えます。

今回実際に取得してグラフ化しましたが、いい感じで出力できているのでこちらもご活用くださいね!

記事は以上になります。(※機械学習モデルの実行については別記事にする予定です。ご期待ください。)

 こちらの記事もあわせてどうぞ!!

Raspberry Piと同様に最低限のキットしか本体には付属していないため、追加購入が必要になってきます。特に通信モジュールの購入は注意が必要です。

最低限必要な購入品については、以下の記事でご紹介しています。参考にしてくださいね!

Jetson Nano Developer Kitを始めるためのお買い物リストをまとめました!ぜひご覧ください。

関連記事

こんな悩みありませんか? 「Jetson Nano はじめたいけど、何があれば遊べるの? いくらかかるの?」 そんなご質問に答えるべく、購入品リストをまとめてみました。 本記事は以下の記事「【Jetson Nano】まずや[…]

 

【合わせて読みたい】、Jetson Nanoをご利用の方向けの人気記事も、ぜひご覧ください!
関連記事

すけろく Raspberry PiやJetsonのシングルボードコンピュータを使っていると 必要になるmicroSDカード。 何を買えばよいのやら。。。 げんろく microSDカードには意外といろ[…]