2022年2月5日土曜日

YoctoでTensorFlow Lite v2.8.0(Microchip PolarFire SoC Yocto BSP + meta-tensorflow-lite)

目的


meta-tensorflow-lite(python3-tensorflow-lite)でTensorFlow Lite v2.8.0のビルドにRISC-Vを対応する。
先日、v2.8.0がリリースされたので対応することと、こちらのissue(RISC-Vでビルドできない)であったBSPでビルド確認を行う。


Microchip PolarFire SoCって?


RISC-V CPU + FPGAのSoCのよう。
開発元はMicrochip Technology。

CPUはSiFive U54を5コア(セキュアブート用が1つとアプリケーション用が4コアとある)。
メモリはLPDDR4 2GB。

なお、私は実機を所持していない。
どれぐらいなんだろうとのぞいてみたら...リードタイム...

※2022年1月末のつぶやきなので最新の状況はチェックしてください。


環境&準備


ホスト環境および、事前にインストールするパッケージ等は前回のブログと同様。
の該当部分を参照。


リポジトリ


meta-tensorflow-liteおよび、Microchip PolarFire SoC Yocto BSPのリポジトリは以下。

meta-tensorflow-lite




meta-polarfire-soc-yocto-bsp




ビルド


さてここからはビルド。

Microchip PolarFire SoC Yocto BSPをClone、必要なリポジトリを取得する。
なお、このときのリビジョンは"02cb81741a5e1b37f89318d04ebc6b2854bfe736"である。
$ mkdir yocto-dev
$ cd yocto-dev
$ repo init -u https://github.com/polarfire-soc/meta-polarfire-soc-yocto-bsp.git -b master -m tools/manifests/riscv-yocto.xml
$ repo sync
$ repo rebase

meta-tensorflow-liteのCloneする。
v2.8.0対応のリビジョンでチェックアウトする。
$ git clone  https://github.com/NobuoTsukamoto/meta-tensorflow-lite.git
$ cd meta-tensorflow-lite/
$ git checkout b20bc554a30933a65648ee4557ebb48aacd4db54
$ cd ..

polarfire-soc_yocto_setup.shを実行(bitbake-layersやoe-init-build-envなど実行)。
$ . ./meta-polarfire-soc-yocto-bsp/polarfire-soc_yocto_setup.sh

meta-tensorflow-liteを追加する。
$ bitbake-layers add-layer ../meta-tensorflow-lite/

auto.confにpython3-tensorflow-liteを追加する。
$ vi conf/auto.conf
# 最終行に以下を追加
IMAGE_INSTALL:append = " python3-tensorflow-lite"

最後にbitbake!
MACHINE=qemuriscv64を指定するとエラーで怒られてしまう、、、
このため、実機向け(MACHINE=icicle-kit-es)でビルド。
$ MACHINE=icicle-kit-es bitbake mpfs-dev-cli
Loading cache: 100% |#########################################################################################################| Time: 0:00:00
Loaded 3774 entries from dependency cache.
Parsing recipes: 100% |#######################################################################################################| Time: 0:00:01
Parsing of 2437 .bb files complete (2434 cached, 3 parsed). 3777 targets, 169 skipped, 1 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies

Build Configuration:
BB_VERSION           = "1.52.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "universal"
TARGET_SYS           = "riscv64-oe-linux"
MACHINE              = "icicle-kit-es"
DISTRO               = "nodistro"
DISTRO_VERSION       = "nodistro.0"
TUNE_FEATURES        = "riscv64"
meta                 = "HEAD:63a235d86edb5ca628c8601ed06fb04da3186141"
meta-oe              
meta-python          
meta-multimedia      
meta-networking      = "HEAD:77718718cf0eec2c7119d101a353f343e2769b1b"
meta-riscv           = "HEAD:47faa008327abc388c52246b24a8a458b30b6f0d"
meta-polarfire-soc-yocto-bsp = "HEAD:02cb81741a5e1b37f89318d04ebc6b2854bfe736"
meta-tensorflow-lite = "HEAD:b20bc554a30933a65648ee4557ebb48aacd4db54"

Initialising tasks: 100% |####################################################################################################| Time: 0:00:05
Sstate summary: Wanted 1379 Local 0 Network 0 Missed 1379 Current 1506 (0% match, 52% complete)
NOTE: Executing Tasks
NOTE: Tasks Summary: Attempted 6955 tasks of which 4502 didn't need to be rerun and all succeeded.
NOTE: Writing buildhistory
NOTE: Writing buildhistory took: 110 seconds
NOTE: Build completion summary:
NOTE:   do_populate_sysroot: 0.0% sstate reuse(0 setscene, 106 scratch)
NOTE:   do_package_qa: 0.0% sstate reuse(0 setscene, 351 scratch)
NOTE:   do_package: 0.0% sstate reuse(0 setscene, 281 scratch)
NOTE:   do_packagedata: 0.0% sstate reuse(0 setscene, 285 scratch)
NOTE:   do_package_write_ipk: 0.0% sstate reuse(0 setscene, 351 scratch)

ビルド完了!!!(実機がないのでここまで)


その他

auto.conf、site.conf


前回のブログあたりからYoctoの設定ファイルにauto.confがあることを知った。
いままではlocal.confを変更・修正だけ。
auto.confに設定すれば上書きされるので、複数のビルドとかに便利。

と、つぶやいたところ、site.confもあるということを教えていただいた。
なんと!Interface誌でYocto関連の「MyオリジナルLinuxの作り方」を連載されていたかた!!
(ありがとうございます!!)

site.confはProxyなど共通の設定を記載できるよう。
たしかにこれは便利である。

Yoctoまだまだ知らないことがありすぎる...


ビルドエラーについて


MACHINE=qemuriscv64を指定してビルドすると以下のビルドエラーが発生する。
OpenSBIのレシピがないように見えるけど、、、
今回はここまで。
$ MACHINE=qemuriscv64 bitbake mpfs-dev-cli
Loading cache: 100% |                                                                                                        | ETA:  --:--:--
Loaded 0 entries from dependency cache.
WARNING: /work/yocto-dev/openembedded-core/meta/recipes-bsp/u-boot/u-boot_2021.07.bb: Unable to get checksum for u-boot SRC_URI entry .txt: file could not be found
WARNING: /work/yocto-dev/meta-polarfire-soc-yocto-bsp/recipes-bsp/hss/hss.bb: Unable to get checksum for hss SRC_URI entry ${HSS_PAYLOAD}.yaml: file could not be found
Parsing recipes: 100% |#######################################################################################################| Time: 0:00:30
Parsing of 2437 .bb files complete (0 cached, 2437 parsed). 3777 targets, 168 skipped, 1 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
ERROR: Nothing PROVIDES 'opensbi'. Close matches:
  opensc
  openssh
  openssl
ERROR: Required build target 'mpfs-dev-cli' has no buildable providers.
Missing or unbuildable dependency chain was: ['mpfs-dev-cli', 'opensbi']

Summary: There were 2 WARNING messages shown.
Summary: There were 2 ERROR messages shown, returning a non-zero exit code.

以上!

2022年2月3日木曜日

YoctoでTensorFlow Lite v2.7.0(SiFive Freedom Unleashed SDK + meta-tensorflow-lite)

目的


meta-tensorflow-lite(python3-tensorflow-lite)でTensorFlow Lite v2.7.0のビルドにRISC-Vを対応する。

TensorFlow Liteはv.2.7.0でビルドの方法が大きくかわった。レシピも対応したが、RISC-Vプラットフォーム向けのビルドが失敗していたので対応する。

Microchip PolarFire SoC Yocto BSPでビルドしようとしてエラーになったissueをもらったのが経緯。


(せっかく v2.4.1で対応していただいたのに壊していました...すいません...)


環境


まずは以下のBSPでビルドできるところまで確認(もともとmeta-tensorflow-liteのforkが組み込まれているため)。

なお、Microchip PolarFire SoC Yocto BSPのビルド環境はSiFive Freedom Unleashed SDKから派生している模様。

開発環境(ホスト)は以下。
  • Ubuntu 20.04

なお、実機のSoCは持っていないため、QEMUで行う。
  • qemuriscv64


準備


ホスト環境にYoctoでビルドする環境を構築する。
Yocto Project Mega-Manua - 3. Build Host Package」に加えていくつかのパッケージをイントールする。

$ apt-get install -y sudo gawk wget git diffstat unzip texinfo gcc build-essenn
tial chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutt
ils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev pylinn
t3 xterm python3-subunit mesa-common-dev vim locales zstd liblz4-tool pythoo
n curl


また、repoもインストール(公式のドキュメントだとパッケージインストールの手順があるのですが、なんでかインストールできなかったです...)。

$ mkdir ~/bin
$ curl https://storage.googleapis.com/git-repo-doo
wnloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
$ PATH="${HOME}/bin:${PATH}"


リポジトリ


meta-tensorflow-liteおよび、SiFive Freedom Unleashed SDKのリポジトリは以下。

なお、SiFive Freedom Unleashed SDKはmeta-tensorflow-liteのリンク、リビジョンを変更するためForkし、修正している。


meta-tensorflow-lite




SiFive Freedom Unleashed SDK



「2021.12.」ブランチをベースにmeta-tensorflow-liteのパス、リビジョンを修正している。


ビルド


上記のリポジトリをCloneする。
repoで関連するレシピやmeta-tensorflow-liteも含めてClone。

$ mkdir riscv-sifive
$ cd riscv-sifive
$ repo init -u git://github.com/NobuoTsukamoto/freedom-u-sdk -b 2021.12_tf-lite2.7 -m tools/manifests/sifive.xml
$ repo sync


ビルド環境のセットアップ。
setup.shを実行すれば、bitbake-layersやoe-init-build-envなど実行してくれる。

$ . ./freedom-u-sdk/setup.sh


あとはbitbake。qemuriscv64を指定。

$ MACHINE=qemuriscv64 bitbake demo-coreip-cli


動作確認


SiFive Freedom Unleashed SDKにはTensorFlow Liteの動作確認用のスクリプトが用意してある。bitbakeでビルドしたイメージにも組み込まれている。

QEMUを起動する。

$ MACHINE=qemuriscv64 runqemu nographic slirp
...
...
...
FreedomUSDK 2021.12.00 qemuriscv64 ttyS0

qemuriscv64 login: 

ログインユーザーはroot、パスワードはsifive
詳細は以下。

ログイン後、TensorFlow Liteのサンプルが格納されているディレクトリに移動、実行している。
# cd /usr/share/doc/python3-tensorflow-lite-demo/example
# python3 mnist.py

TensorFlow Lite v2.7.0で動いたーーーーーー!!!!




meta-tensorflow-liteの修正点


これは、v2.7.0でのレシピ修正の概要。忘れないようにメモ。


シンタックスの変更


いままで
    SRC_URI_append_riscv64
のように _(ハイフン)でシンタックスを記載していたが古い記載だったようだ。   

このため、新しいシンタックスに変更した。
  SRC_URI:append:riscv64


ダウンロードURLの変更


TensorFlow LiteのCMakeがCloneするthird partyリポジトリのURLを変更。
git cloneする際、"https://〜"のURLではダウンロードできない(Yoctoの仕組み)。
"git://〜"とする必要がある。


tensorflow/tensorflow/lite/tools/cmake/modules配下にあるcmakeのURLを変更してパッチとしておく。

ただ、gitlabからcloneするeigne、submoduleもcloneが必要なruyはもう一工夫が必要。
  • eigneはgitlabからはGit Fetcherでcloneができなかったため、リビジョン指定のアーカイブのダウンロード(curl経由)に変更。
  • ruyは現状有効としないため、本体だけcurl経由でリビジョン指定のアーカイブをダウンロードする。submoduleはダウンロードしない。
    aarch64はXNNPACKが有効、aarch32はruyは公式もOFFなので...(力技)

ただ、腑に落ちないのはmeta-raspberrypiでビルドするとき(poky)はダウンロードでエラーにならない...
なにが違うんだっけ???


libatomicの追加


リンクライブラリにlibatomicを追加する。
でないと、ビルドは成功するがtflite_runtimeのロード時にエラーが発生する。

/usr/lib/python3.10/site-packages/tflite_runtime/_pywrap_tensorflow_interpreter_wrapper.so: undefined symbol: __atomic_compare_exchange_1

RISC-Vプラットフォームではlibatomicを明示的にリンクしないとだめのようだ。
以前もパッチをもらっていたが、今回のCMakeの対応で漏れてしまった(すいません)。


simple_memory_arena_debug_dump.ccのコンパイルエラー対応


GCC11だと、ヘッダの変更に伴いコンパイルエラーが発生する。

error: 'numeric_limits' is not a member of 'std'

これはよく当たる問題。以下の対応を参考。
ヘッダを追加するパッチを作成。


DTFLITE_ENABLE_XNNPACKはOFF


google/XNNPACKのリポジトリにはサポートアーキテクチャに「RISC-V」がある。
なので、riscv64のビルド時にXNNPACK=ONでビルドしたところ、ビルドエラーとなってしまった。
v2.7の時点ではRISC-Vは対応していないリビジョンの模様。
(つぶやいたら中の人から反応があった!)



次回以降、riscv64でXNNPACK=ONとしてみる。


最後に


issueをきっかけにv2.7.0をRISC-Vで動作するところまで確認した。
やっぱり、実機で動かしてみたいよね。
とくにXNNPACK=ONにしたらどうなるのかね?