目的
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で動いたーーーーーー!!!!
いったーーーーーーーーーーーー!!!!!!!
— nb.o (@Nextremer_nb_o) January 30, 2022
SiFive Freedom Unleashed SDK + meta-tensorflow-lite v2.7
qemuriscv64でtensorflow-lite v2.7がうごいたー
ながかったーーーーーー
(freedom-u-sdkにあるexampleがうごいた) pic.twitter.com/feNQyHCipq
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 cloneする際、"https://〜"のURLではダウンロードできない(Yoctoの仕組み)。
"git://〜"とする必要がある。
tensorflow/tensorflow/lite/tools/cmake/modules配下にあるcmakeのURLを変更してパッチとしておく。
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は対応していないリビジョンの模様。
(つぶやいたら中の人から反応があった!)
Upstream XNNPACK supports RISC-V, the version in TFLite 2.7 most likely doesn't
— Marat Dukhan (@MaratDukhan) January 29, 2022
次回以降、riscv64でXNNPACK=ONとしてみる。
最後に
issueをきっかけにv2.7.0をRISC-Vで動作するところまで確認した。
やっぱり、実機で動かしてみたいよね。
とくにXNNPACK=ONにしたらどうなるのかね?
0 件のコメント:
コメントを投稿