ラベル yocto の投稿を表示しています。 すべての投稿を表示
ラベル yocto の投稿を表示しています。 すべての投稿を表示

2022年7月10日日曜日

YoctoでGoogle CoralのEdgeTPU

 目的


今更ながらGoogle Coralのライブラリgoogle-coral/libedgetpuがbazelでなくてもビルドできることを知った。


なので、これをYoctoのレシピ化して見ることにした。


libedgetpuのレシピ


TensorFlow Liteをレシピ化しているmeta-tensorflow-liteに追加。


レシピ化するときにつまづいた点


すべてではないが、レシピかするときにつまずいた点、ちょっとだけ工夫した点を列挙。


ビルドのワーキングディレクトリの指定

今回、Makefileベースのレシピで作成したが、Makefileはトップディレクトリにない。
このため、${B}でMakefileがあるディレクトリを指定が必要。
ただ、Yoctoのドキュメントには

とあり、タスク[dirs]で指定して、${B}は有効でないとある。

しかしながら、タスク[dirs]で指定してもワークディレクトリは変更されなかった。。。
base.bbclassで上書き${B}で上書きされているので、${B}は必要なんじゃないのかな?
わたしの指定方法がまちがっているかもしれないが。。。


abseil-cppの必要なリンクするライブラリの不足


libedgetpuはabseil-cppのライブラリをいくつかリンクする。
Yoctoのkirkstoneにあるabseil-cppのバージョン( 20211102.0+gitX)はlibedgepuのGrouper(2021.7.27リリース)より新しい。
これが影響してか、ライブラリのリンクに不足(undefined symbol)が発生、パッチで修正した。

また、当初、Yoctoではなく、x86のubuntu22.04上でビルドしてリンク不足の修正を確認していた。その中でabseil-cppをソースビルド&スタティックリンクライブラリ(*.a)をリンクしたところ、undefined symbolが解消できないことがわかった(スタティックリンクだとabseeil-cppの一部がビルドされない?)。
Yoctoのabseil-cppのレシピは共有ライブラリ(*.so)を生成するオプションのため問題はなかったが、この違いによってハマってしまった。

libedgetpuのリポジトリにも同じようなissueがあり、解決できていなかったようなのでコメントしてみた。

gold リンカーを指定するとリンクエラー(risc-v)


RISC-V(meta-riscv)ターゲット向けにビルド時、goldリンカーはないとのエラーが発生する。
libedgetpuのMakefileでは -fuse-ld=gold が指定されている。
ARMターゲット(meta-raspberrypi)ではエラーにならないので、クロスコンパイラの違いが原因と思われる。
なので、Makefileから指定を削除した。



TensorFlow v2.9への対応


もともと、libedgetpuはTensorFlow v2.5のころのソースを一部利用している。
このなかでもcommon.cはC言語のソースだった。

TensorFlow v2.9では、common.cはcommon.ccに変更になっている。

これにあわせて、Makefileを修正している。


xxd: command not foundの解決


edgetpuのfirmwareをビルドする際にxxd(16進数のダンプコマンド)をつかっている。
このxxdコマンド、Yoctoでどのレシピを追加すればよいのかよくわからなかった、、、
OpenEmbedded Layer Indexをつかって検索してもよくわからず、、、

最終的にvim-nativeのレシピ(openembedded-core )を追加することで解決した。
(いつも使うコマンドがどんなパッケージにあるか?ってあまり意識しない時もある。こういうケースでは検索がなかなか大変。。。)


libedgetpu-maxとlibedgetpu-std


libedgetpuには動作周波数を変更する二つのライブラリが存在する。

この2つをレシピ化することにした。
方針としては以下にした。
  • レシピはlibedgetpu-std、libedgetpu-maxとする。
  • 共通部分をcommon.incに切り出して、EXTRA_OEMAKEに指定するフラグとインストールパス(do_install)を定義
  • お互いのレシピは同時に指定されたくないので、RCONFLICTSでコンフリクトするように指定。


ターゲットのBSP


今回は2つのBSPで動作させてみた。

Sipeed Lichee RV Dock向けについては、前回のブログを参照。
meta-riscvからforkしたリポジトリをつかう。

なお、Sipeed Lichee RV Dock向けについては、後述のとおり物体検出やセグメンテーションのモデルはうまく動いていない、、、


イメージの作成


いつもどおり、bitbakeしてみる。
Yoctoのバージョンはkirkstone。


Raspberry Pi 4


まずは、必要なリポジトリをclone。
$ git clone -b kirkstone git://git.yoctoproject.org/poky.git
$ git clone -b kirkstone git://git.yoctoproject.org/meta-raspberrypi
$ git clone -b kirkstone git://git.openembedded.org/meta-openembedded
$ git clone https://github.com/NobuoTsukamoto/meta-tensorflow-lite.git
$ source poky/oe-init-build-env rpi-build

$ bitbake-layers add-layer ../meta-openembedded/meta-oe/
$ bitbake-layers add-layer ../meta-openembedded/meta-python/
$ bitbake-layers add-layer ../meta-openembedded/meta-networking/
$ bitbake-layers add-layer ../meta-openembedded/meta-multimedia/
$ bitbake-layers add-layer ../meta-raspberrypi/
$ bitbake-layers add-layer ../meta-tensorflow-lite/

conf/auto.confに必要なパッケージを追加。
FORTRAN:forcevariable = ",fortran"
MACHINE ?= "raspberrypi4-64"
IMAGE_INSTALL:append = " \
  python3-tensorflow-lite \
  libedgetpu-max \
  opencv \
"
VIDEO_CAMERA = "1"

bitbake。
$ bitbake core-image-weston
...
Build Configuration:
BB_VERSION           = "2.0.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "universal"
TARGET_SYS           = "aarch64-poky-linux"
MACHINE              = "raspberrypi4-64"
DISTRO               = "poky"
DISTRO_VERSION       = "4.0.1"
TUNE_FEATURES        = "aarch64 armv8a crc cortexa72"
TARGET_FPU           = ""
meta                 
meta-poky            
meta-yocto-bsp       = "kirkstone:4aeda14352a9fa9dd5ba50cf940a2b514fd1ac3c"
meta-oe              
meta-python          
meta-networking      
meta-multimedia      = "kirkstone:fcc7d7eae82be4c180f2e8fa3db90a8ab3be07b7"
meta-raspberrypi     = "kirkstone:0135a02ea577bd39dd552236ead2c5894d89da1d"
meta-tensorflow-lite = "main:4299e649292a9471732e1fff2dc0eb776aba68f5"
...

イメージをSDカードに書き込む。


Sipeed Lichee RV Dock


こちらも同様に必要なリポジトリをclone。
$ git clone -b kirkstone git://git.yoctoproject.org/poky.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_licheerv https://NobuoTsukamoto/riscv/meta-riscv.git
$ git clone https://github.com/NobuoTsukamoto/meta-tensorflow-lite.git
$ source poky/oe-init-build-env licheerv-build

$ bitbake-layers add-layer ../meta-openembedded/meta-oe/
$ bitbake-layers add-layer ../meta-openembedded/meta-python/
$ bitbake-layers add-layer ../meta-openembedded/meta-networking/
$ bitbake-layers add-layer ../meta-openembedded/meta-multimedia/
$ bitbake-layers add-layer ../meta-riscv/
$ bitbake-layers add-layer ../meta-tensorflow-lite/

conf/auto.confに必要なパッケージ・オプションを追加。
FORTRAN:forcevariable = ",fortran"
MACHINE ?= "licheerv"
IMAGE_INSTALL:append = " \
  python3-tensorflow-lite \
  libedgetpu-std \
  opencv \
"

bitbake。
$ bitbake core-image-minimal
...
Build Configuration:
BB_VERSION           = "2.0.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "universal"
TARGET_SYS           = "riscv64-poky-linux"
MACHINE              = "licheerv"
DISTRO               = "poky"
DISTRO_VERSION       = "4.0.1"
TUNE_FEATURES        = "riscv64"
meta                 
meta-poky            
meta-yocto-bsp       = "kirkstone:4aeda14352a9fa9dd5ba50cf940a2b514fd1ac3c"
meta-oe              
meta-python          
meta-networking      
meta-multimedia      = "kirkstone:fcc7d7eae82be4c180f2e8fa3db90a8ab3be07b7"
meta-riscv           = "kirkstone_licheerv:9083c701acede92b2378eb3f0df77fefb8ae29a0"
meta-tensorflow-lite = "main:4299e649292a9471732e1fff2dc0eb776aba68f5"
...

イメージを書き込む。


動作確認


こちらのPythonスクリプトを使っての動作確認。
(レシピ化していないのでSDカードに直接コードとモデルをコピーした)


Raspberry Pi 4


ラズパイ向けでは正常に動作するようだ。


Sipeed Lichee RV Dock


Lichee RV Dockの場合、
  • USBの電力供給の関係で動作しないので、電源供給つきのUSB-HUBが必要。
    device descriptor read/64, error -71 が発生した場合は、電力の不足を疑う。
    (libedgetpu-stdの場合はHUBがなくてもいけるかもしれない)
  • 画像分類モデルはうまく動きそうだが、物体検出やセマンティクス・セグメンテーションのモデルはうまく動作しない。。。
    • 物体検出は結果がすべてNG。
    • セマンティクス・セグメンテーションはポツポツと点のように結果がおかしい。

2つ目の事象は現時点では解決できていない。。。
(なんだかUSBの通信の関係の気がするが、、、)
RISC-V特有でない気もしている。






最後に


ちょっと遅くなったけど、libedgetpuをYoctoのレシピにしてみた。
ラズパイ向けはうまく動いたが、LICHEE RV DOCK向けはおかしい部分がある。

RISC-VのSBCで動けば、おもしろくなってくると思う。
EdgeTPUに限らず、RISC-V+アクセラレーターの構成がEdge AIとしてはありえるんじゃないかな?

2022年7月9日土曜日

YoctoでSipeed Lichee RV Dock

 目的


前回のブログではYoctoのmeta-riscvとmeta-tensorflow-liteをつかって、Sipeed Lichee RV DockでOSイメージのビルドとTensorFlow-Liteの動作確認を行った。
ただし、meta-riscvにLichee RV Dock向けの対応(DTSなど)がないためUSBは使えない。

今回は、meta-riscvをforkしてU-Bootやカーネルなどを追加してLichee RV Dock向けBSPを作成して、USBが動作するところまで確認する。


参照


もともと、meta-riscvにはnezha allwinner d1の対応が含まれている。
Yocto Project Summit 2022.05で詳細が発表されていた模様。

これをもとにlinux-sunxiの情報と、 Archlinux Image Builderの情報をもとにBSPを作成してみる。


レシピ(BSP)の作成


meta-riscvをforkして作成。

ブランチは「kirkstone_licheerv」。

コミットはこちら。

おおきくわけて
  • machine configuration
  • boot0
  • opensbi
  • u-boot
  • linux kernel
  • wis
のレシピを変更・追加している。


machine configuration


machine/nezha-allwinner-d1.conf を参考にLichee RV 向けに変更している。

machineは「licheerv」。


boot0


nezha-allwinner-d1向けのレシピに対して修正。
COMPATIBLE_MACHINEに「licheerv」を追加している。


OpenSBI


OpenSBIもnezha-allwinner-d1と同様のであるため、レシピにlicheerv向けの追加を行っているのみ。


U-Boot


こちらはlicheerv向けに作成。

U-Bootのコードはsmaeul/u-bootを利用(ブランチは「d1-wip」)。
他、uEnvやtoc.cfgはnezha-allwinner-d1と同じものを利用。


Linux kernel


こちらもsmaeul/linuxを利用(ブランチは「riscv/d1-wip」)。
defconfigはsehraf/riscv-arch-image-builderのものを利用した(スクリプトから生成)。


wis


nezha-allwinner-d1と同じものを利用。
ただし、いつも参考にしているブログにあるとおりnezha-allwinner-d1のwisではイメージのサイズが大きい(約14GB)。

なので、今回はイメージサイズを約8GB程度にした。

--fixed-size 8000の部分。


イメージ作成(Bitbake)


core-image-minimalでbitbakeしてみる。
まずは、必要なリポジトリをclone。
$ git clone -b kirkstone git://git.yoctoproject.org/poky.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_licheerv https://NobuoTsukamoto/riscv/meta-riscv.git
$ source poky/oe-init-build-env licheerv-build

$ bitbake-layers add-layer ../meta-openembedded/meta-oe/
$ bitbake-layers add-layer ../meta-openembedded/meta-python/
$ bitbake-layers add-layer ../meta-openembedded/meta-networking/
$ bitbake-layers add-layer ../meta-openembedded/meta-multimedia/
$ bitbake-layers add-layer ../meta-riscv/

あとは、bitbake。
MACHINE=licheerv bitbake core-image-minimal

成功したら、*.wic.gzファイルをSDカードに書き込んでブートさせてみる。


動作確認




core-image-westonもやってみる


bitbakeでcore-image-westonをビルドして動かしてみた。



最後に


今回はRISC-V SBCのSipeed Lichee RV Dock向けのBSPをmeta-riscvのnezha-allwinner-d1を参考にやってみた。


2022年5月7日土曜日

meta-tensorflow-liteをyocto kirkstoneに対応するときにつまずいた点

 目的


meta-tensorflow-liteをkikstoneに対応した際に行ったこと、つまずいたことを記録する。
また、今回もtiwtterでかなりアドバイスをいただいた。感謝。



meta-tensorflow-liteの対応


kikstoneはyoctoのメジャーバージョンがアップし、4.0になった。

かなり変更があり、自分のレシピにもかなりの影響があった。
  1. SRC_URIのgit url指定の変更
  2. SRCREVにコミットIDを指定
  3. do_fetch以外でのダウンロードの抑制
  4. CMAKE_SYSTEM_PROCESSORの制御を変更

なお、kirkstoneに対応したmeta-tensorflow-liteは以下で公開した。




SRC_URIのgit url指定の変更


SRC_URIにgit を指定している場合、
  • プロトコル(protocol=???)
  • ブランチ(branch=???)
を必ず指定することになった。
meta-tensorflow-liteはhonisterからどちらも指定していたので問題はなかった。

変換用のスクリプトも用意されている。
また、レシピの命名規則などを変換するスクリプト(convert-xxxxxxxx.py)も用意されている。これらは事前にかけておいた方がよい。
(いくつかoverride syntaxの"_"を":"に変更する必要があった箇所があった)


SRCREVのコミットIDの指定


honisterまでのレシピでbitbakeすると以下のエラーが発生した。

ERROR: python3-tensorflow-lite-2.8.0-r0 do_fetch: Bitbake Fetcher Error: FetchError("Recipe uses a floating tag/branch without a fixed SRCREV yet doesn't call bb.fetch2.get_srcrev() (use SRCPV in PV for OE).", None)

どうやら、kirkstoneではSRCREVにタグ名の指定はNGの模様。
コミットIDを指定する必要があった。リリースノートには記載が見当たらず、、、(もしかしたら見逃しているだけかも)

honisterまでのレシピは、以前にissueでいただいたやり方で${PV}をつかった自動化でもあった(レシピのファイル名のバージョンをあげるだけでよい)

次回以降はTensorFlowのバージョンアップの際にコミットIDの変更が必要になった...


do_fetch以外でモジュールをダウンロードする対応


これは影響の大きかった変更点。yocto 4.0のリリースノートにも記載がある。

TensorFlow LiteはCMakeのconfigureでサブモジュールをダウンロードするため、大きく影響を受けた。
どうすればよいのか悩んでいたところ、twitterでアドバイスをうけた(ほんとうにありがとうございます)。

Kirkstoneからはdo_fetch以外でダウンロードを行う場合は、該当タスクにフラグをたてる必要があるとのこと。
ただ、フラグをたてても状況が変わらずだった(サブモジュールのダウンロードができない)。
何が違うのか?ミニマムなサンプルを作成して事象を再現させて確認。

原因は、TensorFLow LiteのCMakeでExternalProject_Addではなく、FetchContent_Declare、FetchContent_PopulateなどのFetchContentを使用していることが原因だった。

cmake.bbclassでCMAKEのオプションにオプションにFETCHCONTENT_FULLY_DISCONNECTEDが追加されていた(kirkstoneより)。
FETCHCONTENT_FULLY_DISCONNECTEDオプションはFetchContentのダウンロードを抑制するオプションとのこと(知らなかった!)。
このFETCHCONTENT_FULLY_DISCONNECTEDはExternalProject_Addに影響しない模様。
これが動作の違いになっていた。

このため、レシピにはEXTRA_OECMAKEでFETCHCONTENT_FULLY_DISCONNECTEDを変更&do_configureでネットワークからのダウンロードを有効にするようにした。

EXTRA_OECMAKE:append = " -DFETCHCONTENT_FULLY_DISCONNECTED=OFF"
do_configure[network] = "1"


CMAKE_SYSTEM_PROCESSORの指定方法の変更


上記のレシピ修正でなんとかaarch64やriscv向けのターゲットでビルドできるようになった。
しかしながら、armv6やarmv7向けのビルドが失敗する。

レシピでHOST_ARCHを変更していたことが原因の模様(honisterまでは問題なかったが、kirkstoneではエラーとなってしまった)。

HOST_ARCHを設定していた理由は、cmake.bbclassのCMAKE_SYSTEM_PROCESSORオプションを制御したかったため。

TensorFlow Liteのサブモジュールでpytorch/cpuinfoはCMakeのCMAKE_SYSTEM_PROCESSORオプションを意識する。
このため、TensorFlow LiteのCMakeビルドの際にオプションを指定している。
具体的には、初代ラズパイ、ラズパイ0は"armv6"、その他ラズパイ32bitは"armv7"を期待している。

yoctoのcmake.bbclassでは、CMAKE_SYSTEM_PROCESSORオプションにHOST_OS(TARGET_OS)を指定している。
meta-raspberrypiでビルドする際、"raspberrypi"や"raspberrypi4"などのarm 32bitの場合、HOST_OS(TARGET_OS)には"arm"が設定されるため、TensorFlow Liteのビルドが失敗する。
このため、TARGET_OSをレシピより"armv6"や"armv7"など期待する値に上書きすることで対応していた。

kirkstoneからはこのやり方がエラーとなってしまうため、TARGET_OSは変更せず、TensorFlow LiteのCMakeLists.txtにパッチを当ててCMAKE_SYSTEM_PROCESSORオプションを設定するように変更した。
(EXTRA_OECMAKEで"-DCMAKE_SYSTEM_PROCESSORを指定してもうまくいかなかった)


最後に


今回もかなり助けられて対応することができた。ほんとに感謝。

まだ、Raspberry Piで動作確認できない(core-image-westonでブート時にディスプレイが表示されない)やTensorFlow Lite v2.9のリリースも近いのでまだまだ確認&対応していく予定。

2022年3月6日日曜日

meta-riscvでTensorFlow Lite(Yocto)

目的


meta-tensorflowliteをv2.8対応+公式サンプルとベンチマークツールのレシピを追加した。
これを使ってmeta-riscvでbitbakeする。qemuriscv64でTensorFlow Liteのサンプル、ベンチマークツールを動作させてみる。


meta-tensorflowliteの対応


meta-tensorflowliteのリポジトリは以下。

今回、TensorFlow Lite v2.8の対応を含めてレシピの整理・追加を行った。
  • ブランチをYoctoバージョンと合わせて管理。
    • 今後はTensorFlow Liteのバージョンもブランチで固定。
  • Python3 interpreterのレシピのv2.8対応。
    • RISC-Vのビルドは以前から対応済み。
  • C++ API shared library(libtensorflowflow-lite)のレシピのv2.8対応。
    • レシピ名をcpp-tensorflow-liteからlibtensorflow-liteに変更。
    • インストール時、ヘッダファイルの不足があったので修正。
  • TensorFlowのリポジトリにあるPython、C++のサンプルをレシピ化&簡単なドキュメントを整理。
    (リンクはmeta-tensorflow-liteのドキュメントのリンク)
  • 同じように、ベンチマークツール(benchmark_model)もレシピ化。
  • GitHub Actionsを導入して、コードの変更&週一でのビルドのCIを導入。


リポジトリのClone


さて、ここからは実際にビルドしてみる。まずは必要なリポジトリをclone。
  • Yoctoのバージョンはhonisterとする。
  • meta-tensorflow-liteはcommit idを指定(このあとkirkstoneに移行予定)。
$ git clone -b 1.52 https://github.com/openembedded/bitbake.git
$ git clone -b honister https://github.com/openembedded/openembedded-core.git
$ git clone -b honister https://github.com/openembedded/meta-openembedded.git
$ git clone -b honister https://github.com/riscv/meta-riscv.git
$ git clone https://github.com/NobuoTsukamoto/meta-tensorflow-lite.git
$ cd meta-tensorflow-lite
$ git checkout eae1cb93a12fcb1ade71197b99111c2f02f515ef
$ cd ..


ビルド環境の設定


ここではmeta-riscvのsetup.shを実行する。
$ . ./meta-riscv/setup.sh

その後、meta-tensorflow-liteを追加。
$ bitbake-layers add-layer ../meta-tensorflow-lite/

conf/auto.confを編集。2行追加する。
  • USER_CLASSES:remove = "image-prelink" を指定しないとbitbakeでエラーとなる。
    これは、setup.shで追加されちゃうので...
  • IMAGE_INSTALL:appendでtensorflow-liteのレシピを追加。
USER_CLASSES:remove = "image-prelink"
IMAGE_INSTALL:append = " python3-tensorflow-lite \
 libtensorflow-lite \
 python3-tensorflow-lite-example \
 tensorflow-lite-label-image \
 tensorflow-lite-minimal \
 tensorflow-lite-benchmark"

bitbake


bitbake!!!!!!
$ MACHINE=qemuriscv64 bitbake core-image-full-cmdline

このときの結果はこんな感じ。
$ MACHINE=qemuriscv64 bitbake core-image-full-cmdline
Loading cache: 100% |                                                                                                                                                                                                        | ETA:  --:--:--
Loaded 0 entries from dependency cache.
Parsing recipes: 100% |#######################################################################################################################################################################################################| Time: 0:00:36
Parsing of 2428 .bb files complete (0 cached, 2428 parsed). 3767 targets, 165 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies

Build Configuration:
BB_VERSION           = "1.52.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "fedora-35"
TARGET_SYS           = "riscv64-oe-linux"
MACHINE              = "qemuriscv64"
DISTRO               = "nodistro"
DISTRO_VERSION       = "nodistro.0"
TUNE_FEATURES        = "riscv64"
meta                 = "honister:eeae63c343c8ebd418679915ee20aa8c02fa0fdc"
meta-oe              
meta-python          
meta-multimedia      
meta-networking      = "honister:0fb490a08ce30b47a5ccd2fdc3448b08e0d9e4e9"
meta-riscv           = "honister:9561639c61663a10d8c9c23d26173db499f4c39b"
meta-tensorflow-lite = "main:eae1cb93a12fcb1ade71197b99111c2f02f515ef"

NOTE: Fetching uninative binary shim http://downloads.yoctoproject.org/releases/uninative/3.5/x86_64-nativesdk-libc-3.5.tar.xz;sha256sum=e8047a5748e6f266165da141eb6d08b23674f30e477b0e5505b6403d50fbc4b2 (will check PREMIRRORS first)
Initialising tasks: 100% |####################################################################################################################################################################################################| Time: 0:00:05
Sstate summary: Wanted 1403 Local 0 Network 0 Missed 1403 Current 0 (0% match, 0% complete)
NOTE: Executing Tasks
WARNING: mtools-native-4.0.35-r0 do_fetch: Failed to fetch URL https://ftp.gnu.org/gnu/mtools/mtools-4.0.35.tar.bz2, attempting MIRRORS if available
NOTE: Tasks Summary: Attempted 4090 tasks of which 0 didn't need to be rerun and all succeeded.
NOTE: Writing buildhistory
NOTE: Writing buildhistory took: 79 seconds
NOTE: Build completion summary:
NOTE:   do_populate_sysroot: 0.0% sstate reuse(0 setscene, 267 scratch)
NOTE:   do_package_qa: 0.0% sstate reuse(0 setscene, 192 scratch)
NOTE:   do_package: 0.0% sstate reuse(0 setscene, 192 scratch)
NOTE:   do_packagedata: 0.0% sstate reuse(0 setscene, 192 scratch)
NOTE:   do_package_write_ipk: 0.0% sstate reuse(0 setscene, 192 scratch)
NOTE:   do_populate_lic: 0.0% sstate reuse(0 setscene, 360 scratch)

Summary: There was 1 WARNING message shown.


QEMUの実行


qemuを実行。
$ MACHINE=qemuriscv64 runqemu nographic

qemuriscv64が動いた!
OpenSBI v0.9
   ____                    _____ ____ _____
  / __ \                  / ____|  _ \_   _|
 | |  | |_ __   ___ _ __ | (___ | |_) || |
 | |  | | '_ \ / _ \ '_ \ \___ \|  _ < | |
 | |__| | |_) |  __/ | | |____) | |_) || |_
  \____/| .__/ \___|_| |_|_____/|____/_____|
        | |
        |_|

Platform Name             : riscv-virtio,qemu
Platform Features         : timer,mfdeleg
Platform HART Count       : 4
Firmware Base             : 0x80000000
Firmware Size             : 124 KB
Runtime SBI Version       : 0.2

Domain0 Name              : root
Domain0 Boot HART         : 0
Domain0 HARTs             : 0*,1*,2*,3*
Domain0 Region00          : 0x0000000080000000-0x000000008001ffff ()
Domain0 Region01          : 0x0000000000000000-0xffffffffffffffff (R,W,X)
Domain0 Next Address      : 0x0000000080200000
Domain0 Next Arg1         : 0x0000000082200000
Domain0 Next Mode         : S-mode
Domain0 SysReset          : yes

Boot HART ID              : 0
Boot HART Domain          : root
Boot HART ISA             : rv64imafdcsu
Boot HART Features        : scounteren,mcounteren,time
Boot HART PMP Count       : 16
Boot HART PMP Granularity : 4
Boot HART PMP Address Bits: 54
Boot HART MHPM Count      : 0
Boot HART MHPM Count      : 0
Boot HART MIDELEG         : 0x0000000000000222
Boot HART MEDELEG         : 0x000000000000b109
[    0.000000] Linux version 5.14.21-yocto-standard (oe-user@oe-host) (riscv64-oe-linux-gcc (GCC) 11.2.0, GNU ld (GNU Binutils) 2.37.20210721) #1 SMP PREEMPT Wed Mar 2 12:59:31 UTC 2022
[    0.000000] OF: fdt: Ignoring memory range 0x80000000 - 0x80200000
[    0.000000] Machine model: riscv-virtio,qemu
[    0.000000] Memory limited to 256MB
[    0.000000] efi: UEFI not found.
[    0.000000] Zone ranges:
[    0.000000]   DMA32    [mem 0x0000000080200000-0x000000008fffffff]
[    0.000000]   Normal   empty
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000080200000-0x000000008fffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000080200000-0x000000008fffffff]
[    0.000000] SBI specification v0.2 detected
[    0.000000] SBI implementation ID=0x1 Version=0x9
[    0.000000] SBI TIME extension detected
[    0.000000] SBI IPI extension detected
[    0.000000] SBI RFENCE extension detected
[    0.000000] SBI v0.2 HSM extension detected
[    0.000000] riscv: ISA extensions acdfimsu
[    0.000000] riscv: ELF capabilities acdfim

rootでログイン。
OpenEmbedded nodistro.0 qemuriscv64 ttyS0

qemuriscv64 login: root
root@qemuriscv64:~# 


TensorFlow Liteのサンプル&ツールの実行


実際にビルドしたTensorFlow Liteのサンプル&ツールを実行する。


python3-tensorflow-lite-example


Pythonのサンプル(label_image.py)。
TensorFlow Liteで動作するようにimportするパッケージ名を修正している。
テスト用のモデル、画像も公式と同じもの(mobilenet_v1_1.0_224.tflite & grace_hopper.bmp)をインストールするようレシピ化している。
# cd /usr/share/tensorflow/lite/examples/python/
# python3 label_image.py \
   --image ./grace_hopper.bmp \
   --model_file ./mobilenet_v1_1.0_224.tflite \
   --label_file ./labels.txt

しばらくすると、結果が出力される。
0.919720: 653:military uniform
0.017762: 907:Windsor tie
0.007507: 668:mortarboard
0.005419: 466:bulletproof vest
0.003828: 458:bow tie, bow-tie, bowtie
time: 4925.118ms

Top1スコアは公式結果と同様の「military uniform」。
(スコアの値が違うのは...XNNPACKと何か違うんだっけ?)


tensorflow-lite-label-image


C++のサンプル(label_image)。
こちらはlibtensorflow-liteのレシピでビルドした共有ライブラリ(libtensorflow-lite.so)をリンクするように変更。
テスト用のモデル、画像も公式と同じものを用意。
# cd /usr/share/tensorflow/lite/examples/label_image/
# ./label_image \
   --tflite_model ./mobilenet_v1_1.0_224.tflite \
   --labels ./labels.txt \
   --image ./grace_hopper.bmp 

こちらもしばらくすると結果が表示される。
INFO: Loaded model ./mobilenet_v1_1.0_224.tflite
INFO: resolved reporter
INFO: invoked
INFO: average time: 2973.11 ms
INFO: 0.860174: 653 653:military uniform
INFO: 0.0481021: 907 907:Windsor tie
INFO: 0.00786705: 466 466:bulletproof vest
INFO: 0.00644936: 514 514:cornet, horn, trumpet, trump
INFO: 0.00608029: 543 543:drumstick

スコアは一応、公式と一致。


tensorflow-lite-minimal


こちらもC++のサンプル(minimal)。
tensorflow-lite-label-imageと同じ。
# cd /usr/share/tensorflow/lite/examples/minimal/
# ./minimal ./mobilenet_v1_1.0_224.tflite

結果の表示(出力が多いので一部割愛)。
=== Pre-invoke Interpreter State ===
Interpreter has 1 subgraphs.

-----------Subgraph-0 has 103 tensors and 31 nodes------------
1 Inputs: [87] -> 602112B (0.57MB)
1 Outputs: [86] -> 4004B (0.00MB)

Tensor  ID Name                      Type            AllocType          Size (Bytes/MB)    Shape      MemAddr-Offset  
Tensor   0 MobilenetV1/Conv2d_0/w... kTfLiteFloat32  kTfLiteMmapRo      3456     / 0.00 [32,3,3,3] [16842720, 16846176)
Tensor   1 MobilenetV1/Conv2d_10_... kTfLiteFloat32  kTfLiteMmapRo      18432    / 0.02 [1,3,3,512] [6423008, 6441440)
Tensor   2 MobilenetV1/Conv2d_10_... kTfLiteFloat32  kTfLiteMmapRo      1048576  / 1.00 [512,1,1,512] [10624920, 11673496)

...

Execution plan as the list of 31 nodes invoked in-order: [0-30]
--------------Subgraph-0 dump has completed--------------


tensorflow-lite-benchmark


ベンチマークツールのbenchmark_model。
このツールは必須ですね!!
libtensorflow-liteのレシピでビルドした共有ライブラリをリンクするようにしたかったけど、色々と無理があったので、単体でビルドするようにした。
# cd /usr/share/tensorflow/lite/tools/benchmark/
# ./benchmark_model \
   --graph=./mobilenet_v1_1.0_224.tflite \
   --num_threads=4 \
   --enable_op_profiling=true

こちらも結果は一部省略。
STARTING!
Log parameter values verbosely: [0]
Num threads: [4]
Graph: [./mobilenet_v1_1.0_224.tflite]
Enable op profiling: [1]
#threads used for CPU inference: [4]
Loaded model ./mobilenet_v1_1.0_224.tflite
The input model file size (MB): 16.9008
Initialized session in 83.064ms.
Running benchmark for at least 1 iterations and at least 0.5 seconds but terminate if exceeding 150 seconds.
count=1 curr=3470145

...

Number of nodes executed: 31
============================== Summary by node type ==============================
	             [Node type]	  [count]	  [avg ms]	    [avg %]	    [cdf %]	  [mem KB]	[times called]
	                 CONV_2D	       15	  2554.810	    89.801%	    89.801%	     0.000	       15
	       DEPTHWISE_CONV_2D	       13	   289.070	    10.161%	    99.962%	     0.000	       13
	         AVERAGE_POOL_2D	        1	     0.846	     0.030%	    99.991%	     0.000	        1
	                 SOFTMAX	        1	     0.226	     0.008%	    99.999%	     0.000	        1
	                 SQUEEZE	        1	     0.019	     0.001%	   100.000%	     0.000	        1

Timings (microseconds): count=50 first=2936299 curr=2869577 min=2657264 max=3069766 avg=2.84499e+06 std=82794
Memory (bytes): count=0
31 nodes observed

最後に


2022年4月にはYoctoの次のバージョン(kirkstone)がリリースされる。
ようやくmeta-tensorflow-liteのレシピの追加・整理も終わってkirkstoneへの準備ができる状態になった。

また、TensorFlow LiteはXNNPACKがRISC-Vアーキテクチャをサポートしたみたい。
次のv2.9のリリースでは取り込まれると思われる。
meta-tensorflow-liteもRISC-VでXNNPACKを有効にできるようにしたい。

RISC-V CPUでTensorFlow Liteが動くと楽しくなってくるね。

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

2020年11月3日火曜日

YoctoでTensorFlow Lite (Build pip package)

目的


YoctoでTensorFlow Liteのpip packageをビルド、インストールするレシピを作成する。
bitbakeしたイメージをラズパイ4で動かしてみる。


動機


TensorFlowのレシピはあったりするが(以前ブログにした)、TensorFlow LiteのPython interpreterのレシピがなかったこと、あとからpipでインストールするのが結構めんどくさいので、レシピを作成することにした。


meta-tensorflow-lite


meta-tensorflow-liteとしてGitHubにレシピを公開している。v2.3.1に対応。



リファレンス


TensorFlow Liteのビルドは以下が参考になる。


ビルド


リポジトリのREADMEにもある通り。
  • 確認はラズパイ4の32 / 64bitで実施。
  • イメージはcore-image-weston(他も動くはず)。
  • dunfell, zeusに対応。
    zeusは人生初めてPRをもらった!(Support also zeus version #1)

必要なリポジトリをClone。
$ git clone git://git.yoctoproject.org/poky.git
$ git clone git://git.yoctoproject.org/meta-raspberrypi
$ git clone git://git.openembedded.org/meta-openembedded
$ git clone https://github.com/NobuoTsukamoto/meta-tensorflow-lite.git
$ source poky/oe-init-build-env rpi-build

レイヤーの追加
$ bitbake-layers add-layer ../meta-openembedded/meta-oe/
$ bitbake-layers add-layer ../meta-openembedded/meta-python/
$ bitbake-layers add-layer ../meta-openembedded/meta-networking/
$ bitbake-layers add-layer ../meta-openembedded/meta-multimedia/
$ bitbake-layers add-layer ../meta-raspberrypi/
$ bitbake-layers add-layer ../meta-tensorflow-lite/

conf/local.confにpython3-tensorflow-liteを追加。あと、opencvのpythonやgitも追加すると楽。
MACHINE ?= "raspberrypi4-64"
IMAGE_INSTALL_append = " python3-tensorflow-lite"

あとはBitbakeしてSDカードに書き込み。
$ bitbake core-image-weston

このリポジトリでTensorFlow Liteモデル(Float, INT8)が動くことを確認。
(注意:Edge TPUは動作しません)




その他



やったこと


tensorflow/lite/tools/pip_package/build_pip_package.shでpip packageを作成してインストールするレシピを作成。



PiCameraが有効にならなかった


meta-rasberrypiの設定でPiCameraを有効としてもまったく認識しなくて1週間悩んでいた...
Interface誌で「My オリジナルLinuxの作り方」連載されている!みつきんさん(@yusuke_mitsuki)!!にもアドバイスいただいたのだが認識せず。。。(その節はありがとうございます!)


結局はboot/config.txtのPiCameraを有効にする「start_x=1」を643行目?以降に記述するとカメラを認識できなくなるようだ...
同じような事象で困っていた人は他にもいたようだ...

(個体なのか何なのか)認識する場合もあるので、もし、ラズパイ4で同じ事象があったら、行数を意識すること。


終わりに


あとは、Edge TPUも動かしてみたいなぁ...

2019年6月20日木曜日

Raspberry Pi 3 で Yocto (AArch64 TensorFlow Weston)

YoctoでRaspberry Pi 3 Aarch64にTensorFlowを組み込んでみる。
OpenEmbedded Layer にmeta-tensorflowのレシピが登録されていたことを発見したのが理由。

手順としては公式に記載のとおりなのだが、自分の環境ではリソースが足りないため少しレシピを変えた。
→TensorFlowのビルド(Bazel)が2つ同時(tensorflowとtensorflow-native)に走るため、メモリが足りなくなってしまう(おそらく、64Gとか必要なのかもしれない?)

手を加えたレシピは以下で公開。
https://github.com/NobuoTsukamoto/meta-tensorflow
手を加えたのは、
  • tensorflowとtensorflow-nativeが同時に走らないように、DEPENDを設定。
  • Bazelのビルドオプションにlocal_resourcesフラグをつけて、CPU/MEMのリソースを設定。

準備


TensorFlowをビルドするにはホストマシンに、追加でlibatomicをビルド環境にインストールする(自分の環境はFedora 30)。

$ sudo dnf install libatomic


ダウンロード・レイヤーの追加


master環境を引っ張ってくる。

$ git clone git://git.yoctoproject.org/poky.git
$ cd poky/
$ git clone git://git.openembedded.org/meta-openembedded
$ git clone git://git.yoctoproject.org/meta-raspberrypi
$ git clone https://github.com/NobuoTsukamoto/meta-tensorflow.git
$ cd ../
$ source poky/oe-init-build-env rpi-build
$ bitbake-layers add-layer ../poky/meta-openembedded/meta-oe/
$ bitbake-layers add-layer ../poky/meta-openembedded/meta-multimedia/
$ bitbake-layers add-layer ../poky/meta-openembedded/meta-python/
$ bitbake-layers add-layer ../poky/meta-openembedded/meta-networking/
$ bitbake-layers add-layer ../poky/meta-raspberrypi/
$ bitbake-layers add-layer ../poky/meta-tensorflow/

Bitbake


conf/local.confに以下を追加する。
(AArch64ビルドの指定と、TensorFlowの追加)

MACHINE ?= "raspberrypi3-64"
IMAGE_INSTALL_append = " tensorflow"

あとは、bitbakeコマンドでビルド

Build Configuration:
BB_VERSION           = "1.43.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "fedora-30"
TARGET_SYS           = "aarch64-poky-linux"
MACHINE              = "raspberrypi3-64"
DISTRO               = "poky"
DISTRO_VERSION       = "2.7+snapshot-20190618"
TUNE_FEATURES        = "aarch64 cortexa53 crc"
TARGET_FPU           = ""
meta                 
meta-poky            
meta-yocto-bsp       = "master:27d60c5a812774f0e5c43161e5b514c4aebdf301"
meta-oe              
meta-multimedia      
meta-python          
meta-networking      = "master:3b245e4fe85be62c309650e84d1aaacbcb0d5505"
meta-raspberrypi     = "master:40283f583b57d67798135ed4a94cb8b5288ea965"
meta-tensorflow      = "master:94dff656415a534cdfa899cca9e87bc01fe15341"

そういえば、TUNE_FEATURESが昔は"aarch64"だけだった気がする。

SDカード書き込みと起動確認


いつものようにSDカードに書き込みして起動。Python3からTensorFlowがimportできるか確認。

やった〜

2018年7月9日月曜日

Raspberry pi 3 model B+ で Yoct(weston)

Raspberry Pi 3 Model B+を入手したので、YoctoでAArch64のイメージを作成してみる。
半年前(2017年後半?)ごろは、Raspberry Pi 3(無印)のAArch64では、Wifi、Bluetoothはドライバがないため、使えなかったが今回は使えそうなことが判明した。
なので、ブラウザ(Chromium)を組み込んだWestonのイメージを作成してみることにした。

準備

Chromiumをビルドするには、追加でlibatomicをビルド環境にインストールする
(筆者の環境はFedora28です)
$ sudo dnf install libatomic

ダウンロード・レイヤーの追加

master環境を引っ張ってくる。
Chromiumを追加するために、meta-browserも引っ張ってくる。
$ git clone git://git.yoctoproject.org/poky.git
$ cd poky/
$ git clone git://git.openembedded.org/meta-openembedded
$ git clone git://git.yoctoproject.org/meta-raspberrypi
$ git clone https://github.com/OSSystems/meta-browser
$ cd ../
$ source poky/oe-init-build-env rpi-build
$ bitbake-layers add-layer ../poky/meta-openembedded/meta-oe/
$ bitbake-layers add-layer ../poky/meta-openembedded/meta-multimedia/
$ bitbake-layers add-layer ../poky/meta-openembedded/meta-python/
$ bitbake-layers add-layer ../poky/meta-openembedded/meta-networking/
$ bitbake-layers add-layer ../poky/meta-raspberrypi/
$ bitbake-layers add-layer ../poky/meta-browser/

Bitbake

conf/local.confに以下を追加する。
(AArch64ビルドの指定と、Chromiumと日本語フォントの追加指定)
MACHINE ?= "raspberrypi3-64"
IMAGE_INSTALL_append = " chromium-ozone-wayland "
IMAGE_INSTALL_append = " source-han-sans-jp-fonts "

あとは、bitbakeコマンドでビルド

$ bitbake core-image-weston
WARNING: Host distribution "fedora-28" has not been validated with this version of the build system; you may possibly experience unexpected failures. It is recommended that you use a tested distribution.
Loading cache: 100% |#####################################################################| Time: 0:00:00
Loaded 3089 entries from dependency cache.
NOTE: Resolving any missing task queue dependencies

Build Configuration:
BB_VERSION = "1.39.0"
BUILD_SYS = "x86_64-linux"
NATIVELSBSTRING = "universal"
TARGET_SYS = "aarch64-poky-linux"
MACHINE = "raspberrypi3-64"
DISTRO = "poky"
DISTRO_VERSION = "2.5+snapshot-20180703"
TUNE_FEATURES = "aarch64"
TARGET_FPU = ""
meta 
meta-poky 
meta-yocto-bsp = "master:7cb125d7ee4b80fb33d87bdd0b257bc6daaff051"
meta-oe 
meta-multimedia 
meta-python 
meta-networking = "master:4517d1c695efd0b175f4e7242e1a7bb4361527d9"
meta-raspberrypi = "master:3b6549a5e016efe63c9d1463948b9de1ee5d89ed"
meta-browser = "master:1cd38d701a49eade80a04140f70d3383117b9745"

Initialising tasks: 100% |################################################################| Time: 0:00:03
NOTE: Executing SetScene Tasks
NOTE: Executing RunQueue Tasks
NOTE: Tasks Summary: Attempted 4831 tasks of which 4803 didn't need to be rerun and all succeeded.

Summary: There was 1 WARNING message shown.

SDカード書き込み・起動

ifconfigコマンドでwlan0が認識していることを確認。
SSID、キーを登録して、ルーターからIPアドレスが払い出されることを確認。
Chromiumを起動して、googleのトップページが開けた!!


2017年11月5日日曜日

Bash on Windows で yocto (はできなかった)

Windows10のBash on Windowsでyoctoがビルドできるかなと思ってチャレンジ。
(ubuntuだし、できるかも?と淡い期待をもってみた)
yoctoの公式Documentの通り、パッケージをインストール後、Raspberry pi3のBasicイメージでビルド。
ビルドするとエラーとなってしまう。autoreconf m4? 見慣れないエラー。。。

$ bitbake rpi-hwup-image
Parsing recipes: 100% |##################################################################################| Time: 0:00:23
Parsing of 1987 .bb files complete (0 cached, 1987 parsed). 2778 targets, 109 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
Build Configuration:
BB_VERSION        = "1.35.0"
BUILD_SYS         = "x86_64-linux"
NATIVELSBSTRING   = "universal"
TARGET_SYS        = "arm-poky-linux-gnueabi"
MACHINE           = "raspberrypi3"
DISTRO            = "poky"
DISTRO_VERSION    = "2.4"
TUNE_FEATURES     = "arm armv7ve vfp thumb neon vfpv4 callconvention-hard cortexa7"
TARGET_FPU        = "hard"
meta
meta-poky
meta-yocto-bsp    = "master:65d23bd7986615fdfb0f1717b615534a2a14ab80"
meta-oe
meta-multimedia
meta-python
meta-networking   = "master:0d220e002e4f525469f0c24e0585318d2178e7a1"
meta-raspberrypi  = "master:a1cfeb3324c458a73507e34ffcf28c25591b8052"
WARNING: The Linux kernel on your build host was not configured to provide process I/O statistics. (CONFIG_TASK_IO_ACCOUNTING is not set)
Initialising tasks: 100% |###############################################################################| Time: 0:00:05
NOTE: Executing SetScene Tasks
NOTE: Executing RunQueue Tasks
ERROR: libtool-native-2.4.6-r0 do_configure: autoreconf execution failed.
ERROR: libtool-native-2.4.6-r0 do_configure: Function failed: do_configure (log file is located at /home/xxxx/rpi3/rpi-build/tmp/work/x86_64-linux/libtool-native/2.4.6-r0/temp/log.do_configure.222)
ERROR: Logfile of failure stored in: /home/xxxx/rpi3/rpi-build/tmp/work/x86_64-linux/libtool-native/2.4.6-r0/temp/log.do_configure.222
Log data follows:
| DEBUG: Executing shell function autotools_preconfigure
| DEBUG: Shell function autotools_preconfigure finished
| DEBUG: Executing python function autotools_aclocals
| DEBUG: SITE files ['endian-little', 'common-linux', 'common-glibc', 'bit-64', 'x86_64-linux', 'common']
| DEBUG: Python function autotools_aclocals finished
| DEBUG: Executing shell function do_configure
| automake (GNU automake) 1.15.1
| Copyright (C) 2017 Free Software Foundation, Inc.
| License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl-2.0.html>;
| This is free software: you are free to change and redistribute it.
| There is NO WARRANTY, to the extent permitted by law.
|
| Written by Tom Tromey <tromey@redhat.com>
|        and Alexandre Duret-Lutz <adl@gnu.org>.
| AUTOV is 1.15
| NOTE: Executing ACLOCAL="aclocal --system-acdir=/home/xxxx/rpi3/rpi-build/tmp/work/x86_64-linux/libtool-native/2.4.6-r0/recipe-sysroot-native/usr/share/aclocal/ --automake-acdir=/home/xxxx/rpi3/rpi-build/tmp/work/x86_64-linux/libtool-native/2.4.6-r0/recipe-sysroot-native/usr/share/aclocal-1.15" autoreconf --verbose --install --force --exclude=libtoolize -I /home/xxxx/rpi3/rpi-build/tmp/work/x86_64-linux/libtool-native/2.4.6-r0/libtool-2.4.6/m4/ -I /home/xxxx/rpi3/rpi-build/tmp/work/x86_64-linux/libtool-native/2.4.6-r0/libtool-2.4.6/tests/
| autoreconf: Entering directory `.'
| autoreconf: configure.ac: not using Gettext
| autoreconf: running: aclocal --system-acdir=/home/xxxx/rpi3/rpi-build/tmp/work/x86_64-linux/libtool-native/2.4.6-r0/recipe-sysroot-native/usr/share/aclocal/ --automake-acdir=/home/xxxx/rpi3/rpi-build/tmp/work/x86_64-linux/libtool-native/2.4.6-r0/recipe-sysroot-native/usr/share/aclocal-1.15 -I /home/xxxx/rpi3/rpi-build/tmp/work/x86_64-linux/libtool-native/2.4.6-r0/libtool-2.4.6/m4/ -I /home/xxxx/rpi3/rpi-build/tmp/work/x86_64-linux/libtool-native/2.4.6-r0/libtool-2.4.6/tests/ --force -I m4
| m4: ../sysdeps/unix/sysv/linux/spawni.c:368: __spawnix: Assertion `ec >= 0' failed.
| m4: internal error detected; please report this bug to <bug-m4@gnu.org>: Aborted
| autom4te: m4 failed with exit status: 2
| aclocal: error: echo failed with exit status: 2
| autoreconf: aclocal failed with exit status: 2
| ERROR: autoreconf execution failed.
| WARNING: exit code 1 from a shell command.
| ERROR: Function failed: do_configure (log file is located at /home/xxxx/rpi3/rpi-build/tmp/work/x86_64-linux/libtool-native/2.4.6-r0/temp/log.do_configure.222)
ERROR: Task (/home/xxxx/rpi3/poky/meta/recipes-devtools/libtool/libtool-native_2.4.6.bb:do_configure) failed with exit code '1'
NOTE: Tasks Summary: Attempted 559 tasks of which 525 didn't need to be rerun and 1 failed.
Summary: 1 task failed:
  /home/xxxx/rpi3/poky/meta/recipes-devtools/libtool/libtool-native_2.4.6.bb:do_configure
Summary: There was 1 WARNING message shown.
Summary: There were 2 ERROR messages shown, returning a non-zero exit code.

どうやらBash on Windowsではglibcが完全に動作しないことが原因らしい。
https://github.com/Microsoft/WSL/issues/1878
(Bash on Windowsでyoctoを試そうとする人は他にもいたみたい。。。)

2017年10月30日月曜日

yocto2.4でraspberry pi 3 Aarch64

masterブランチ(2.4)でRaspberry Pi3をAarch64をビルドする方法。
レイヤーの追加とbitbakeのImageがちょっと変更になったのでメモ。

ダウンロード

$ mkdir aarch64
$ cd aarch64/
$ git clone git://git.yoctoproject.org/poky.git
$ cd poky/
$ git clone git://git.yoctoproject.org/meta-raspberrypi
$ git clone git://git.openembedded.org/meta-openembedded

レイヤーの追加

以前はmeta-raspberrypiだけ追加すればよかったが、エラーとなるため、meta-openembeddedのレイヤーも追加する。
$ mkdir aarch64
$ bitbake-layers add-layer ../poky/meta-openembedded/meta-oe/
$ bitbake-layers add-layer ../poky/meta-openembedded/meta-multimedia/
$ bitbake-layers add-layer ../poky/meta-openembedded/meta-python/
$ bitbake-layers add-layer ../poky/meta-openembedded/meta-networking/
$ bitbake-layers add-layer ../poky/meta-raspberrypi/

bitbake

conf/local.confに以下を追加する。
MACHINE ?= "raspberrypi3-64"

bitbakeでは「rpi-hwup-image」を指定。
$ bitbake rpi-hwup-image

Parsing recipes: 100% |##########################################| Time: 0:00:29
Parsing of 1974 .bb files complete (0 cached, 1974 parsed). 2762 targets, 113 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies

Build Configuration:
BB_VERSION = "1.35.0"
BUILD_SYS = "x86_64-linux"
NATIVELSBSTRING = "fedora-26"
TARGET_SYS = "aarch64-poky-linux"
MACHINE = "raspberrypi3-64"
DISTRO = "poky"
DISTRO_VERSION = "2.4"
TUNE_FEATURES = "aarch64"
TARGET_FPU = ""
meta
meta-poky
meta-yocto-bsp = "master:fcdfe09d9cc4e2977bd602dfd18f729cd9f6d73d"
meta-oe
meta-multimedia
meta-python
meta-networking = "master:f841648657069051dffa1012a42eb1524b894d50"
meta-raspberrypi = "master:04b37dbdb79638b17a670280058400ffaf1b6ccb"

NOTE: Tasks Summary: Attempted 2464 tasks of which 6 didn't need to be rerun and all succeeded.

SDカードに書き込み、起動

モニタを撮影・・・
以前より作成が簡単になっていた。感謝!