Compilación cruzada de TensorFlow Lite con CMake

En esta página, se describe cómo compilar la biblioteca de TensorFlow Lite para varios dispositivos ARM.

Las siguientes instrucciones se probaron en una PC de 64 bits (AMD64) con Ubuntu 16.04.3 y la imagen de Docker de devel de TensorFlow tensorflow/tensorflow:devel.

Requisitos previos

Necesitas que CMake esté instalado y descargado el código fuente de TensorFlow. Consulta la página Build TensorFlow Lite with CMake para obtener más información.

Verifica tu entorno de destino

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

Cómo comprobar 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.

Cómo comprobar la compatibilidad con ABI

Si tu objetivo es ARM de 32 bits, hay dos ABI disponibles según la disponibilidad de VFP: armhf y armel. En este documento, se muestra un ejemplo de armhf. Debes usar diferentes cadenas de herramientas para los objetivos armel.

Verifica la capacidad de la CPU

Para ARMv7, debes conocer la versión de VFP compatible con el destino 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

Compilación para AArch64 (ARM64)

En esta instrucción, se muestra cómo compilar el objeto binario AArch64, que es compatible con Coral Mendel Linux 4.0, Raspberry Pi (con Ubuntu Server 20.04.01 LTS 64 bits instalado).

Descargar cadena de herramientas

Estos comandos instalan la cadena de herramientas de 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

Cómo 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 habilitada

En esta instrucción, se muestra cómo compilar ARMv7 con VFPv4 y objeto binario habilitado para NEON, que es compatible con Raspberry Pi 3 y 4.

Descargar cadena de herramientas

Con estos comandos, se instala 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

Cómo 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/

Compila para Raspberry Pi Zero (ARMv6)

En esta instrucción, se muestra cómo compilar el objeto binario de ARMv6, que es compatible con Raspberry Pi Zero.

Descargar cadena de herramientas

Con estos comandos, se instala 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

Cómo 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/