🚀

Raspberry Pi 5 + Hailo-8でHailoRTを動かす

2024/11/08に公開

この記事について

この記事は、Raspberry Pi 5 + AI Kit の導入に関する話題をまとめています。
AI Kitとは、Rapsberry Pi 5に高速・低消費電力なAI処理機能を追加するキットです。
Raspberry Pi M.2 HATとHailo社のAIアクセラレータモジュールHailo-8Lを組み合わせています。
初回はRaspberry Pi財団が公開するソフトウェアを用いてAI Kitを動作させるところまでを説明しました。
第2回はHailoRT Python packageを使用して推論を実行する方法を紹介します。
今回は主にRaspberry Pi 5にHailo-8を接続した環境で説明しています。
また、Raspberry Pi 5向けのAI Kitに搭載されているチップであるHailo-8L環境での使用法を説明して、Hailo-8との性能を比較します。

誰が書いているのか

株式会社アラヤのエッジAI チームの佐伯です。
普段は、エッジAIシステムの開発などを行っています!
アラヤのエッジAIチームでは、アラヤの"人類の未来を圧倒的に面白く!"するというビジョンを達成するために、"すべてのモノにAIを乗せる"というミッションに取り組んでいます。

準備

必要なソフトウェアを入手するために、Hailo Developer Zoneにアカウント登録を行います。
https://hailo.ai/developer-zone
その後、Software Downloads(https://hailo.ai/developer-zone/software-downloads/)にアクセスし、以下の通り選択します.

  • Software Package: AI Software Suite
  • Software Sub-Package: HailoRT
  • Architecture: ARM64
  • OS: Linux
  • Python Version: 3.11
  • Archive
    ここで、「HailoRT – Python package (whl) for Python 3.11, aarch64」を選択して、hailort-4.18.0-cp311-cp311-linux_aarch64.whlをダウンロードします。

Hailoソフトウェアのインストール

Raspberry Pi向けのHailoソフトウェアをインストール

既に、Raspberry Pi向けのHailoソフトウェアをインストール済みの方はこの作業は不要です。

  • インストール方法の順でインストールします
  • 準備
    • sudo apt update && sudo apt full-upgrade
    • sudo rpi-eeprom-updateの結果
      • 6 December 2023 よりも新しかったのでこの後はスキップ
    • ソフトウェアインストール
      • sudo apt install hailo-all
      • 再起動
      • 確認のためにhailortcli fw-control identifyを実行します
        • Board Name: Hailo-8が含まれてれば成功です

HailoRT Python packageをインストール

ここからはPythonの仮想環境を作成し、そちらで作業を行います。

  • 仮想環境の作成
    • python3 -m venv venv
    • source venv/bin/activate
  • HailoRT Python packageのインストール
    • pip install ./hailort-4.18.0-cp311-cp311-linux_aarch64.whl
  • また、Jupyter Notebookをインストールします
    • pip install jupyter

HailoRT Python package

Hailoのチュートリアルを実行していきます。
ここではHailo-8を接続した環境での実行方法を説明していますが、AI KIT(Hailo-8L)を接続した環境で実行する場合は、後に説明するHailo-8Lとの比較の通り、resnet_v1_18.hefをHailo-8L用のHEFファイルを用意することで実行可能です。

チュートリアルはJupyter上で実行することを前提としていますが、エッジ運用を見据えて .py に変換したファイルをもとに変更を加えながら実行します。
このチュートリアルではモデルにresnet18を使った分類問題を実行します。
ここではまず、チュートリアル用に準備された、Hailo-8用に変換済みのHEFファイルを使用して、推論時間の計測までを行います(ここでは入力データに実際の画像を使っていません)。

チュートリアルを実行(ipythonファイルをpyファイルに変換)

チュートリアルファイルはvenv/lib/python3.11/site-packages/hailo_tutorials/notebooks/HRT_0_Inference_Tutorial.ipynbにあります。
これをpyファイルに変換します。
venv/lib/python3.11/site-packages/hailo_tutorials/notebooksディレクトリに移動して以下を実行します。
(なお、以降はこのディレクトリで作業を実施します)

(venv) $ jupyter nbconvert --to python HRT_0_Inference_Tutorial.ipynb

上記を実行すると、HRT_0_Inference_Tutorial.pyが生成されます。
このファイルを実行すると、resnet_v1_18をモデルとした推論を実行します。
下のような出力が得られれば変換は成功です。

(venv) $ python3 HRT_0_Inference_Tutorial.py
Stream output shape is (10, 1000)
Starting streaming (hef='resnet_v1_18', num_of_frames=1000)
Done

このチュートリアルでは乱数で生成した入力画像を使用しています。

時間計測

HRT_0_Inference_Tutorial.py では2通りの方法で推論を実行しています。

  • 1個目は入力データを推論パイプラインに入れる単純なケースです。
  • 2個目は入力画像を送るプロセスと推論結果を受け取るプロセスを別に動かしてHailoの速度を最大限に活用する方法です(ストリーミング推論)。

ここではまず、簡易に性能を測るツールを使ってモデル単体の速度を調べ、次に上記の2つの推論時間を計測して比較します。

モデル単体の速度を計測

hailortcli benchmarkコマンドを実行すると、モデル単体の速度を計測し、Summaryを得ることができます。
HRT_0_Inference_Tutorial.pyの44~45行目を見ると、../hefs/resnet_v1_18.hefをモデルとして使用しているのがわかります。そこで、このモデルを調べます。

(venv) $ hailortcli benchmark ../hefs/resnet_v1_18.hef
...
...
...
=======
Summary
=======
FPS     (hw_only)                 = 2531.6
        (streaming)               = 2533.86
Latency (hw)                      = 1.25973 ms
Device 0000:01:00.0:
  Power in streaming mode (average) = 3.87931 W
                          (max)     = 3.96318 W

FPSやレイテンシ、消費電力等のSummaryが表示されます。

実際に動かして計測

HRT_0_Inference_Tutorial.pyの58~66行目では、ランダムな値の10枚のデータセットを作成していることがわかります。

# Define dataset params
input_vstream_info = hef.get_input_vstream_infos()[0]
output_vstream_info = hef.get_output_vstream_infos()[0]
image_height, image_width, channels = input_vstream_info.shape
num_of_images = 10
low, high = 2, 20

# Generate random dataset
dataset = np.random.randint(low, high, (num_of_images, image_height, image_width, channels)).astype(np.float32)

また75行目から80行目にかけてこのデータセットの推論を実施しています。以下のように、推論部分に時間を計測するコードを挿入します。

# Infer
import time          # 追加
start = time.time()  # 追加
with InferVStreams(network_group, input_vstreams_params, output_vstreams_params) as infer_pipeline:
    input_data = {input_vstream_info.name: dataset}
    with network_group.activate(network_group_params):
        infer_results = infer_pipeline.infer(input_data)
end = time.time()                       # 追加
print("{:.3f} sec".format(end - start)) # 追加
print('Done')

これで実行すると以下の結果が得られます。

(venv) $ python3 HRT_0_Inference_Tutorial.py
0.021 sec
Done

10枚のデータセットで0.021秒の時間がかかっており、この結果から476FPS程度と推測されます。

ストリーミング推論

83行目から、Pythonのマルチプロセスを使用したストリーミングで推論を実行するコードが記述されています。
こちらでは1000枚のフレームを一度に走らせる処理を行っています。
推論のプロセスは130行目から実行されており、これまでと同様、ここに時間を計測するコードを挿入します。

# Define the amount of frames to stream
num_of_frames = 1000

send_process = Process(target=send, args=(network_group, num_of_frames))
recv_process = Process(target=recv_all, args=(network_group, num_of_frames))

import time          # 追加
start = time.time()  # 追加
recv_process.start()
send_process.start()
#print('Starting streaming (hef=\'{}\', num_of_frames={})'.format(model_name, num_of_frames))
with network_group.activate(network_group_params):
    send_process.join()
    recv_process.join()
end = time.time()                       # 追加
print("{:.3f} sec".format(end - start)) # 追加
print('Done')

target.release()

これで実行すると以下の結果が得られます。

(venv) $ python3 HRT_0_Inference_Tutorial.py
0.422 sec
Done

1000枚のデータセットで0.422秒の時間がかかっており、この結果から2370FPSぐらいと推測されます。これは、hailortcli benchmarkコマンドを実行したときに出力された値(2533.86FPS)に比較的近い値となりました。

Hailo-8Lとの比較

Raspberry Pi向けのAI Kitに搭載されているチップはHailo-8Lで、Hailo-8の廉価版となります。
ここでは、Hailo-8L用にコンパイルされたモデルを使用して、同様の推論時間を計測します。

Hailo-8Lコンパイルされたモデルは、Hailo Model Zooからダウンロードできます。
こちらから、resnet_v1_18のHEFファイルをダウンロードします。

ダウンロードしたHEFファイルを使用して、同様に推論時間を計測します。
まず、hailortcli benchmarkコマンドを実行してみます。

(venv) $ hailortcli benchmark ../hefs/resnet_v1_18.hef
...
...
...

=======
Summary
=======
FPS     (hw_only)                 = 915.327
        (streaming)               = 915.658
Latency (hw)                      = 2.76103 ms
Device 0000:01:00.0:
  Power in streaming mode (average) = 1.73764 W
                          (max)     = 1.75206 W

Hailo-8Lの性能は、Hailo-8と比較して、FPSが約2分の1未満、レイテンシが約2倍となっています。
一方で、消費電力はHailo-8の約半分となっています。

次に、Hailo-8Lでストリーミング推論を実行してみます。

(venv) $ python3 HRT_0_Inference_Tutorial.py
1.113 sec
Done

1000枚のデータセットで1.113秒の時間がかかっており、この結果から898FPSぐらいと推測されます。
以上の結果から、Hailo-8LはHailo-8と比較して性能が低いものの、消費電力が低いことがわかります。

以上の結果を表にまとめると以下になります。

ストリーミング推論(FPS) hw_only(FPS) Letency(HW) Power(MAX)
Hailo-8 2370 2531 1.25973 ms 3.96318 W
Hailo-8L 898 915 2.76103 ms 1.75206 W

まとめ

Hailo-8をRaspberry Pi 5に搭載し、HailoRT Python packageを使用して推論を実行する方法を紹介しました。
また、Hailo-8LとHailo-8の性能を比較しました。
Hailo-8LはHailo-8と比較して性能が低いものの、消費電力が低いことがわかりました。

今回使用したRaspberryPi 5 + Hailo-8の組み合わせは、 Raspberry Pi AI HAT+の26TOS版に相当します。
本記事執筆現在、Hailo-8を搭載したRaspberry Pi AI HAT+(26TOPS版)と、Hailo-8Lを搭載したRaspberry Pi AI HAT+(13TOPS版)がリリースされています。
選択の参考になれば幸いです。

エッジAIからLLM構築まで気軽にご相談ください!
株式会社アラヤの先端研究支援
株式会社アラヤのエッジAI
SubnetX

Discussion