2023年5月20日土曜日

NNCase V1.7を試す話(実機実行編)



前回のSim実行編にて、NNCaseのSimが動くところまで確認しました。今回はその続きで、実機で動かす話になります

1.テスト環境

今回の環境(ホスト)は以下の通りです
  • RPi4 4GB(Raspbian 11:bullseye)
  • Docker(23.0.5, build bc4487a)
  • NNCase(v1.7.1)
  • nncaseruntime(v1.7.1)
  • kendryte-standalone-sdk
  • kendryte-gnu-toolchain
基本的な流れとしては、toolchainを入れてからstandalone-sdkを入れ、nncaseのruntimeを入れる形となります

またK210のボードとして、Maix Bitを使いました


2.インストール

まずはtoolchainのインストールからになります。
$ git clone --recursive https://github.com/kendryte/kendryte-gnu-toolchain
$ cd /kendryte-gnu-toolchain/riscv-gcc
$ ./contrib/download_prerequisites
$ cd /kendryte-gnu-toolchain
$ ./configure --prefix=/opt/kendryte-toolchain --with-cmodel=medany --with-arch=rv64imafc --with-abi=lp64f
$ make -j4
今回は/opt/kendryte-toolchainに突っ込みました。次にsdkを入れます。
$ git clone https://github.com/kendryte/kendryte-standalone-sdk
kendryte-standalone-sdk/srcにビルドしたいプロジェクトを突っ込んでいくみたいです。最後にnncaseruntimeを入れていきます。
$ wget https://github.com/kendryte/nncase/releases/download/v1.7.1/nncaseruntime-k210.zip -P ./kendryte-standalone-sdk/lib/nncase/v1
$ unzip -o ./kendryte-standalone-sdk/lib/nncase/v1/nncaseruntime-k210.zip -d ./kendryte-standalone-sdk/lib/nncase/v1
sdkのディレクトリにsrc/lib/nncase/v1があり、この中にruntimeを入れている格好になっています。アップデートの際にはここを上書きすることで対応することができます。

3.コンパイル

前回のSim実行環境のサンプルコードと実機用のコードをまとめたものを上げておきます。
build_yolox.sh内のcompile_pathをsdkの場所に書き換えることで実行できるはずです。
差分としては、Maix Bitのへの対応がメインになります。
コンパイルをすると、モデルの変換結果や実機に入れるbinなどが生成されます。

4.実行結果
実機実行の結果。Simと微妙に異なる

実際に動かすとちゃんと認識していることが分かるかと思います。しかしながらSim結果とは異なっている部分もあり、何起因の差分化は考える必要がありそうです。

実行結果(UART)
1回目実行では1100ms程度かかるらしい

実行速度は1100ms程度のようでした。起動直後の1回しかは測定していないので、もう少し条件を詰めて確認する必要があるかと思われます。

5.まとめ


今回はSim編の続きとして実機実行までの流れをやってみました。とりあえずどんな感じで動かせばよいかぐらいは分かったかと思います。この話の発展として別のDNNモデルを実行したり、性能改善を行ったり、カメラをつけて実行等があるかと思いますが、今回はここまでにしたいと思います。



©2023 shts All Right Reserved.



2023年5月2日火曜日

NNCase V1.7を試す話(Sim実行編)


社会人2年目になり業務量が増えてきた中の人です。今回は以前やっていたが公開していなかったNNCaseのv1.x系(kmodel v5)を試す話になります。
2023/5/20追記:サンプルコードを公開



1.NNCase v1.xの特徴

以前のバージョンと比較した際の一番の変更点としては、従来のコマンドラインベースのものからPythonの1ライブラリとしての実装に変更されています。kmodelの元ネタになるonnxやkerasのモデルを生成するコードに追加することもできます。ビルド済みのwhlが公式から提供されており、CPUはx86-64、OSはWin/Linux/Mac版があります。
これ以外の点では、対応する演算の種類が増えている、K210の上位機種に当たるK510への対応といった部分のアップデートがなされています。これに合わせる形?でkmodelのバージョンもv5に上がっています。

2.テスト環境


今回の環境は以下の通りです。
  • RPi4 4GB(Raspbian 11:bullseye)
  • Docker(23.0.5, build bc4487a)
  • NNCase(v1.7.1)
NNCaseのv1.xはarm64に対応するwhlを出していないのですが、中身を一部変更してビルドしました(基本的にはx86-64と同じコードになります)。またビルドのデバッグがやりたかったので、Docker環境にねじ込みました。今回はK210を動かすところまではいかないので、NNCaseのみの紹介にします

3.インストール


x86-64環境であればインストールは簡単で、公式のリリースからwhlを持ってきてインストールするだけになります。(今回試しているarm64の場合は自前でビルドする必要が出てくるので面倒でした)

4.コンパイルとSim実行


v1.7.1でのコンパイルとSim実行手順は基本的にはここにいろいろ書いてあります。このディレクトリを手元に落としてきて動かすのが最初はよいかと思います。
このディレクトリは以下のような感じになっています。
.
|- tools:モデルの変換とSimを実行するためのコード
|- images:入力画像
|- model:もとになるモデル(onnx)
|- cpu
`-k210:実機実行用のコード
README.mdを見たところ、画像の入ったディレクトリを見に行くオプションがすべてimagesではないところだったのですが、手元で試したところimagesに変更しても動くことが分かりました。
python tools/compile.py model/yolox_nano_224.onnx yolox_nano_224_quant.kmodel --imgs_dir ./images/ --legacy --target k210
python tools/simulate.py yolox_nano_224_quant.kmodel ./images/dog.jpg
環境内でmatplotlibの表示機能が使えるのであれば、Sim結果としてこんな感じの画像が得られるはずです
Sim結果
実機実行の結果とは異なるので要注意

5.まとめ


今回はNNCase v1.7を使ってSimを実行してみました。変なことをしなければすんなり動くはずであり、K210の実機が無くても結果が確認できるのでお手軽に試せるかと思います。

n.おまけ


以前使っていたM5StickV+MaixPyの組み合わせではkmodelのv5に対応していなかったのですが、まさかのkendryteがMaixPyではない別のツールを作って対応しようとしていました。(boardのディレクトリにm5stick的なものがあったが、M5StickVで動くかどうかは不明)。
©2023 shts All Right Reserved.