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にしたらどうなるのかね?

0 件のコメント:

コメントを投稿