目的
いつも参考にさせていただいているブログでRISC-V CPUのSipeed Lichee RV
DockがYoctoで動くことを知った。
はてなブログに投稿しました #はてなブログ
— みつきん (@yusuke_mitsuki) May 15, 2022
YoctoProject LICHEE RV DOCKを動かす - みつきんのメモ https://t.co/hKSSv5mxBU
meta-tensorflow-liteはいままでQEMUでしか動かしたことがなかった。
Sipeed Lichee RV
Dockは案外お安いというのもあり、一つ購入して実際に動かしてみたくなった。
購入したのは
-
Sipeed Lichee RV Dock Allwinner D1 Development Board RISC-V Linux Starter
Kit
without wifi 512M
イメージの作成
Yoctoでビルドする。
- BSPにはmeta-riscv、バージョンはkikstone。
- TensorFlow Liteのレシピにはmeta-tensorflow-lite。
- TensorFlow Liteのバージョンはv2.9。
- XNNPACK delegateしたいのでkirkstoneではなくて、mainブランチを使用。
- ほんとうはCROPSを使いたかったけど、Fedora 36のpodmanだとうまくいかなかった。
まずは、必要なリポジトリをclone。
$ git clone -b 2.0 https://github.com/openembedded/bitbake.git $ git clone -b kirkstone https://github.com/openembedded/openembedded-core.git $ git clone -b kirkstone https://github.com/openembedded/meta-openembedded.git $ git clone -b kirkstone https://github.com/riscv/meta-riscv.git $ git clone https://github.com/NobuoTsukamoto/meta-tensorflow-lite.git $ cd meta-tensorflow-lite $ git checkout a58e5f1efbf5de17580e1f9f65f70d76715003b2
oe-init-build-env
$ source openembedded-core/oe-init-build-env build
auto.confに必要な情報(MACHINEとIMAGE_INSTALL)を追加。
$ cat conf/auto.conf FORTRAN:forcevariable = ",fortran" MACHINE = "nezha-allwinner-d1" IMAGE_INSTALL:append = "\ python3-tensorflow-lite \ libtensorflow-lite \ python3-tensorflow-lite-example \ tensorflow-lite-label-image \ tensorflow-lite-minimal \ tensorflow-lite-benchmark \ "
後はbitbake!
$ bitbake core-image-full-cmdline ... Build Configuration: BB_VERSION = "2.0.0" BUILD_SYS = "x86_64-linux" NATIVELSBSTRING = "ubuntu-20.04" TARGET_SYS = "riscv64-oe-linux" MACHINE = "nezha-allwinner-d1" DISTRO = "nodistro" DISTRO_VERSION = "nodistro.0" TUNE_FEATURES = "riscv64" meta = "kirkstone:4eb0b7468383a1d0314b3bfd43ea37c95de464d9" meta-oe meta-python meta-networking meta-multimedia = "kirkstone:0b78362654262145415df8211052442823b9ec9b" meta-riscv = "kirkstone:70e099d7ceca52a1dde2c978713012f6b20a9891" meta-tensorflow-lite = "main:a58e5f1efbf5de17580e1f9f65f70d76715003b2"
出来上がったイメージ(tmp-glibc/deploy/images/nezha-allwinner-d1配下の*.wic.gz)をmicro
sdカードに書き込む。
USBシリアル変換ケーブルを接続して、起動してみる。
補足:FORTRANの追加
meta-tensorflow-liteのレシピでTensorFlow Lite
v2.9からビルド時にFortranコンパイラが必要となった模様。
おそらく、XNNPACKのビルドで必要。
YoctoではデフォルトでFortranコンパイラがないため、ビルドに失敗する。
このため、confに以下を追加する必要がある。
FORTRAN:forcevariable = ",fortran"
動作
起動した後、TensorFlow Liteが動作することを確認してみる。
meta-tensorflow-liteで追加できるサンプル・ツールは以下のとおり(kirkstone)。
- examples
-
python3-tensorflow-lite-example
TensorFlow Lite Python image classification demo -
tensorflow-lite-label-image
TensorFlow Lite C++ image classification demo -
tensorflow-lite-minimal
TensorFlow Lite C++ minimal example - tools
-
tensorflow-lite-benchmark
TFLite Model Benchmark Tool with C++ Binary
TensorFlow Lite C++ image classification
demo(label_image)のサンプルを動かしてみる。
# cd /usr/share/tensorflow/lite/examples/label_image/ # ./labe --tflite_model ./mobilenet_v1_1.0_224.tflite \ --labels ./labels.txt \ --image ./grace_hopper.bmp \ --xnnpack_delegate 1 \ --threads 1 INFO: Loaded model ./mobilenet_v1_1.0_224.tflite INFO: resolved reporter INFO: Created TensorFlow Lite XNNPACK delegate for CPU. XNNPACK delegate created. INFO: Applied XNNPACK delegate. INFO: invoked INFO: average time: 3214.8 ms INFO: 0.860175: 653 653:military uniform INFO: 0.0481016: 907 907:Windsor tie INFO: 0.00786705: 466 466:bulletproof vest INFO: 0.00644932: 514 514:cornet, horn, trumpet, trump INFO: 0.0060802: 543 543:drumstick
XNNPACK delegateしていることを確認。
なお、label_imageにはxnnpack_delegateの引数を指定するとAbortする問題がある。
このため、レシピでパッチをあてて修正している。
ベンチマーク
さて、Sipeed Lichee RV DockのRISC-V
CPUで画像分類モデルのベンチマーク(推論処理時間)をやってみる。
MobileNet V1、V2、V3 Small、V3 Largeでどの程度なのかを確認する。
ベンチマークはTFLite Model Benchmark Tool with C++
Binary(benchmark_model)を使用。
詳細の結果は以下のリポジトリにアップ。
CPUの情報を確認。
# cat /proc/cpuinfo processor : 0 hart : 0 isa : rv64imafdc mmu : sv39 uarch : thead,c906
ベンチマークの結果:Inference (avg) 、単位はms。
まあ、CPUのスペックもあるし、最適化もこれからと思う(INT8は全然最適化されていなさそう?)。
Model name | Input | Kind |
Lichee RV Dock XNNPACK delegate |
---|---|---|---|
Mobilenet V1 dm=1.0 | 224x224 | FP32 | 2874.29 |
INT8 | 10091.20 | ||
Mobilenet V2 dm=1.0 | 224x224 | FP32 | 978.40 |
INT8 | 6210.03 | ||
Mobilenet V3 Large dm=1.0 | 224x224 | FP32 | 754.20 |
INT8 | 4853.66 | ||
Mobilenet V3 Small dm=1.0 | 224x224 | FP32 | 241.70 |
INT8 | 1444.20 |
最後に
はじめて、RISC-V の実機でTensorFlow Liteを動かしてみた。
きっとRISC-V
CPUベースのSoCだと、きっと、GPUやアクセラレーターを使う方が主流になるはず?CPUで推論はメインではないとは思うのだけど、かなりおもしろかった。
処理時間はラズパイなどとは比べようもないのだけど、はじめてラズパイでTensorFlow
Liteを動かした時のような感覚をおもいだした気がする。
これからもRISC-Vがあつくなるといいなぁ!!