diff --git a/tensorflow/lite/g3doc/devguide.md b/tensorflow/lite/g3doc/devguide.md index bc3cd738572..3bd3bcd358e 100644 --- a/tensorflow/lite/g3doc/devguide.md +++ b/tensorflow/lite/g3doc/devguide.md @@ -215,11 +215,14 @@ trained Tensorflow models to the devices. To use the converter, refer to the [Tensorflow-CoreML converter documentation](https://github.com/tf-coreml/tf-coreml). -### Raspberry Pi +### ARM32 and ARM64 Linux Compile Tensorflow Lite for a Raspberry Pi by following the -[RPi build instructions](rpi.md) This compiles a static library file (`.a`) used -to build your app. There are plans for Python bindings and a demo app. +[RPi build instructions](rpi.md) Compile Tensorflow Lite for a generic aarch64 +board such as Odroid C2, Pine64, NanoPi, and others by following the +[ARM64 Linux build instructions](linux_aarch64.md) This compiles a static +library file (`.a`) used to build your app. There are plans for Python bindings +and a demo app. ## 4. Optimize your model (optional) diff --git a/tensorflow/lite/g3doc/linux_aarch64.md b/tensorflow/lite/g3doc/linux_aarch64.md new file mode 100644 index 00000000000..263ebaf726f --- /dev/null +++ b/tensorflow/lite/g3doc/linux_aarch64.md @@ -0,0 +1,62 @@ +# TensorFlow Lite for generic ARM64 boards + +## Cross compiling + +### Installing the toolchain + +```bash +sudo apt-get update +sudo apt-get install crossbuild-essential-arm64 +``` + +> If you are using Docker, you may not use `sudo`. + +### Building + +Clone this Tensorflow repository. Run this script at the root of the repository +to download all the dependencies: + +> The Tensorflow repository is in `/tensorflow` if you are using +> `tensorflow/tensorflow:nightly-devel` docker image, just try it. + +```bash +./tensorflow/lite/tools/make/download_dependencies.sh +``` + +Note that you only need to do this once. + +Compile: + +```bash +./tensorflow/lite/tools/make/build_aarch64_lib.sh +``` + +This should compile a static library in: +`tensorflow/lite/gen/gen/aarch64_armv8-a/lib/libtensorflow-lite.a`. + +## Native compiling + +These steps were tested on HardKernel Odroid C2, gcc version 5.4.0. + +Log in to your board, install the toolchain. + +```bash +sudo apt-get install build-essential +``` + +First, clone the TensorFlow repository. Run this at the root of the repository: + +```bash +./tensorflow/lite/tools/make/download_dependencies.sh +``` + +Note that you only need to do this once. + +Compile: + +```bash +./tensorflow/lite/tools/make/build_aarch64_lib.sh +``` + +This should compile a static library in: +`tensorflow/lite/gen/gen/aarch64_armv8-a/lib/libtensorflow-lite.a`. diff --git a/tensorflow/lite/tools/make/Makefile b/tensorflow/lite/tools/make/Makefile index 0f91ac70c84..8428e0d2e6b 100644 --- a/tensorflow/lite/tools/make/Makefile +++ b/tensorflow/lite/tools/make/Makefile @@ -1,3 +1,7 @@ +# Make uses /bin/sh by default, which is incompatible with the bashisms seen +# below. +SHELL := /bin/bash + # Find where we're running from, so we can store generated files here. ifeq ($(origin MAKEFILE_DIR), undefined) MAKEFILE_DIR := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) diff --git a/tensorflow/lite/tools/make/build_aarch64_lib.sh b/tensorflow/lite/tools/make/build_aarch64_lib.sh new file mode 100755 index 00000000000..054b3daedf8 --- /dev/null +++ b/tensorflow/lite/tools/make/build_aarch64_lib.sh @@ -0,0 +1,22 @@ +#!/bin/bash -x +# Copyright 2017 The TensorFlow Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============================================================================== + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +cd "$SCRIPT_DIR/../../../.." + +CC_PREFIX=aarch64-linux-gnu- make -j 3 -f tensorflow/lite/tools/make/Makefile TARGET=aarch64 TARGET_ARCH=armv8-a diff --git a/tensorflow/lite/tools/make/targets/aarch64_makefile.inc b/tensorflow/lite/tools/make/targets/aarch64_makefile.inc new file mode 100644 index 00000000000..d89440651e6 --- /dev/null +++ b/tensorflow/lite/tools/make/targets/aarch64_makefile.inc @@ -0,0 +1,33 @@ +# Settings for generic aarch64 boards such as Odroid C2 or Pine64. +ifeq ($(TARGET),aarch64) + # The aarch64 architecture covers all 64-bit ARM chips. This arch mandates + # NEON, so FPU flags are not needed below. + TARGET_ARCH := armv8-a + TARGET_TOOLCHAIN_PREFIX := aarch64-linux-gnu- + + CXXFLAGS += \ + -march=armv8-a \ + -funsafe-math-optimizations \ + -ftree-vectorize \ + -fPIC + + CCFLAGS += \ + -march=armv8-a \ + -funsafe-math-optimizations \ + -ftree-vectorize \ + -fPIC + + LDFLAGS := \ + -Wl,--no-export-dynamic \ + -Wl,--exclude-libs,ALL \ + -Wl,--gc-sections \ + -Wl,--as-needed + + + LIBS := \ + -lstdc++ \ + -lpthread \ + -lm \ + -ldl + +endif