airpocketのアイコン画像
airpocket 2024年11月16日作成
セットアップや使用方法 セットアップや使用方法 閲覧数 231
airpocket 2024年11月16日作成 セットアップや使用方法 セットアップや使用方法 閲覧数 231

M5Stack LLM ModuleでONNX モデルを変換して使うデモ

はじめに

M5Stack LLM ModuleでLLM以外のONNXモデルも動かしたい人向けのExample。
実行用のRuntimeが無く、モデルに特化した実行ファイルしか公開されていません。
つまりまだAXERA社が対応してくれたモデルしか動かせませんが、今後に期待。

基本事項

M5Stack LLM Moduleは、AXERA社のAX630CというSoCを使用しているため、AX630CのNPUアーキテクチャに最適化された推論モデルと推論実行用Runtimeが必要です。
既存のONNXモデルからAX630C向けの変換にはPulsar2というtoolchainを使用する必要があり、実行環境のDockerイメージが提供されています。

この記事では、Pulsar2 toolchainのマニュアルから、モデル変換のexampleが試せるクイックスタートを実行しモデルの変換を行います。

環境設定

ハードウェア

古いミニPCにUbuntu入れて使います。変換自体はさほど重い処理ではないので十分だと思います。
WSL2とかでもいいはずですが、メインPC壊したくないので。

OS

Ubuntu 24.04.1 LTS

$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 24.04.1 LTS Release: 24.04 Codename: noble $ uname -m x86_64

Docker

https://docs.docker.com/desktop/setup/install/linux/ubuntu/
このページを参考にインストール。

$ sudo docker version Client: Docker Engine - Community Version: 27.3.1 API version: 1.47 Go version: go1.22.7 Git commit: ce12230 Built: Fri Sep 20 11:40:59 2024 OS/Arch: linux/amd64 Context: default Server: Docker Engine - Community Engine: Version: 27.3.1 API version: 1.47 (minimum version 1.24) Go version: go1.22.7 Git commit: 41ca978 Built: Fri Sep 20 11:40:59 2024 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.7.22 GitCommit: 7f7fdf5fed64eb6a7caf99b3e12efcf9d60e311c runc: Version: 1.1.14 GitCommit: v1.1.14-0-g2c9f560 docker-init: Version: 0.19.0 GitCommit: de40ad0

Docker起動

Dockerのインストールは割愛
べんりかなーと思ってDocker Dedktopを入れたけどいらんかった。

Dockerイメージをダウンロードしてロード

docker imageはここ(Google driveへのリンク)にあるので、ダウンロードしてzipを解凍。
2024/11/09現在、最新はax_pulsar2_3.2_patch1_temp_vlm.tar.gz

tar.gzファイルがあるフォルダ下で

sudo docker load -i ax_pulsar2_3.2_patch1_temp_vlm.tar.gz

ロード出来たら確認

sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE pulsar2 temp-58aa62e4 c6ccb211d0bc 4 days ago 2.58GB

TAGが判りにくいので変更

sudo docker tag c6ccb211d0bc pulsar2:3.2.1 sudo docker rmi pulsar2:temp-58aa62e4

念のため確認

$ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE pulsar2 3.2.1 c6ccb211d0bc 4 days ago 2.58GB

(^^)

作業用フォルダを作る

適当な場所に作業用フォルダを作成して、exampleのデータ(ダウンロード先)を配置します。

ダウンロードしたファイルはquick_start-example.zipなので解凍して作業用フォルダ内に以下の様に配置します。

$ tree -L 2 . ├── config │   ├── mobilenet_v2_build_config.json │   └── yolov5s_config.json ├── dataset │   ├── coco_4.tar │   └── imagenet-32-images.tar ├── model │   ├── mobilenetv2-sim.onnx │   └── yolov5s.onnx └── pulsar2-run-helper ├── cli_classification.py ├── cli_detection.py ├── list.txt ├── models ├── pulsar2_run_helper ├── requirements.txt ├── setup.cfg ├── sim_images ├── sim_inputs └── sim_outputs 10 directories, 11 files

Docker run

作業用フォルダ内で、sudo docker runして作業用フォルダ内に構成したファイル類が反映されているのを確認しておきます。

$ sudo docker run -it --net host --rm -v $PWD:/data pulsar2:3.2.1 [sudo] password for [USER]: root@thinkcentre-m73:/data# tree -L 2 . |-- config | |-- mobilenet_v2_build_config.json | `-- yolov5s_config.json |-- dataset | |-- coco_4.tar | `-- imagenet-32-images.tar |-- model | |-- mobilenetv2-sim.onnx | `-- yolov5s.onnx `-- pulsar2-run-helper |-- cli_classification.py |-- cli_detection.py |-- list.txt |-- models |-- pulsar2_run_helper |-- requirements.txt |-- setup.cfg |-- sim_images |-- sim_inputs `-- sim_outputs 9 directories, 11 files

exampleを実行

pulsar2 build --input model/mobilenetv2-sim.onnx --output_dir output --config config/mobilenet_v2_build_config.json --target_hardware AX620E

設定方法は後で見るとして、これで/data/output/compiled.axmodelができた。

docker内でモデルをシミュレーションする

モデルを移動

output/compiled.axmodel pulsar2-run-helper/models/mobilenetv2.axmodel

推論用画像をプリプロセスにかける

python3 cli_classification.py --pre_processing --image_path sim_images/cat.jpg --axmodel_path models/mobilenetv2.axmodel --intermediate_path sim_inputs/0

推論シミュレーションを実行

pulsar2 run --model models/mobilenetv2.axmodel --input_dir sim_inputs --output_dir sim_outputs --list list.txt

ポストプロセスにかける

python3 cli_classification.py --post_processing --axmodel_path models/mobilenetv2.axmodel --intermediate_path sim_outputs/0

出てきた推論結果がこれ。
[I] The following are the predicted score index pair.
[I] 9.9056, 285
[I] 9.1132, 281
[I] 8.8490, 282
[I] 8.5849, 283
[I] 7.3962, 463

ちなみに推論に使った画像と各クラスはこれ。
キャプションを入力できます
クラス285:エジプシャンキャット (Egyptian cat)
クラス281:タビービーキャット (tabby, tabby cat)
クラス282:ペルシャキャット (Persian cat)
クラス283:シャムキャット (Siamese cat, Siamese)
クラス463:ゴールデンレトリーバー (golden retriever)

LLM Module内でaxmodelをテストする

ax_run_model tool を使ったテスト

ax_run_model toolというのは、module上で手早くモデルの推論速度を測定するツールらしいです。
モデル専用のruntimeが無くても動くので便利かな?

先ほど作ったmobilenetv2.axmodelと、cat.jpgをLLM Module の任意の作業用フォルダにコピーします。
LLM Moduleの作業用フォルダ内で、

# ax_run_model -m mobilenetv2.axmodel -w 3 -r 10

測定結果はmobilenetv2が1msで動いているようです。

Run AxModel: model: mobilenetv2.axmodel type: Half vnpu: Disable affinity: 0b01 warmup: 3 repeat: 10 batch: { auto: 0 } pulsar2 ver: 3.2-patch1 58aa62e4 engine ver: 2.6.3sp tool ver: 2.3.3sp cmm size: 4429624 Bytes ------------------------------------------------------ min = 1.046 ms max = 1.053 ms avg = 1.048 ms ------------------------------------------------------

同様にyolov5s.onnxをaxmodelに変換して試したところ、

# ax_run_model -m yolov5s.axmodel -w 3 -r 10

推論時間は約15msでした

Run AxModel: model: yolov5s.axmodel type: Half vnpu: Disable affinity: 0b01 warmup: 3 repeat: 10 batch: { auto: 0 } pulsar2 ver: 3.2-patch1 58aa62e4 engine ver: 2.6.3sp tool ver: 2.3.3sp cmm size: 13352690 Bytes ------------------------------------------------------ min = 15.423 ms max = 15.480 ms avg = 15.442 ms ------------------------------------------------------

axmodelをLLM Moduleで実行する

推論実行バイナリをクロスコンパイルする

axmodelの推論実行に当たっては、pythonのruntimeライブラリのような便利なものが無く、モデルに合わせて実行ファイルをコンパイルする必要があります。

以下のドキュメントに従って、先ほどのmobilenetv2の実行ファイルをコンパイルします。
https://pulsar2-docs.readthedocs.io/en/latest/user_guides_advanced/advanced_deploy_guides.html#model-deploy-advanced-en

ubuntu PCでax-samplesをダウンロードし解凍します。

cmakeをインストール

sudo apt-get install cmake

gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xzをダウンロード

ファイルを移動

mkdir -p ~/usr/local/lib mv gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz ~/usr/local/lib

解凍

cd ~/usr/local/lib xz -d gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz tar -xvf gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar

環境変数を追加

vim ~/.bashrc

追記

export PATH=$PATH:~/usr/local/lib/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin

有効化

source ~/.bashrc

ax-samplesを解凍したフォルダに戻り、

mkdir build cd build cmake -DCMAKE_TOOLCHAIN_FILE=../toolchains/aarch64-none-linux-gnu.toolchain.cmake -DAX_TARGET_CHIP=ax620e .. make install

ビルドができるとax-samples\build\install\bin配下にax_classification,ax_yolov5s,ax_yolov5s_coco_mapの3つのファイルができています。

推論実行バイナリで推論する

ax_classificationを、Module LLMの作業用フォルダにコピーします。
作業用フォルダ内に、ax_classification、mobilenetv2.axmodel、cat.jpgがあることを確認してください。

ax_classificationに実行権限を付与します。

chmod 755 ax_classification

以下のコマンドで推論実行

./ax_classification -m mobilenetv2.axmodel -i cat.jpg -r 100

実行結果は以下の通り。1msで推論完了してる。。。

-------------------------------------- model file : mobilenetv2.axmodel image file : cat.jpg img_h, img_w : 224 224 -------------------------------------- Engine creating handle is done. Engine creating context is done. Engine get io info is done. Engine alloc io is done. Engine push input is done. -------------------------------------- topk cost time:0.10 ms 9.3773, 285 8.7169, 282 8.7169, 281 8.3207, 283 7.0000, 463 -------------------------------------- Repeat 100 times, avg time 1.05 ms, max_time 1.10 ms, min_time 1.05 ms

同様にyolov5sも実行

./ax_yolov5s -m yolov5s.axmodel -i cat.jpg -r 100

15msで実行してるね。post processの方が時間くってる。

-------------------------------------- model file : yolov5s.axmodel image file : cat.jpg img_h, img_w : 640 640 -------------------------------------- Engine creating handle is done. Engine creating context is done. Engine get io info is done. Engine alloc io is done. Engine push input is done. -------------------------------------- post process cost time:26.85 ms -------------------------------------- Repeat 100 times, avg time 15.44 ms, max_time 15.73 ms, min_time 15.42 ms -------------------------------------- detection num: 1 15: 87%, [ 163, 25, 356, 357], cat --------------------------------------
airpocketのアイコン画像
電子工作、プログラミング、AI、DIY、XR、IoT M5Stack / Raspberry Pi / Arduino / spresense / K210 / ESP32 / Maix / maicro:bit / oculus / Jetson Nano / minipupper etc
  • airpocket さんが 前の土曜日の0:20 に 編集 をしました。 (メッセージ: 初版)
ログインしてコメントを投稿する