Compilación cruzada TensorFlow Lite con CMake

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

Las siguientes instrucciones se han probado en una PC Ubuntu 16.04.3 de 64 bits (AMD64), imagen de la ventana acoplable de desarrollo TensorFlow tensorflow/tensorflow:devel .

Requisitos previos

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

Verifique su entorno objetivo

Los siguientes ejemplos se prueban en el sistema operativo Raspberry Pi, Ubuntu Server 20.04 LTS y Mendel Linux 4.0. Dependiendo de la versión de glibc de destino y de las capacidades de la CPU, es posible que necesite utilizar 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.

Comprobando la compatibilidad ABI

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

Comprobando la capacidad de la CPU

Para ARMv7, debe conocer la versión VFP compatible del 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 compilar 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 de herramientas 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

Ejecute 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 de herramientas 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

Ejecute 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 de herramientas 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

Ejecute 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/