Crea TensorFlow Lite con CMake

Questa pagina descrive come creare e utilizzare la libreria TensorFlow Lite con lo strumento CMake .

Le seguenti istruzioni sono state testate su Ubuntu 16.04.3 PC a 64 bit (AMD64), macOS Catalina (x86_64), Windows 10 e TensorFlow devel Docker image tensorflow/tensorflow:devel .

Passaggio 1. Installa lo strumento CMake

Richiede CMake 3.16 o versione successiva. Su Ubuntu, puoi semplicemente eseguire il seguente comando.

sudo apt-get install cmake

Oppure puoi seguire la guida ufficiale all'installazione di cmake

Passaggio 2. Clonare il repository TensorFlow

git clone https://github.com/tensorflow/tensorflow.git tensorflow_src

Passaggio 3. Crea la directory di build CMake

mkdir tflite_build
cd tflite_build

Passaggio 4. Esegui lo strumento CMake con le configurazioni

Rilascia la build

Genera un file binario di rilascio ottimizzato per impostazione predefinita. Se vuoi creare per la tua workstation, esegui semplicemente il comando seguente.

cmake ../tensorflow_src/tensorflow/lite

Compilazione di debug

Se è necessario produrre una build di debug contenente informazioni sui simboli, è necessario fornire l'opzione -DCMAKE_BUILD_TYPE=Debug .

cmake ../tensorflow_src/tensorflow/lite -DCMAKE_BUILD_TYPE=Debug

Costruisci con unit test del kernel

Per poter eseguire i test del kernel, è necessario fornire il flag -DTFLITE_KERNEL_TEST=on . Le specifiche sulla compilazione incrociata dei test unitari sono disponibili nella sottosezione successiva.

cmake ../tensorflow_src/tensorflow/lite -DTFLITE_KERNEL_TEST=on

Costruisci un pacchetto installabile

Per creare un pacchetto installabile che possa essere utilizzato come dipendenza da un altro progetto CMake con find_package(tensorflow-lite CONFIG) , utilizzare l'opzione -DTFLITE_ENABLE_INSTALL=ON .

Idealmente dovresti anche fornire le tue versioni delle dipendenze della libreria. Questi dovranno essere utilizzati anche dal progetto che dipende da TF Lite. È possibile utilizzare -DCMAKE_FIND_PACKAGE_PREFER_CONFIG=ON e impostare le variabili <PackageName>_DIR in modo che puntino alle installazioni della libreria.

cmake ../tensorflow_src/tensorflow/lite -DTFLITE_ENABLE_INSTALL=ON \
  -DCMAKE_FIND_PACKAGE_PREFER_CONFIG=ON \
  -DSYSTEM_FARMHASH=ON \
  -DSYSTEM_PTHREADPOOL=ON \
  -Dabsl_DIR=<install path>/lib/cmake/absl \
  -DEigen3_DIR=<install path>/share/eigen3/cmake \
  -DFlatBuffers_DIR=<install path>/lib/cmake/flatbuffers \
  -Dgemmlowp_DIR=<install path>/lib/cmake/gemmlowp \
  -DNEON_2_SSE_DIR=<install path>/lib/cmake/NEON_2_SSE \
  -Dcpuinfo_DIR=<install path>/share/cpuinfo \
  -Druy_DIR=<install path>/lib/cmake/ruy

Compilazione incrociata

Puoi utilizzare CMake per creare file binari per architetture di destinazione ARM64 o Android.

Per effettuare la compilazione incrociata di TF Lite, è necessario fornire il percorso dell'SDK (ad esempio ARM64 SDK o NDK nel caso di Android) con il flag -DCMAKE_TOOLCHAIN_FILE .

cmake -DCMAKE_TOOLCHAIN_FILE=<CMakeToolchainFileLoc> ../tensorflow/lite/
Specifiche della compilazione incrociata Android

Per la compilazione incrociata Android, è necessario installare Android NDK e fornire il percorso NDK con il flag -DCMAKE_TOOLCHAIN_FILE menzionato sopra. È inoltre necessario impostare l'ABI target con il flag -DANDROID_ABI .

cmake -DCMAKE_TOOLCHAIN_FILE=<NDK path>/build/cmake/android.toolchain.cmake \
  -DANDROID_ABI=arm64-v8a ../tensorflow_src/tensorflow/lite
Specifiche del kernel (unità) testano la compilazione incrociata

La compilazione incrociata degli unit test richiede il compilatore flatc per l'architettura host. A questo scopo, è disponibile una CMakeLists situata in tensorflow/lite/tools/cmake/native_tools/flatbuffers per creare in anticipo il compilatore flatc con CMake in una directory di build separata utilizzando la toolchain host.

mkdir flatc-native-build && cd flatc-native-build
cmake ../tensorflow_src/tensorflow/lite/tools/cmake/native_tools/flatbuffers
cmake --build .

È anche possibile installare flatc in un percorso di installazione personalizzato (ad esempio in una directory contenente altri strumenti creati nativamente invece della directory di build di CMake):

cmake -DCMAKE_INSTALL_PREFIX=<native_tools_dir> ../tensorflow_src/tensorflow/lite/tools/cmake/native_tools/flatbuffers
cmake --build .

Per la compilazione incrociata TF Lite stessa, è necessario fornire il parametro aggiuntivo -DTFLITE_HOST_TOOLS_DIR=<flatc_dir_path> che punta alla directory contenente il file binario flatc nativo insieme al flag -DTFLITE_KERNEL_TEST=on menzionato sopra.

cmake -DCMAKE_TOOLCHAIN_FILE=${OE_CMAKE_TOOLCHAIN_FILE} -DTFLITE_KERNEL_TEST=on -DTFLITE_HOST_TOOLS_DIR=<flatc_dir_path> ../tensorflow/lite/
I test del kernel (unità) con compilazione incrociata vengono avviati sulla destinazione

Gli unit test possono essere eseguiti come eseguibili separati o utilizzando l'utilità CTest. Per quanto riguarda CTest, se almeno uno dei parametri TFLITE_ENABLE_NNAPI, TFLITE_ENABLE_XNNPACK o TFLITE_EXTERNAL_DELEGATE è abilitato per la build di TF Lite, i test risultanti vengono generati con due etichette diverse (utilizzando lo stesso eseguibile del test): - plain - che indica i test quelli eseguiti sul backend della CPU - delegato - denotano i test che prevedono argomenti di avvio aggiuntivi utilizzati per la specifica del delegato utilizzato

Sia CTestTestfile.cmake che run-tests.cmake (come indicato di seguito) sono disponibili in <build_dir>/kernels .

Avvio di unit test con backend CPU (a condizione che CTestTestfile.cmake sia presente sul target nella directory corrente):

ctest -L plain

Avvia esempi di unit test utilizzando i delegati (a condizione che i file CTestTestfile.cmake e run-tests.cmake siano presenti sulla destinazione nella directory corrente):

cmake -E env TESTS_ARGUMENTS=--use_nnapi=true\;--nnapi_accelerator_name=vsi-npu ctest -L delegate
cmake -E env TESTS_ARGUMENTS=--use_xnnpack=true ctest -L delegate
cmake -E env TESTS_ARGUMENTS=--external_delegate_path=<PATH> ctest -L delegate

Una limitazione nota di questo modo di fornire argomenti di avvio aggiuntivi relativi ai delegati agli unit test è che supporta effettivamente solo quelli con un valore restituito previsto pari a 0 . Valori restituiti diversi verranno segnalati come errore del test.

Delegato GPU OpenCL

Se il tuo computer di destinazione dispone del supporto OpenCL, puoi utilizzare il delegato GPU che può sfruttare la potenza della tua GPU.

Per configurare il supporto delegato GPU OpenCL:

cmake ../tensorflow_src/tensorflow/lite -DTFLITE_ENABLE_GPU=ON

Passaggio 5. Crea TensorFlow Lite

Nella directory tflite_build ,

cmake --build . -j

Passaggio 6. Costruisci lo strumento di benchmark TensorFlow Lite e l'esempio di immagine dell'etichetta (facoltativo)

Nella directory tflite_build ,

cmake --build . -j -t benchmark_model
cmake --build . -j -t label_image

Opzioni disponibili per creare TensorFlow Lite

Ecco l'elenco delle opzioni disponibili. Puoi sovrascriverlo con -D<option_name>=[ON|OFF] . Ad esempio, -DTFLITE_ENABLE_XNNPACK=OFF per disabilitare XNNPACK che è abilitato per impostazione predefinita.

Nome dell'opzione Caratteristica Androide Linux Mac OS finestre
TFLITE_ENABLE_RUY Abilita la libreria di moltiplicazione di matrici RUY SU SPENTO SPENTO SPENTO
TFLITE_ENABLE_NNAPI Abilita delegato NNAPI SU SPENTO N / A N / A
TFLITE_ENABLE_GPU Abilita delegato GPU SPENTO SPENTO N / A N / A
TFLITE_ENABLE_XNNPACK Abilita delegato XNNPACK SU SU SU SU
TFLITE_ENABLE_MMAP Abilita MMAP SU SU SU N / A

Crea un progetto CMake che utilizzi TensorFlow Lite

Ecco l' esempio minimo CMakeLists.txt dell'esempio minimo di TFLite .

È necessario disporre di add_subdirectory() per la directory TensorFlow Lite e collegare tensorflow-lite con target_link_libraries().

cmake_minimum_required(VERSION 3.16)
project(minimal C CXX)

set(TENSORFLOW_SOURCE_DIR "" CACHE PATH
  "Directory that contains the TensorFlow project" )
if(NOT TENSORFLOW_SOURCE_DIR)
  get_filename_component(TENSORFLOW_SOURCE_DIR
    "${CMAKE_CURRENT_LIST_DIR}/../../../../" ABSOLUTE)
endif()

add_subdirectory(
  "${TENSORFLOW_SOURCE_DIR}/tensorflow/lite"
  "${CMAKE_CURRENT_BINARY_DIR}/tensorflow-lite" EXCLUDE_FROM_ALL)

add_executable(minimal minimal.cc)
target_link_libraries(minimal tensorflow-lite)

Costruisci la libreria TensorFlow Lite C

Se desideri creare la libreria condivisa TensorFlow Lite per l'API C , segui prima dal passaggio 1 al passaggio 3 . Successivamente, esegui i seguenti comandi.

Linux/MacOS

cmake ../tensorflow_src/tensorflow/lite/c
cmake --build . -j

finestre

cmake ../tensorflow_src/tensorflow/lite/c
cmake --build . -j --config Release

Biblioteca compilata

Il comando precedente genera la seguente libreria condivisa nella directory corrente.

piattaforma Nome della libreria
Linux libtensorflowlite_c.so
Mac OS libtensorflowlite_c.dylib
finestre tensorflowlite_c.dll