From f5e573abda318f5ebb3972d9545f5c2194078997 Mon Sep 17 00:00:00 2001 From: Terry Heo Date: Sun, 16 Aug 2020 23:37:57 -0700 Subject: [PATCH] Update TFLITE RPI build document - Fixed ordered list numbering - Added some Make option examples - Added a way to build TFLite armhf shared library PiperOrigin-RevId: 326964389 Change-Id: I1dfbe781e09a5860119a9739cf102c8b02c8cf68 --- tensorflow/lite/g3doc/guide/build_rpi.md | 192 ++++++++++++++++------- 1 file changed, 137 insertions(+), 55 deletions(-) diff --git a/tensorflow/lite/g3doc/guide/build_rpi.md b/tensorflow/lite/g3doc/guide/build_rpi.md index 0f49ed91315..3b420926991 100644 --- a/tensorflow/lite/g3doc/guide/build_rpi.md +++ b/tensorflow/lite/g3doc/guide/build_rpi.md @@ -1,66 +1,83 @@ # Build TensorFlow Lite for Raspberry Pi -This page describes how to build the TensorFlow Lite static library for -Raspberry Pi. If you just want to start using TensorFlow Lite to execute your -models, the fastest option is to install the TensorFlow Lite runtime package as -shown in the [Python quickstart](python.md). +This page describes how to build the TensorFlow Lite static and shared libraries +for Raspberry Pi. If you just want to start using TensorFlow Lite to execute +your models, the fastest option is to install the TensorFlow Lite runtime +package as shown in the [Python quickstart](python.md). -**Note:** This page shows how to compile only the C++ static library for +**Note:** This page shows how to compile the C++ static and shared libraries for TensorFlow Lite. Alternative install options include: [install just the Python interpreter API](python.md) (for inferencing only); [install the full TensorFlow package from pip](https://www.tensorflow.org/install/pip); or [build the full TensorFlow package](https://www.tensorflow.org/install/source_rpi). -## Cross-compile for Raspberry Pi +**Note:** This page only covers 32-bit builds. If you're looking for 64-bit +builds, check [Build for ARM64](build_arm64.md) page. + +## Cross-compile for Raspberry Pi with Make The following instructions have been tested on Ubuntu 16.04.3 64-bit PC (AMD64) and TensorFlow devel docker image -[tensorflow/tensorflow:nightly-devel](https://hub.docker.com/r/tensorflow/tensorflow/tags/). +[tensorflow/tensorflow:devel](https://hub.docker.com/r/tensorflow/tensorflow/tags/). To cross compile TensorFlow Lite follow the steps: -1. Clone official Raspberry Pi cross-compilation toolchain: +#### Step 1. Clone official Raspberry Pi cross-compilation toolchain - ```sh - git clone https://github.com/raspberrypi/tools.git rpi_tools - ``` +```sh +git clone https://github.com/raspberrypi/tools.git rpi_tools +``` -2. Clone TensorFlow repository: +#### Step 2. Clone TensorFlow repository - ```sh - git clone https://github.com/tensorflow/tensorflow.git tensorflow_src - ``` +```sh +git clone https://github.com/tensorflow/tensorflow.git tensorflow_src +``` - **Note:** If you're using the TensorFlow Docker image, the repo is already - provided in `/tensorflow_src/`. +**Note:** If you're using the TensorFlow Docker image, the repo is already +provided in `/tensorflow_src/`. -3. Run following script at the root of the TensorFlow repository to download - all the build dependencies: +#### Step 3. Run following script at the root of the TensorFlow repository to download - ```sh - cd tensorflow_src && ./tensorflow/lite/tools/make/download_dependencies.sh - ``` +all the build dependencies: - **Note:** You only need to do this once. +```sh +cd tensorflow_src && ./tensorflow/lite/tools/make/download_dependencies.sh +``` -4. To build ARMv7 binary for Raspberry Pi 2, 3 and 4 execute: +**Note:** You only need to do this once. - ```sh - PATH=../rpi_tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin:$PATH ./tensorflow/lite/tools/make/build_rpi_lib.sh - ``` +#### Step 4a. To build ARMv7 binary for Raspberry Pi 2, 3 and 4 - **Note:** This should compile a static library in: - `tensorflow/lite/tools/make/gen/rpi_armv7l/lib/libtensorflow-lite.a`. +```sh +PATH=../rpi_tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin:$PATH \ + ./tensorflow/lite/tools/make/build_rpi_lib.sh +``` -5. To build ARMv6 binary for Raspberry Pi Zero execute: +**Note:** This should compile a static library in: +`tensorflow/lite/tools/make/gen/rpi_armv7l/lib/libtensorflow-lite.a`. - ```sh - PATH=../rpi_tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin:$PATH ./tensorflow/lite/tools/make/build_rpi_lib.sh TARGET_ARCH=armv6 - ``` +You can add additional Make options or target names to the `build_rpi_lib.sh` +script since it's a wrapper of Make with TFLite +[Makefile](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/tools/make/Makefile). +Here are some possible options: - **Note:** This should compile a static library in: - `tensorflow/lite/tools/make/gen/rpi_armv6/lib/libtensorflow-lite.a`. +```sh +./tensorflow/lite/tools/make/build_rpi_lib.sh clean # clean object files +./tensorflow/lite/tools/make/build_rpi_lib.sh -j 16 # run with 16 jobs to leverage more CPU cores +./tensorflow/lite/tools/make/build_rpi_lib.sh label_image # # build label_image binary +``` + +#### Step 4b. To build ARMv6 binary for Raspberry Pi Zero + +```sh +PATH=../rpi_tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin:$PATH \ + ./tensorflow/lite/tools/make/build_rpi_lib.sh TARGET_ARCH=armv6 +``` + +**Note:** This should compile a static library in: +`tensorflow/lite/tools/make/gen/rpi_armv6/lib/libtensorflow-lite.a`. ## Compile natively on Raspberry Pi @@ -69,32 +86,97 @@ GNU/Linux 10 (buster), gcc version 8.3.0 (Raspbian 8.3.0-6+rpi1): To natively compile TensorFlow Lite follow the steps: -1. Log in to your Raspberry Pi and install the toolchain: +#### Step 1. Log in to your Raspberry Pi and install the toolchain - ```sh - sudo apt-get install build-essential - ``` +```sh +sudo apt-get install build-essential +``` -2. Clone TensorFlow repository: +#### Step 2. Clone TensorFlow repository - ```sh - git clone https://github.com/tensorflow/tensorflow.git tensorflow_src - ``` +```sh +git clone https://github.com/tensorflow/tensorflow.git tensorflow_src +``` -3. Run following script at the root of the TensorFlow repository to download - all the build dependencies: +#### Step 3. Run following script at the root of the TensorFlow repository to download all the build dependencies - ```sh - cd tensorflow_src && ./tensorflow/lite/tools/make/download_dependencies.sh - ``` +```sh +cd tensorflow_src && ./tensorflow/lite/tools/make/download_dependencies.sh +``` - **Note:** You only need to do this once. +**Note:** You only need to do this once. -4. You should then be able to compile TensorFlow Lite with: +#### Step 4. You should then be able to compile TensorFlow Lite with: - ```sh - ./tensorflow/lite/tools/make/build_rpi_lib.sh - ``` +```sh +./tensorflow/lite/tools/make/build_rpi_lib.sh +``` - **Note:** This should compile a static library in: - `tensorflow/lite/tools/make/gen/lib/rpi_armv6/libtensorflow-lite.a`. +**Note:** This should compile a static library in: +`tensorflow/lite/tools/make/gen/lib/rpi_armv6/libtensorflow-lite.a`. + +## Cross-compile for armhf with Bazel + +You can use +[ARM GCC toolchains](https://github.com/tensorflow/tensorflow/tree/master/third_party/toolchains/embedded/arm-linux) +with Bazel to build an armhf shared library which is compatibile with Raspberry +Pi 2, 3 and 4. + +Note: The generated shared library requires glibc 2.28 or higher to run. + +The following instructions have been tested on Ubuntu 16.04.3 64-bit PC (AMD64) +and TensorFlow devel docker image +[tensorflow/tensorflow:devel](https://hub.docker.com/r/tensorflow/tensorflow/tags/). + +To cross compile TensorFlow Lite with Bazel, follow the steps: + +#### Step 1. Install Bazel + +Bazel is the primary build system for TensorFlow. Install the latest version of +the [Bazel build system](https://bazel.build/versions/master/docs/install.html). + +**Note:** If you're using the TensorFlow Docker image, Bazel is already +available. + +#### Step 2. Clone TensorFlow repository + +```sh +git clone https://github.com/tensorflow/tensorflow.git tensorflow_src +``` + +**Note:** If you're using the TensorFlow Docker image, the repo is already +provided in `/tensorflow_src/`. + +#### Step 3. Build ARMv7 binary for Raspberry Pi 2, 3 and 4 + +##### C library + +```bash +bazel build --config=elinux_armhf -c opt //tensorflow/lite/c:libtensorflowlite_c.so +``` + +Check +[TensorFlow Lite C API](https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/c) +page for the detail. + +##### C++ library + +```bash +bazel build --config=elinux_armhf -c opt //tensorflow/lite:libtensorflowlite.so +``` + +You can find a shared library library in: +`bazel-bin/tensorflow/lite/libtensorflowlite.so`. + +Currently, there is no straightforward way to extract all header files needed, +so you must include all header files in tensorflow/lite/ from the TensorFlow +repository. Additionally, you will need header files from FlatBuffers and +Abseil. + +##### Etc + +You can also build other Bazel targets with the toolchain. Here are some useful +targets. + +* //tensorflow/lite/tools/benchmark:benchmark_model +* //tensorflow/lite/examples/label_image:label_image