編集履歴一覧に戻る
airpocketのアイコン画像

airpocket が 2024年11月16日00時20分42秒 に編集

初版

タイトルの変更

+

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

タグの変更

+

M5Stack

+

LLM

+

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の[マニュアル](https://pulsar2-docs.readthedocs.io/en/latest/#)から、モデル変換の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へのリンク)](https://drive.google.com/drive/folders/10rfQIAm5ktjJ1bRMsHbUanbAplIn3ium)にあるので、ダウンロードして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のデータ([ダウンロード先](https://github.com/xiguadong/assets/releases/download/v0.1/quick_start_example.zip))を配置します。 ダウンロードしたファイルは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 ちなみに推論に使った画像と各クラスはこれ。 ![キャプションを入力できます](https://camo.elchika.com/d180b6e057b2aa0bfaa7ee8cdf9a42531db4fd6b/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f38666662353561372d373433312d346234382d383832642d3565323665663534343465652f30626431663037612d326336342d343930342d613962642d383737383139383936383434/) クラス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をダウンロード](https://github.com/AXERA-TECH/pulsar2-docs/releases/download/v1.9/ax-samples.zip)し解凍します。 cmakeをインストール ``` sudo apt-get install cmake ``` [gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xzをダウンロード](https://pulsar2-docs.readthedocs.io/en/latest/user_guides_advanced/advanced_deploy_guides.html#model-deploy-advanced-en) ファイルを移動 ``` 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 -------------------------------------- ```