TensorFlow 2.16.2 Lite C++ library build.

TensorFlow 2.16.2 Lite C++ library build.

TensorFlow 2.16.2 Lite C++ library をソースからビルドしてみた。

ROS2 自作 Turtlebot3 による 草刈りロボット開発。#9 LSTM で経路計画をする。 で、Tensorflow Lite 用の a.model.tflite が出来たので、C++ から実行する事になるので、試してみた。

ソースのダウンロードは、TensorFlow 2.16.2 C++ library build と同じなので、そちらを参考にしてください。

環境:
PC and Orange Pi 5 Armibian Jummy
Ubuntu 22.04
Tensorflow 12.6.2
Bazel 6.4

参考にしたのは、
CMake を使用した TensorFlow Lite の構築

1. build
ソースが、
~local/tensorflow/tensorflow-2.16.2
に展開済みとします。
$ cd ~local/tensorflow/tensorflow-2.16.2
$ mkdir build-nishi
$ cd build-nishi
$ cmake ../tensorflow/lite
$ cmake --build . -j3

注) build-essential が必要。まだの場合は。
$ sudo apt install build-essential

これで、libtensorflow-lite.a が、カレントディレクトリーにできる。

2. deploy
とりあえず、必要なファイルを~/usr/local/ へコピーします。
~/usr/local/
  lib
  include

注) include ファイルは、自分でコピーしないといけないみたい。
後、FlatBuffers 、 Abseil も必要とのこと。
同じ様に、copy shell を作った。
~/local/tensorflow/deploy-lite-nishi.sh

注) 中のパスは、自分の PC に合せて変えとうせ。
注2) flatbuffers のコピー元が、最初間違っていたみたい。
build-nishi/flatbuffers <--- NG
build-nishi/flatbuffers/include <-- OK

$ cd ~local/tensorflow
$ chmod 755 deploy-lite-nishi.sh
$ ./deploy-lite-nishi.sh

3. lite/examples/label_image をビルドして試す。
さらの状態から、始めて見ます。
$ cd ~/local/tensorflow/
$ mkdir label_image_build
$ cd label_image_build
最初に、tensorflow lite 全体の cmake を行う。
この時、オプションを指定して、どの環境で使うか指定する。
$ cmake ../tensorflow-2.16.2/tensorflow/lite

注) ここで、./examples/label_image/CMakeFiles/label_image.dir/ 下に、下記ファイルができる。
  flags.make <-- ここに CXX_DEFINES CXX_INCLUDES CXX_FLAGS がある。
  link.txt <-- ここに リンクモジュールの一覧がある。
上記情報は、自分で build する時に参照する。
ここで、label_image を実際に、ビルドする。
$ cmake --build . -j -t label_images

./examples/label_image/ 下に実行ファイルができる。
$ cd examples/label_image
実行の前に、 mobilenet_quant_v1_224.tflite , labels.txt , grace_hopper.bmp が必要。
上記ファイルを、集める。
tensorflow-2.16.2/tensorflow/lite/examples/ios/download_model.sh を叩くか、
tensorflow/lite/examples/label_image
の、Download sample model and image を参考にする。

image データは、tensorflow/lite/examples/label_image/testdata/grace_hopper.bmp
あるのでそれを使うそうな。
$ ./label_image --image ../../../tensorflow/lite/examples/label_image/testdata/grace_hopper.bmp

動くみたい。結構早い。

4. Cmake でのビルド。
自分のプログラムをビルドするにも、Cmake を使うみたい。
TensorFlow Lite C++ minimal example
を参考に、自分用の Cmake を作る必要がある。

CMakeLists.txt
を自分のプログラムデイレクトリーへコピーして、変更して試してみる。

下記、デイレクトリーに、
/home/nishi/Documents/VisualStudio-CPP/tflite/opp_tflite
  predict-test.cpp
  CMakeLists.txt
を用意して、
$ mkdir build
$ cd build
$ cmake ..
$ cmake --build . j3

CMakeLists.txt

これで、
predict-test ができるが、
この方法だと、全て再コンパイルになる。
先に作った、Tensorflow lite static Library が、まるきり使われない。

どうやら、下記箇所みたい。
CMake を使用した TensorFlow Lite の構築
インストール可能なパッケージのビルド

しかし、cmake 自体が、エラーになる。

とりあえず、opp_tflite の Cmake で作られる、 build.make 、flags.make と link.txt を参考にMakefileを作ってみた。


$ make
$ ./predict-test
一応、動いた。

参考にしたのは、
build/CMakeFiles/predict-test.dir
  build.make
  flags.make
  link.txt


ここで、プログラムを書き足して、

実行すると、エラーになる。


ちょっと、対策がわからない。
Android 版でないと、いけないのか?
Flex delegate をしないといけないのか?

5. どうやら、Flex 対応の、libtensorflowlite_flex.so を使うみたい。
TF Lite enable Flex delegate C++ API (with CMake of Bazel) #57822

bazel build -c opt --config=monolithic tensorflow/lite/delegates/flex:tensorflowlite_flex

Sample CMake snippet

add_executable(minimal minimal.cpp)
target_link_libraries(minimal tensorflowlite tensorflowlite_flex)

TensorFlow 演算子を選択する
C/C++
Bazel または CMake を使用して TensorFlow Lite インタープリタを構築している場合、
TensorFlow Lite Flex デリゲート共有ライブラリをリンクして Flex デリゲートを有効にできます。Bazel で次のコマンドを使用しインタープリタを構築できます。

$ bazel build -c opt --config=monolithic tensorflow/lite/delegates/flex:tensorflowlite_flex

このコマンドは次の共有ライブラリを bazel-bin/tensorflow/lite/delegates/flex 生成します。
Linux  libtensorflowlite_flex.so

上記、libtensorflowlite_flex.so を、今、libtensorflow-lite.a があるディレクトリーへコピーして、Makefile のリンクで、リンクすればよいのか?
ほかの、モジュールの分も必要か?もしそうだとすると、別のディレクトリーへ一括コピーすべきか?
libtensorflowlite_flex.so だけあればよいみたい。
ただし、リンクする時に、オプションの指定が必要みたい。
Adding Select Tf Ops to Cmake #55536
Hi,

I encounter the same issue and I think I found a way to make it work on Linux.
In order to force the link of tensorflowlite_flex with ld you can use the --no-as-needed option:
-Wl,--no-as-needed <--- これが必要みたい。


今までの情報をまとめて、
CMakeLists.txt-predict-test


これを参考に、Makefile を作って、dummy.cpp を作って実行させてみた。
結構こちらは、早い。
ただし、今は、Ubuntu 22.04 PC 版のみじゃ。
Orange Pi 5 Armbian Jummy 用の、libtensorflowlite_flex.so が出来ない。
Orange Pi 5 Armbian Jummy は、bazel が使えない(これは、誤りだった。)ので、Ubuntu 22.04 PC の bazel で、 aarch64 向けのクロスビルドが必要だが、これが、途中でエラーになる。
google で検索しても、みんなトラブっていて、解決の記事が見当たらない。

6. クロスビルドは、不可だが、 Orange pi 5 armibian 上で、 bazel で直接ビルドができそう。
arm64 版 bazel-6.4.0 のバイナリー版が公開されていた。
Releases 6.4.0
---> bazel-6.4.0-linux-arm64

早速、Armibian 上で、ビルドしてみる。
その前に、
$ chmod 755 bazel-6.4.0-linux-arm64
$ cd /usr/bin
$ sudo ln -s path-to/bazel-6.4.0-linux-arm64 bazel

$ bazel build -c opt --config=monolithic tensorflow/lite/delegates/flex:tensorflowlite_flex
--> OK

7. 先にビルドした、libtensorflow-lite.a libtensorflowlite_flex.so を、Cmake で、リンクして使う方法。
[CMake] ライブラリを自動的に探すFind<package>.cmakeのテンプレート を参考にして、
ビルドした、Tensorflow Lite のライブラリーを取り込む、FindTflite.cmake を作ってみた。

cmake/FindTflite.cmake

注) 今までの説明では、まだ、-ltf-lite_tools -ltf-lite_core が作られていないのだが。
後で公開する、github 上の
Makefile-Archive を使って組み込みます。
$ make -fMakefile-Archive
$ make -fMakefile-Archive install
$ make -fMakefile-Archive clean
これは、label_image の中の、class DelegateProviders を使う際に必要なライブラリーです。

後は、上記 cmake/FindTflite.cmake を、使って、 CMakeLists.txt を作れば、OK じゃ。

例) CMakeLists.txt-opp_with_lstm_predict


随分、ビルドが簡単になった。

8. LSTM版とは別に、opp_with_transformer_mltu で使った学習モデルを急遽、
tensorflow lite 版に変換して、こちらを試すと、
問題なく、predict できた。こちらは、Flex 版は、不要みたいじゃ。
ただし、実行速度が遅い。
transformer 版を、学習データを増やして学習させたほうが良いのかも知れない。

これを、Orange Pi 5 Armibian Jummy で試したが、同じ様に実行できた。

後は、ROS2 のプログラムに組み込むだけだが、
しかし、最終的には、cmake でビルドできるようにしないと、ROS2 の中で使えない。

このブログ記事について

このページは、おんちゃんが2024年12月 9日 12:54に書いたブログ記事です。

ひとつ前のブログ記事は「TensorFlow 2.16.2 C++ library build for GPU.」です。

次のブログ記事は「Opp TensorFlow 2.16.2 Lite C++ library build.」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

カテゴリ

ウェブページ

サイトナビ