電子趣味の部屋

電子系のガジェットやアプリ開発等の趣味の話題を書いてます

Raspberry Pi AI HAT+ のセットアップメモ

Hailo 8 AIアクセラレーターを搭載したRaspberry Pi 5用のHAT+を入手しました。

Piromoniで購入しましたが、国内のショップではスイッチサイエンスで購入できます。
今回は推論性能が26TOPSのHailo-8を搭載したものを購入しましたが、13TOPSのHailo-8Lを搭載した下位バージョンもあります。

Hailo 8は学習済みのモデルを処理するアクセラレータです。学習作業を高速化することはできません。
学習済みのモデルはHailoのオリジナルフォーマットのHEFファイルを使用しますが、Dataflow Compilerを使用して汎用のonnx形式のファイルを変換できるようです。(詳しくはまだ調べてません)

セットアップ手順

公式ドキュメント
AI software - Raspberry Pi Documentation

セットアップ時の手順のメモを書きます。
今回は既に使用していたRaspberry Pi 5 8GBにCamera Module 3を装着したものを使用してので、OSやカメラのセットアップは省略します。
自分用のメモが主な目的なので詳細は省きますが参考にしてください。

パッケージを最新化して再起動
sudo apt update && sudo apt full-upgrade
sudo reboot
実行しているファームウェアの確認
sudo rpi-eeprom-update

2023 年 12 月 6 日より前の日付が表示されている場合はraspi-configで設定を行う

sudo raspi-config

Advanced Options>Bootloader VersionでLatestを選択

ファームウェアを最新バージョンに更新して再起動
sudo rpi-eeprom-update -a
sudo reboot
PCIe Gen 3.0の有効化

「/boot/firmware/config.txt」へ以下の行を追加

dtparam=pciex1_gen=3

再起動

sudo reboot
AIアクセラレータに必要なドライバやソフトウェアをインストールして再起動
sudo apt install hailo-all
sudo reboot
インストールの確認
hailortcli fw-control identify

Firmware VersionやBoard Nameが表示されればOK
Serial Number、Part Number、Product Nameが<N/A>になっているが大丈夫そう。

カメラモジュールが認識されているか確認
rpicam-hello -t 10s

カメラの画像が10秒表示されていればOK

デモで動作確認

ファイルを取得

cd
git clone --depth 1 https://github.com/raspberrypi/rpicam-apps.git ~/rpicam-apps

公式ドキュメント通りだと動作しなかったため、--post-process-fileに別の場所にあるjsonファイルを指定しました。

rpicam-hello -t 0 --post-process-file /usr/share/rpi-camera-assets/hailo_yolov6_inference.json --lores-width 640 --lores-height 640

色々試してみる

Hailoが用意しているサンプルを試します。

ファイルを取得
cd
git clone https://github.com/hailo-ai/hailo-rpi5-examples.git
必要なファイルをインストール
cd hailo-rpi5-examples
sudo apt install meson
./install.sh
サンプルはvenv環境で実行するため、仮想環境を起動
source setup_env.sh
物体検出のサンプル
python basic_pipelines/detection.py --input resources/detection0.mp4 -f


30fpsの動画に対して、30fpsで表示されているので、ほぼリアルタイムで処理されてます。
CPU負荷は25%程度でした。

セグメンテーションのサンプル
python basic_pipelines/instance_segmentation.py --input resources/detection0.mp4 -f


こちらも30fpsの動画に対して、30fpsで表示されているので、ほぼリアルタイムで処理されてます。
CPU負荷は35%程度でした。

骨格検出のサンプル
python basic_pipelines/pose_estimation.py --input resources/detection0.mp4 -f


こちらも30fpsの動画に対して、30fpsで表示されているので、ほぼリアルタイムで処理されてます。
CPU負荷は30%程度でした。

仮想環境を終了
deactivate

最後に

26TOPSの処理速度はRyzen 7 8845HSの16TOPSを超えてしまいます。
価格とRaspberry Pi 5で使用できることを考えると、手軽に遊べる環境が欲しい人にはお勧めできると思います。


Raspberry Pi Pico 2 (RP2350搭載)を入手しました

Raspberry Pi Pico 2が発売したので、購入してみました。

購入はPIROMONIでRaspberry Pi Pico 2と一緒に小型のTiny2350も購入しました。

ArduinoでのC/C++環境ではボードマネージャでRP2350で検索してもまだ見つからないのでPythonで動かしてみましたが、今までのコードもそのまま実行できました。
まだ速度が必要なものは試してないので、そんなに違いは判りません。

MicroPythonのファームウェアの入手先はこちらです。
https://micropython.org/download/RPI_PICO2/

簡単にRaspberry Pi Pico 2の仕様です。

外形寸法 21 mm × 51 mm
CPU デュアルArm Cortex-M33 or デュアルRISC-V Hazard3プロセッサ@150 MHz
メモリ 520 KBオンチップSRAM、4 MBオンボードQSPIフラッシュ
インターフェース 26 x 多目的GPIOピン(ADCとして使える4ピン含む)、USB Micro-B、デバッグピン(SWD)
ペリフェラル 2 × UART
2 × SPIコントローラ
2 × I2Cコントローラ
16 × PWMチャンネル
1 × USB 1.1コントローラ&PHY(ホスト/デバイス両対応)
12 × PIOステートマシン
入力 1.8~5.5 V DC
動作温度 -20℃~+85℃

コアはArmとRISC-Vの2個ありますが、同時に使用できないようで実行するバイナリによって切り替えるようです。
Armコアが Cortex-M33 になったことによってFPUが搭載されました。これで自作音源も作りやすくなりました。DSPも搭載されているので、使いこなせれば色々できそうです。
これだけ性能が上がっても消費電力も低くなったようです。

同時使用できないRISC-Vのコアも搭載した目的がよくわかりませんが、将来的にオープンソースでライセンス料のいらないRISC-Vに移行していくのではないかと個人的に予想しています。

ハンドヘルドPCコレクション(ポケコン他)

最近色々と整理してた際に今後のガジェット系に資金にするためにポケコン関連はいくつか手放してしまいました。
現在はコレクションと言うほど多くはありませんが、保有しているハンドヘルドPCを紹介したいと思います。

uConsole Kit RPI-CM4 Lite

blog-e.uosoft.net
購入してから一番お気に入りの機種です。
OSがRaspberry Pi OSなので使用できるソフトも多いです。
画面サイズが小さいのでLinuxデスクトップとしては使い辛いし、普通にRaspberry Pi OSとして使うのはつまらないので、主にPICO-8やMSX,PC98,X68000のエミュレータを入れて全画面にしてコンソールベースでポケコン感覚で遊んでます。

Pocket386

blog-e.uosoft.net
386SXのCPUを搭載した2024年に発売されたPC-AT互換機です。
初期状態でWindows95(英語版)がインストールされてますが、PC-DOS2000を入れてDOSのみで使用してます。
CPUや音源以外は現在のパーツで作られているため、MS-DOS保存環境としては今まで使用してたLibrettoやHP Compaq nx9030よりも扱いやすいです。
また、FDDやCDROM等はそのままでは接続できませんが、ストレージがコンパクトフラッシュなので、ファイルのコピーはカードリーダーで直接Windows等からコピーできるため手軽です。

SHARP PC-G850VS

blog-e.uosoft.net
SHARP最後のポケコンです。
Z80搭載でアセンブラも使えます。
今までいくつかポケコンを使用してきましたが、ポケコンとしても最後の製品で比較的新しいため、液晶の劣化さえ気を付ければ長く遊べる機種だと思います。
今でも使用してる人が多く、ネットでも自作ソフトや色々な情報が手に入りやすいです。

CASIO Z-1GR

x86系の80188でアセンブラも使える機種です。
液晶のコントラストが低くて見ずらいのが難点です。
Z-1GRは学校教材用ですが、一般販売用のFX-890Pは高コントラストの液晶が使われてるので、液晶は無事のFX-890Pのジャンク品を手に入れて交換したところ、見やすくなりました。

Raspberry Pi で X68000 (Raispberry Pi OS Bullseye以降)

Raspberry Pi 5 やuConsole Kit RPI-CM4 LiteでX68000のエミュレータをインストールする場合に、過去に書いた方法だと64bitのOSではmakeできなかったので、新しく調べた方法を書きます。
今回の方法は64bit/32bit両方のBullseye以降のデスクトップ環境で動作します。
コンソール環境で実行したい場合は、『Raspberry pi 400で遊ぶ X68000編』を参考にしてください。(要: Raspberry Pi OS Buster


前準備

gitをインストールします

sudo apt update
sudo apt install git

SDL2をインストールします

sudo apt install libsdl2-dev

圧縮ファイルの展開のため、unzipとlhasaと7zをインストールします。

sudo apt install unzip lhasa p7zip-full

px68kの構築

px68kはユーザのホーム以下のpx68kディレクトリ(~/px68k)へインストールすることを想定して進めます

cd
git clone https://github.com/TurtleBazooka/px68k.git
cd px68k
make

BIOSファイル配置

実行にはiplrom.datとcgrom.datが必要。
色々なサイトを参考にX68000 LIBRARYとXM6 Pro-68kから拝借

cd
mkdir ~/.keropi
wget http://www.retropc.net/x68000/software/sharp/x68bios/X68BIOSE.LZH
lhasa x X68BIOSE.LZH iplrom.dat
mv iplrom.dat ~/.keropi/iplrom.dat
chmod 644 ~/.keropi/iplrom.dat
wget https://mijet.eludevisibility.org/XM6%20Pro-68k/XM6%20Pro-68k%20DLL%20Package.7z
7z x "XM6 Pro-68k DLL Package.7z" CGROM.DAT
mv CGROM.DAT ~/.keropi/cgrom.dat
chmod 644 ~/.keropi/cgrom.dat

動作確認

X68000 LIBRARYからHuman68kのディスクイメージを取得して起動してみます。
起動はディレクトリ~/px68kに作られたpx68k.sdl2を実行します

cd
wget http://www.retropc.net/x68000/software/sharp/human302/HUMN302I.LZH
lhasa x HUMN302I.LZH human302.xdf
chmod 644 human302.xdf
px68k/px68k.sdl2 human302.xdf

[F11]で全画面、ウィンドウ表示を切り替えられます。
[F12]でメニューを開いてディスクの入れ替えや、リセット、終了を行うことができます。

uConsole Kit RPI-CM4 Lite 手に入れました

前にDevTermを入手したことを書きましたが、今回はuConsole Kit RPI-CM4 Lite 手に入れました。

今回はRaspberryPi CM4 Liteのモジュールを使ったバージョンを注文しましたが、他にはオリジナルのARMのモジュールやRISC-Vのモジュールのバージョンもあります。

2023年4月に注文して2024年2月に届きました。
下の写真のようにパーツで届き、自分で組み立てます。

パーツ数は多くないので、比較的簡単に組み立てられます。

完成後はこんな感じです。

OSはRaspberry Pi OSをカスタマイズしたものです。

今回の主な目的はPICO-8に適した環境を作りたいと思ってました。
www.lexaloffle.com

実用は考えてなく、BASICやPython等の言語やコンソールメインで使用してポケコンみたいな感覚で遊びたいですね。

DevTermは画面サイズが特殊で横に長すぎていまいち使いにくいので手放してしまいましたが、uConsoleは普通のHDワイド(720p)のサイズです。
こちらの方が使いやすく、コンパクトなのでこちらは長く使えそうだともいました。

DevTerm Kit RPI-CM4 Lite 手に入れました

この度DevTerm Kit RPI-CM4 Liteを手に入れました。
DevTerm自体は前からあるもので、コア部分がモジュール化されてARMベースのモジュールやRISC-V、RPI-CM3+Liteのモジュールがありました。
それまで気になってたのですがなかなか購入まで至らず、RPI-CM4 Liteのモジュールが発売されたのを機に購入しました。
4月に注文して届くまで4か月かかりました。

このキットの面白いところは下の写真のようにプラモデルみたいなものを組み立てます。

完成するとこんな感じです。

OSはモジュールに合わせてLinuxをカスタマイズしたDevTerm OSがあるのですが、RPI-CM4 LiteはRaspberry Pi OSがベースのものでした。

画面やキーが小さく正直実用性はないと思いますが、コンパクトで邪魔にならないので、SSHで他のサーバに接続したりターミナル的な使い方をすると意外と便利だと思いました。

サイズ、デザインから現代版ポケコンみたいで触ってるだけで楽しいです。

Raspberry Pi Zero 2 Wでスーパーコンピュータをつくってみた

Raspberry Pi Zero 2 Wでスーパーコンピュータをつくってみました。
とは言っても非常に非力なのは承知で、単純に遊んでみたかったのと、並列処理のプログラミングに興味があったので環境が欲しいと思ってました。

Raspberry Pi Zero 2 Wにしたのは最小のものにしたくてネタ的にも面白いと思ってたからです。
しかし現在入手が難しく、約1年かけて色々なショップをウォッチして3個入手できたので、これでクラスタ化した環境を作ってみました。

今回Raspberry Piでスーパーコンピュータを作るのにちょうど良い本を見つけたので、これを読みながら構築してみました。
Raspberry Piでスーパーコンピュータをつくろう!

今回は色々試しながらで何回もやり直したりしながらだったので構築手順は特に覚えているわけではなく、説明しにくいので詳細は書きません。興味のある方は、『Raspberry Piでスーパーコンピュータをつくろう!』を読んでみてください。

概要的には以下の手順で構築しました。

1. Raspberry Pi OSをセットアップ
それぞれIPアドレスは固定にして、ホスト名を変更します。

2. /etc/hosts を編集
お互いにホスト名でアクセスできるように/etc/hostsを編集します
今回は以下のように同じものをすべてのサーバに設定しました

192.168.0.41    rpisc01
192.168.0.42    rpisc02
192.168.0.43    rpisc03

3. 3台とも必要なものをインストール

sudo apt install build-essential manpages-dev gfortran nfs-common nfs-kernel-server openmpi-bin libopenmpi-dev openmpi-doc keychain nmap

スレーブとなる2台目以降はnfs-kernel-serverは必要ないのですが、あっても困らないので統一しました。

4. NFS設定
コンパイルした実行ファイルは全てのサーバで必要になります。
マスターサーバに適当な作業ディレクトリを作成し、スレーブからマウントして同じものが各サーバから使用できるようにします。

簡単ですが以上のように構築しました。

テストとして本に書いてあったπの値を求める計算をしてみました。
ソースコードは著作物で公開してよいかわからないのでここでは書きません。

ソースはmpiccコマンドでコンパイルします。

mpicc test1.c -o test1

これで実行ファイルとしてtest1が生成されます。

実行はmpiexecコマンドで実行できます。

例:プロセス(スレッド)を1で実行する場合

mpiexec -n 1 test1

実行時間を見るためにtimeコマンドを使用してまずコアを1個使用する状態で実行してみます。
"Enter number of segments:"と表示され入力を求められますが、本の例と同じように300000で実行してみます。

$ time mpiexec -n 1 test1

#######################################################

Master node name: rpisc01

Enter number of segments:

300000

*** Number of processes: 1

     Calculated pi = 3.14159265359071326
              M_PI = 3.14159265358979311
    Relative Error = 0.00000000000092015

real    46m38.851s
user    46m32.714s
sys     0m0.784s

処理の実時間をreal+sysとすると約46分39秒でした。

次はコアを4個使用してみます。

$ time mpiexec -n 4 test1

#######################################################

Master node name: rpisc01

Enter number of segments:

300000

*** Number of processes: 4

     Calculated pi = 3.14159265359071326
              M_PI = 3.14159265358979311
    Relative Error = 0.00000000000092015

real    11m44.018s
user    46m48.134s
sys     0m0.617s

real+sysで約11分45秒なので、処理速度も4倍になりました。

次にスレーブも含めた全てのコアを使って実行してみました。
実行に-n 12 とかの指定ではエラーになりスマートなパラメータの指定方法がわからず、とりあえず-Hで指定しました。

$ time mpiexec -H rpisc01,rpisc01,rpisc01,rpisc01,rpisc02,rpisc02,rpisc02,rpisc02,rpisc03,rpisc03,rpisc03,rpisc03 test1

#######################################################

Master node name: rpisc01

Enter number of segments:

300000

*** Number of processes: 12

     Calculated pi = 3.14159265359072037-
              M_PI = 3.14159265358979311
    Relative Error = 0.00000000000092725

real    5m20.207s
user    17m6.587s
sys     2m8.557s

real+sysで約7分28秒でした。
期待したほどではなかったのですが、1台の時よりは速くなりました。
realの時間は倍以上になっているので、単純な処理では速くなっているのですが、sysの時間が増えてしまいました。
マスター+スレーブ1台の場合でも2分近くかかったので、恐らくサーバ間の通信処理辺りがボトルネックになっていそうです。

並列処理の分野は経験が無く、どう応用すればよいかもわかりませんが、これから遊んでみたいと思います。