Compilation croisée de TensorFlow Lite avec CMake

Cette page explique comment créer la bibliothèque TensorFlow Lite pour différents appareils ARM.

Les instructions suivantes ont été testées sur Ubuntu 16.04.3 64 bits pour PC (AMD64) et TensorFlow devel docker image tensorflow/tensorflow:devel.

Prérequis

Vous devez installer et télécharger le code source TensorFlow de CMake. Pour en savoir plus, consultez la page Compiler TensorFlow Lite avec CMake.

Vérifier votre environnement cible

Les exemples suivants sont testés sous l'OS Raspberry Pi, Ubuntu Server 20.04 LTS et Mendel Linux 4.0. En fonction de la version de glibc cible et des fonctionnalités de processeur, vous devrez peut-être utiliser une version de chaîne d'outils et des paramètres de compilation différents.

Vérification de la version 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.

Vérifier la compatibilité avec les ABI

Si votre cible est ARM 32 bits, deux ABI sont disponibles en fonction de la disponibilité de VFP : armhf et armel. Dans ce document, vous trouverez un exemple "armhf". Vous devez utiliser une autre chaîne d'outils pour les cibles armel.

Vérifier la capacité du processeur

Pour ARMv7, vous devez connaître la version VFP compatible de la cible et la disponibilité 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

Compiler pour AArch64 (ARM64)

Cette instruction explique comment compiler un binaire AArch64 compatible avec Coral Mendel Linux 4.0, Raspberry Pi (avec Ubuntu Server 20.04.01 LTS 64 bits installé).

Télécharger la chaîne d'outils

Ces commandes installent la chaîne d'outils gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu sous ${HOME}/chaînes d'outils.

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

Exécuter 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/

Compilation pour ARMv7 NEON activée

Cette instruction explique comment compiler ARMv7 avec VFPv4 et un binaire compatible avec NEON, qui est compatible avec Raspberry Pi 3 et 4.

Télécharger la chaîne d'outils

Ces commandes installent la chaîne d'outils gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf sous ${HOME}/chaînes d'outils.

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

Exécuter 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/

Compiler pour Raspberry Pi Zero (ARMv6)

Cette instruction explique comment compiler un binaire ARMv6 compatible avec Raspberry Pi Zero.

Télécharger la chaîne d'outils

Ces commandes installent la chaîne d'outils gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf sous ${HOME}/chaînes d'outils.

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

Exécuter 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/