はじめに
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
さんが
前の土曜日の0:20
に
編集
をしました。
(メッセージ: 初版)
ログインしてコメントを投稿する