2022年6月11日土曜日

Sipeed Lichee RV DockのYoctoでTensorFlow Lite v2.9

 目的


いつも参考にさせていただいているブログでRISC-V CPUのSipeed Lichee RV DockがYoctoで動くことを知った。


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)。

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があつくなるといいなぁ!!

2022年6月5日日曜日

2022.6.4の釣行

お昼に時間をもらってちょっとだけ。


おうちから10分で行ける渓流です。


う〜ん...


ボウズです。チェイスあったけどなぁ。


2022.6.3の釣行

 きょうは近くの本流に。


お昼ぐらいから雨が降ったり、⛈だったりとあまり良くない天気。


その分、朝方は活性がたかかったのかも。


ニジマス、ヤマメ。ヤマメは久々だな〜。


写真とるのヘタすぎ😇(防水じゃないのもあるんだけどね、、、)


流れの中からガバって出てくると楽しいよね。



全然わからん、、、