Closed9

ONNX ファイル(yolo)を Hailo's HEF 形式に変換する

しろがみしろがみ

ゴール

最近ラズパイ5で動作するRaspberry Pi AI HAT+ AIアクセラレータを購入した
自作モデルを動かしたくなったが、すぐには出来なさそうなので色々調べながらやっていく

変換方法がわかるのと、hef ファイル生成までやって実機で動くとこまで確認したい。

変換したいモデル : yolov8m, yolov8s のカスタムトレーニングモデル

26TOPS, 13TOPS 両方買った
構築したデバイス

しろがみしろがみ

hailo コミュニティーにそれっぽい記事を見つけた
どうも「データから行う方法」と「モデルから行う方法」の2つがあるみたい

モデルから行う方法に興味もあるけど、一旦簡単そうな「データから行う方法」で試してみたい

https://community.hailo.ai/t/dataflow-compiler-dfc-availability/1476

Bring Your Own Data (BYOD) - The most recommended way is using the retraining Docker containers from the Hailo Model Zoo. This will allow you to use some of the most popular networks, (re)trained on your own custom data (see this link for an end-to-end example in our GitHub repo).

データから行う方法 - (適当訳) 推奨、Hailo Model-Zoo というソフトウェアがあるのでそれを使ってカスタムデータから学習を行う方法。example はこちら https://github.com/hailo-ai/hailo-rpi5-examples/blob/main/doc/retraining-example.md

Bring Your Own Model (BYOM) – This method requires a deeper understanding of the model and the conversion flow from ONNX or TensorFlow Lite (TFLite) to Hailo’s HEF format. We suggest using the DFC user guide and tutorials. This approach may present more challenges compared to using the retraining Docker containers from the Model Zoo, but for some, the ride is as enjoyable as the destination :blush: (see this link for DFC tutorials).

モデルから行う方法 - (適当約) 挑戦的、変換の際にはモデルや変換フローの深い理解が求められます。Hailo Model-ZooのリトレーニングDockerコンテナを使用するよりも挑戦的ですが、DFC ユーザーガイドとチュートリアルを活用することで対応可能です。

しろがみしろがみ

この example を参考にやっていく。この example では

  • 環境構築
  • yolo モデルの学習
  • torch -> onnx
  • onnx -> hef

という流れだが、onnx 形式のファイルはすでにあるので

  • 環境構築
  • onnx -> hef
    の2つだけで行けそう

まず hailo の developer-zone からHailo AI Software Suite – Docker をダウンロード。
https://hailo.ai/developer-zone/software-downloads/

したら中身にシェルファイルがあるので実行して Docker コンテナ立てる
実行終わったら自動的にコンテナの中に入ってる

$ sudo ./hailo_ai_sw_suite_docker_run.sh

...

Welcome to Hailo AI Software Suite Container
To list available commands, please type:

----------------------------------------------------

HailoRT:                hailortcli -h
Dataflow Compiler:      hailo -h
Hailo Model Zoo:        hailomz -h
TAPPAS:                 hailo_run_app -h

----------------------------------------------------

(hailo_virtualenv) hailo@hailo@kota-XiroGA3:/local/workspace$

ローカルのデータセット、モデルを Docker コンテナ内にコピー

$ sudo docker cp {ローカル}/best.onnx hailo_ai_sw_suite_2024-10_container:/local/workspace/hailo_model_zoo/hailo_model_zoo/best.onnx
$ sudo docker cp {ローカル}/custom_datasets hailo_ai_sw_suite_2024-10_container:/local/workspace/hailo_model_zoo/hailo_model_zoo

hailomz compile コマンドを使ってモデルの変換

$ hailomz compile yolov8m --ckpt=best.onnx --hw-arch hailo8 --calib-path val/images/ --classes 3 --performance

hailo_model_zoo リポジトリ の画像を見る感じ、変換するにはいくつか作業があるけど hailo compile コマンドを使ったら一つでやってくれるのかな?

しろがみしろがみ

Docker コンテナ内で GPU を認識してなかった。
nvidia-docker2 をサポートしてるみたい、非推奨だけどしょうがない

https://community.hailo.ai/t/gpu-not-detected-in-hailo-suite/6326

インストールして docker を再起動

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
   && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
   && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker

作り直したらコンテナ内で nvidia-smi 通った

$ sudo ./hailo_ai_sw_suite_docker_run.sh

...

----------------------------------------------------

HailoRT:                hailortcli -h
Dataflow Compiler:      hailo -h
Hailo Model Zoo:        hailomz -h
TAPPAS:                 hailo_run_app -h

----------------------------------------------------

(hailo_virtualenv) hailo@kota-XiroGA3:/local/workspace$ nvidia-smi
Thu Jan  9 19:05:07 2025       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 560.35.05              Driver Version: 560.35.05      CUDA Version: 12.6     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 4060 Ti     Off |   00000000:06:00.0  On |                  N/A |
|  0%   32C    P8             11W /  160W |     568MiB /   8188MiB |      6%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
+-----------------------------------------------------------------------------------------+
しろがみしろがみ

今度は [error] Mapping Failed (Timeout, allocation time: 31m 3s) というエラーが出るようになった。

https://community.hailo.ai/t/hailo-compiler-mapping-failed/3221
以下記事を見るとメモリを増やすとかすればいいみたい、Amazon でポチったので後々増やす

とりあえず performance フラグ入れるとメモリを使うっぽいので外して実行すると通った。

(yolov8m, yolov8s) x (hailo8, hailo8l) の 4 パターン作った

モデルサイズ hailo デバイス できたファイル
yolov8m hailo8 yolov8m_hailo8.hef
yolov8m hailo8l yolov8m_hailo8l.hef
yolov8s hailo8 yolov8s_hailo8.hef
yolov8s hailo8l yolov8s_hailo8l.hef
しろがみしろがみ

har (Hailo Archive file) も生成されているので profile してみる

hailo profiler yolov8s_hailo8.har

185.84 FPS ?????? まじか、凄すぎる

実機で検証

ラズパイ5 x hailo 8 環境に hailoRT をインストール
インストール方法は下のリンクから
https://hailo.ai/developer-zone/documentation/hailort-v4-20-0/?sp_referrer=install/install.html#compiling-from-sources

$ hailortcli benchmark yolov8s_hailo8.hef

すごい、本当に 185 fps 出るんだ

4 パターンの出力まとめ

モデルサイズ hailo デバイス fps(fw_only) fps(streaming)
yolov8m hailo8 29.6648 29.6628
yolov8m hailo8l 22.5244 22.5913
yolov8s hailo8 50.5127 50.5136
yolov8s hailo8l 185.593 185.597
しろがみしろがみ

Hailo の AI カメラでも実行してみた

環境構築はこの記事がわかりやすいと思います。
https://gigazine.net/news/20241031-raspberry-pi-ai-hat-plus-camera/

--hef-path で HEF ファイルを渡せるようになっているので渡してみる

$ python basic_pipelines/detection.py -i rpi -f --hef-path yolov8m_hailo8.hef

30 fps ぐらいで推論できた、ちょっと感動もの

yolov8s でも 30fps だったから多分カメラモジュールがボトルネックになってそう

しろがみしろがみ

一旦終わりにする

やり残したこと

  • performance フラグをつけて実行できるようにする
しろがみしろがみ

hailo compile で CUDA を使えるようにする

hailomz compile したところ CUDNN を検出できてない?

CUDNN version should be 8.9 or higher, found ..

dpkg 確認したところ libcudnn8 等の必要なライブラリはあった、しかしパスが通ってなかった

通した

export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

OK使えた

このスクラップは5ヶ月前にクローズされました