Raspberry Pi 5でHailo-8 AIアクセラレータを使用する

14/05/2024

河口研究室で助教をしている浦野です.

河口研究室では,様々なデバイスを購入して研究に利用していますが,今回はおなじみRaspberry Piの最新モデルRaspberry Pi 5に,AIアクセラレータHailo-8を取り付けて少し遊んでみようと思います.

Raspberry Piは5になってPCIeポートが利用可能になりました(以前MIPI DSIポートが生えていた場所にあります). 今後様々な拡張キットが出てくるものと思われますが,NVMe M.2カードを利用するのが現状の主な利用手段でしょう. 世間的にはNVMe SSDを増設するのが例として多いと思いますが,今回はM.2のAIアクセラレータを利用して,深層モデルを高速化できるRaspberry Piを作ります.

本記事では,環境構築を行って,PythonでYOLOv8の推論をさせてみるところまでを行います.

用意するモノ

必要パーツ

Raspberry Pi 5を動かすための基本キットに,NVMeベースボードとHailo-8モジュールが必要です. 2024年5月14日に,Raspberry Pi財団の公式M.2 HAT+(https://ssci.to/9248)が発表されています. こちらもおそらく使えると思いますが,未発売のため検証できていません. なお,Raspberry Pi 4以前のものは,PCIeをサポートしないため利用できません.

ちなみに,Raspberry Pi 5はデスクトップ画面を出しているだけでも結構発熱するので,アクティブクーラーは事実上必須だと思います. (アクティブクーラーでなくても,なにかしらの熱対策が必要でしょう)

組み立て

NVMeベースボードにHailo-8を取り付け,ネジで固定したら,ベースボードをPi5に取り付けます. フラットケーブルが少々刺さりにくいですが,破損させないように気をつけましょう.

Hailo-8 on NVMeベースボード

クーラーも含めて組み立てるとこんな感じになりますね(カメラ用のCSIリボンケーブルも生えています). なお,Hailo-8はRaspberry Pi本体とNVMeベースボードにサンドイッチされたようになります.

固定直前

組み立て完了

環境構築

OS

お好きな方法で公式イメージをmicroSDに焼きます. Raspberry Pi ImagerやEtcherなど,書き込みソフトは色々ありますが,Raspberry Pi Imagerが楽でしょう. なお,Raspberry Pi OS (64bit, Bookworm; 2024-03-15)を使っています.

OSを起動させたら,とりあえずパッケージを最新にしておきましょう.

sudo apt update
sudo apt upgrade -y

Hailo PCIeドライバとファームウェア

PCIeドライバの導入には大きく2つの方法があります.

  1. Hailoの公式ソフトウェアダウンロードからパッケージを取得してインストール
  2. ドライバを手元でビルドしてインストール

今回はドライバを手元でビルドしてインストールします.(ソフトウェアパッケージをダウンロードしても大丈夫かもしれません)

sudo apt install -y cmake dkms
# cloneするか,下記HailoRTのバージョンに合わせたリリースをダウンロード
git clone https://github.com/hailo-ai/hailort-drivers.git
cd hailort-drivers/linux/pcie
make all
sudo make insttall_dkms
sudo reboot

再起動したら,先ほどクローンしたhailort-driversまで移動し,以下を続行します.

./download_firmware.sh
sudo mv hailo8_fw.4.17.0.bin /lib/firmware/hailo/hailo8_fw.bin
sudo cp linux/pcie/51-hailo-udev.rules /etc/udev/rules.d/
sudo reboot

再起動したら,再度hailort-driversまで移動し,以下を行います.

sudo cp linux/pcie/hailo_pci.conf /etc/modprobe.d/
sudo vim /etc/modprobe.d/hailo_pci.conf # お好きなエディタでどうぞ

エディタでhailo_pci.confを開いたら,options hailo_pciで始まる行のコメントを外して保存しましょう. 特に,force_desc_page_sizeの行はコメントを外さないと正常に動作しませんでした.

設定が終わったら再起動します.

sudo reboot

HailoRT環境

Hailo Developer Zone (https://hailo.ai/developer-zone/software-downloads/)にアクセスし,登録及びログインして,以下の通り選択します.

  • Software Package: AI Software Suite
  • Software Sub-Package: HailoRT
  • Architecture: ARM64
  • OS: Linux
  • Python Version: 3.8

この状態で,HailoRT – Ubuntu package (deb) for arm64がダウンロードできるので,ダウンロードし,インストールします.

# ダウンロードしたファイルのある場所まで移動
sudo apt install ./hailort_4.17.0_arm64.deb
# 途中,質問されたらyを入力
sudo reboot

再起動したら,hailortcli fw-control identifyのコマンドが実行できることを確認します.

hailortcliでの動作確認

Python環境

公式に提供されているHailo-8用のPythonライブラリパッケージがPython3.10用なので,今回はpyenvを用いて環境を作成します. (Bookwormに同梱されるPythonは3.11系なので,パッケージをインストールできません)

自前でHailoRTとPythonバインディングをビルドして使う場合は,システム標準のPythonバージョンに合わせられます. なお,手元でPythonバインディングを手動でビルドした際は,インストール時に使用されるスクリプト(setup.py)内に記述のあるwheel_conf.jsonが欠けており,適切に動作させられませんでした.

まずはpyenvおよびpyenv-virtualenvのインストールから.

cd ~
git clone https://github.com/pyenv/pyenv.git .pyenv
# install build deps
sudo apt update; sudo apt install -y build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev curl \
libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev
# write settings into .bashrc
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc

ここまでやったらいったんexitして,再度シェルを立ち上げましょう. pyenv-virtualenvを入れていきます.

git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc

再度exitしてシェルを立ち上げます.今度はPython3.10の導入と,仮想環境の設定になります.

pyenv install 3.10.14
pyenv virtualenv 3.10.14 pyHailoRT

遊ぶためのディレクトリを作って,仮想環境はその中で使うことにします.

mkdir playground
cd playground
pyenv local pyHailoRT

Hailo Developer Zoneから,Python 3.10用のパッケージ(HailoRT – Python package (whl) for Python 3.10, aarch64)をダウンロードし,それを含めて色々入れていきます.

cd playground # ↑で作成したplaygroundに移動
pip install hailort-4.17.0-cp310-linux_aarch64.whl # Hailo Developer Zoneからダウンロードしたパッケージ
pip install jupyterlab matplotlib pillow

いざHailo-8で推論

準備として,Hailo Model ZooからYOLOv8系のobject detection用の.hefモデルをダウンロードしておきましょう. モデル一覧はここから見られます.

今回はyolov8lのモデルをダウンロードすることにします.

wget https://hailo-model-zoo.s3.eu-west-2.amazonaws.com/ModelZoo/Compiled/v2.11.0/hailo8/yolov8l.hef

Jupyterでノートブック上に処理を書いていきましょう. まずはJupyterを起動します. (外部のコンピュータからアクセスする場合は,追加で--ip=* --NotebookApp.token=''をつけるとよいでしょう)

jupyter lab --no-browser

ターミナルにURLが表示されるので,それを開きましょう.

使うnotebookは,こちらに配置しておきますので,丸々コピペしてファイルのパスだけ修正すれば動かせるかと思います.
https://github.com/UCLabNU/Pi5-Hailo8-sample/blob/main/basic_hailo.ipynb

上記のnotebookを実行すると,↓のように画像が表示されるはずです.

推論成功

なお,Python用のサンプルコードはhttps://github.com/hailo-ai/Hailo-Application-Code-Examples/tree/main/runtime/pythonにもたくさんありますので,参考にしてください.

ということで,Raspberry Pi 5 + Hailo-8のサンプルが動作したかと思います. 自前でアプリケーションを開発すれば,カードサイズの筐体で色々遊べるのではないでしょうか.

最後に

河口研究室では,Raspberry Piに限らず,nVIDIA JetsonやOkdo Rock5などの小型コンピュータ,Luxonis OAKやIntel Realsenseなどのカメラなども研究に活用しています. 研究内容はYoutubeでも一部公開していますので,興味がある方は河口研チャンネルを是非ご覧ください.

学生へのコンタクトは haru☆ucl.nuee.nagoya-u.ac.jp へどうぞ! (☆を@に変えてください)

河口研はあなたが来るのを楽しみに待っています!