Compilación cruzada TensorFlow Lite con CMake

Esta página describe cómo compilar la biblioteca TensorFlow Lite para varios dispositivos ARM.

Las siguientes instrucciones se han probado en Ubuntu 16.04.3 PC de 64 bits (AMD64), TensorFlow devel docker image tensorflow/tensorflow:devel .

requisitos previos

Necesita CMake instalado y descargado el código fuente de TensorFlow. Consulte la página Construir TensorFlow Lite con CMake para obtener más detalles.

Compruebe su entorno de destino

Los siguientes ejemplos se prueban con el sistema operativo Raspberry Pi, Ubuntu Server 20.04 LTS y Mendel Linux 4.0. Según la versión de glibc de destino y las capacidades de la CPU, es posible que deba usar una versión diferente de la cadena de herramientas y los parámetros de compilación.

Comprobando la versión de glibc

ldd --version
ldd (Debian GLIBC 2.28-10) 2.28
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.

Comprobación de la compatibilidad ABI

Si su objetivo es ARM de 32 bits, hay dos ABI disponibles según la disponibilidad de VFP. armf y armel . Este documento muestra un ejemplo armhf, necesita usar una cadena de herramientas diferente para los objetivos armel.

Comprobación de la capacidad de la CPU

Para ARMv7, debe conocer la versión de VFP admitida por el objetivo y la disponibilidad de NEON.

cat /proc/cpuinfo
processor   : 0
model name  : ARMv7 Processor rev 3 (v7l)
BogoMIPS    : 108.00
Features    : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part    : 0xd08
CPU revision    : 3

Construir para AArch64 (ARM64)

Esta instrucción muestra cómo construir el binario AArch64 que es compatible con Coral Mendel Linux 4.0 , Raspberry Pi (con Ubuntu Server 20.04.01 LTS de 64 bits instalado).

Descargar cadena de herramientas

Estos comandos instalan la cadena gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu en ${HOME}/toolchains.

curl -LO https://storage.googleapis.com/mirror.tensorflow.org/developer.arm.com/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz
mkdir -p ${HOME}/toolchains
tar xvf gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz -C ${HOME}/toolchains

Ejecutar CMake

ARMCC_PREFIX=${HOME}/toolchains/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-
ARMCC_FLAGS="-funsafe-math-optimizations"
cmake -DCMAKE_C_COMPILER=${ARMCC_PREFIX}gcc \
  -DCMAKE_CXX_COMPILER=${ARMCC_PREFIX}g++ \
  -DCMAKE_C_FLAGS="${ARMCC_FLAGS}" \
  -DCMAKE_CXX_FLAGS="${ARMCC_FLAGS}" \
  -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
  -DCMAKE_SYSTEM_NAME=Linux \
  -DCMAKE_SYSTEM_PROCESSOR=aarch64 \
  ../tensorflow/lite/

Compilación para ARMv7 NEON habilitado

Esta instrucción muestra cómo construir ARMv7 con VFPv4 y binario habilitado para NEON que es compatible con Raspberry Pi 3 y 4.

Descargar cadena de herramientas

Estos comandos instalan la cadena gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf en ${HOME}/toolchains.

curl -LO https://storage.googleapis.com/mirror.tensorflow.org/developer.arm.com/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz
mkdir -p ${HOME}/toolchains
tar xvf gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz -C ${HOME}/toolchains

Ejecutar CMake

ARMCC_FLAGS="-march=armv7-a -mfpu=neon-vfpv4 -funsafe-math-optimizations -mfp16-format=ieee"
ARMCC_PREFIX=${HOME}/toolchains/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
cmake -DCMAKE_C_COMPILER=${ARMCC_PREFIX}gcc \
  -DCMAKE_CXX_COMPILER=${ARMCC_PREFIX}g++ \
  -DCMAKE_C_FLAGS="${ARMCC_FLAGS}" \
  -DCMAKE_CXX_FLAGS="${ARMCC_FLAGS}" \
  -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
  -DCMAKE_SYSTEM_NAME=Linux \
  -DCMAKE_SYSTEM_PROCESSOR=armv7 \
  ../tensorflow/lite/

Compilación para Raspberry Pi Zero (ARMv6)

Esta instrucción muestra cómo construir un binario ARMv6 que sea compatible con Raspberry Pi Zero.

Descargar cadena de herramientas

Estos comandos instalan la cadena gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf en ${HOME}/toolchains.

curl -LO https://storage.googleapis.com/mirror.tensorflow.org/developer.arm.com/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz
mkdir -p ${HOME}/toolchains
tar xvf gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf.tar.xz -C ${HOME}/toolchains

Ejecutar CMake

ARMCC_FLAGS="-march=armv6 -mfpu=vfp -mfloat-abi=hard -funsafe-math-optimizations"
ARMCC_PREFIX=${HOME}/toolchains/gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
cmake -DCMAKE_C_COMPILER=${ARMCC_PREFIX}gcc \
  -DCMAKE_CXX_COMPILER=${ARMCC_PREFIX}g++ \
  -DCMAKE_C_FLAGS="${ARMCC_FLAGS}" \
  -DCMAKE_CXX_FLAGS="${ARMCC_FLAGS}" \
  -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON \
  -DCMAKE_SYSTEM_NAME=Linux \
  -DCMAKE_SYSTEM_PROCESSOR=armv6 \
  -DTFLITE_ENABLE_XNNPACK=OFF \
  ../tensorflow/lite/