Crie o TensorFlow Lite com o CMake

Esta página descreve como criar e usar a biblioteca TensorFlow Lite com a ferramenta CMake .

As instruções a seguir foram testadas no Ubuntu 16.04.3 PC de 64 bits (AMD64) , macOS Catalina (x86_64), Windows 10 e TensorFlow devel Docker image tensorflow/tensorflow:devel .

Etapa 1. Instale a ferramenta CMake

Requer CMake 3.16 ou superior. No Ubuntu, você pode simplesmente executar o seguinte comando.

sudo apt-get install cmake

Ou você pode seguir o guia de instalação oficial do cmake

Etapa 2. Clonar repositório do TensorFlow

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

Etapa 3. Crie o diretório de compilação do CMake

mkdir tflite_build
cd tflite_build

Etapa 4. Execute a ferramenta CMake com as configurações

versão de lançamento

Ele gera um binário de liberação otimizado por padrão. Se você deseja construir para sua estação de trabalho, simplesmente execute o seguinte comando.

cmake ../tensorflow_src/tensorflow/lite

Compilação de depuração

Se você precisar produzir uma compilação de depuração que tenha informações de símbolo, será necessário fornecer a opção -DCMAKE_BUILD_TYPE=Debug .

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

Crie com testes de unidade do kernel

Para poder executar testes de kernel, você precisa fornecer o sinalizador -DTFLITE_KERNEL_TEST=on . Detalhes específicos de compilação cruzada de teste de unidade podem ser encontrados na próxima subseção.

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

Construir pacote instalável

Para criar um pacote instalável que pode ser usado como dependência por outro projeto CMake com find_package(tensorflow-lite CONFIG) , use a opção -DTFLITE_ENABLE_INSTALL=ON .

Idealmente, você também deve fornecer suas próprias versões de dependências de biblioteca. Eles também precisarão ser usados ​​pelo projeto que depende do TF Lite. Você pode usar o -DCMAKE_FIND_PACKAGE_PREFER_CONFIG=ON e definir as variáveis <PackageName>_DIR para apontar para suas instalações de biblioteca.

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

Compilação cruzada

Você pode usar o CMake para criar binários para arquiteturas de destino ARM64 ou Android.

Para fazer a compilação cruzada do TF Lite, você precisa fornecer o caminho para o SDK (por exemplo, ARM64 SDK ou NDK no caso do Android) com o sinalizador -DCMAKE_TOOLCHAIN_FILE .

cmake -DCMAKE_TOOLCHAIN_FILE=<CMakeToolchainFileLoc> ../tensorflow/lite/
Especificidades da compilação cruzada do Android

Para compilação cruzada do Android, você precisa instalar o Android NDK e fornecer o caminho do NDK com o sinalizador -DCMAKE_TOOLCHAIN_FILE mencionado acima. Você também precisa definir a ABI de destino com o sinalizador -DANDROID_ABI .

cmake -DCMAKE_TOOLCHAIN_FILE=<NDK path>/build/cmake/android.toolchain.cmake \
  -DANDROID_ABI=arm64-v8a ../tensorflow_src/tensorflow/lite
Especificidades do kernel (unidade) testa a compilação cruzada

A compilação cruzada dos testes de unidade requer um compilador flatc para a arquitetura do host. Para essa finalidade, há um CMakeLists localizado em tensorflow/lite/tools/cmake/native_tools/flatbuffers para criar o compilador flatc com CMake antecipadamente em um diretório de compilação separado usando a cadeia de ferramentas do host.

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

Também é possível instalar o flatc em um local de instalação personalizado (por exemplo, em um diretório contendo outras ferramentas construídas nativamente em vez do diretório de compilação do CMake):

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

Para a própria compilação cruzada do TF Lite, o parâmetro adicional -DTFLITE_HOST_TOOLS_DIR=<flatc_dir_path> apontando para o diretório que contém o binário flatc nativo precisa ser fornecido junto com o sinalizador -DTFLITE_KERNEL_TEST=on mencionado acima.

cmake -DCMAKE_TOOLCHAIN_FILE=${OE_CMAKE_TOOLCHAIN_FILE} -DTFLITE_KERNEL_TEST=on -DTFLITE_HOST_TOOLS_DIR=<flatc_dir_path> ../tensorflow/lite/
Lançamento de testes de kernel (unidade) de compilação cruzada no destino

Os testes de unidade podem ser executados como executáveis ​​separados ou usando o utilitário CTest. No que diz respeito ao CTest, se pelo menos um dos parâmetros TFLITE_ENABLE_NNAPI, TFLITE_ENABLE_XNNPACK ou TFLITE_EXTERNAL_DELEGATE estiver habilitado para a compilação do TF Lite, os testes resultantes serão gerados com dois rótulos diferentes (utilizando o mesmo executável de teste): - simples - denotando os testes aqueles executados no back-end da CPU - delegado - denotando os testes que esperam argumentos de inicialização adicionais usados ​​para a especificação do delegado usado

Ambos CTestTestfile.cmake e run-tests.cmake (conforme referido abaixo) estão disponíveis em <build_dir>/kernels .

Lançamento de testes de unidade com back-end de CPU (desde que o CTestTestfile.cmake esteja presente no destino no diretório atual):

ctest -L plain

Inicie exemplos de testes de unidade usando delegados (desde que o arquivo CTestTestfile.cmake e run-tests.cmake estejam presentes no destino no diretório atual):

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

Uma limitação conhecida dessa maneira de fornecer argumentos adicionais de inicialização relacionados a delegados para testes de unidade é que ele suporta efetivamente apenas aqueles com um valor de retorno esperado de 0 . Valores de retorno diferentes serão relatados como uma falha de teste.

Delegado GPU OpenCL

Se sua máquina de destino tiver suporte a OpenCL, você poderá usar o delegado de GPU , que pode aproveitar o poder de sua GPU.

Para configurar o suporte a delegado de GPU OpenCL:

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

Etapa 5. Crie o TensorFlow Lite

No diretório tflite_build ,

cmake --build . -j

Etapa 6. Crie a ferramenta de benchmark TensorFlow Lite e exemplo de imagem de rótulo (opcional)

No diretório tflite_build ,

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

Opções disponíveis para criar o TensorFlow Lite

Aqui está a lista de opções disponíveis. Você pode substituí-lo com -D<option_name>=[ON|OFF] . Por exemplo, -DTFLITE_ENABLE_XNNPACK=OFF para desativar o XNNPACK, que é ativado por padrão.

Nome da opção Recurso Android Linux Mac OS janelas
TFLITE_ENABLE_RUY Ativar biblioteca de multiplicação de matrizes RUY SOBRE DESLIGADO DESLIGADO DESLIGADO
TFLITE_ENABLE_NNAPI Ativar delegado NNAPI SOBRE DESLIGADO N / D N / D
TFLITE_ENABLE_GPU Ativar delegado de GPU DESLIGADO DESLIGADO N / D N / D
TFLITE_ENABLE_XNNPACK Ativar delegado XNNPACK SOBRE SOBRE SOBRE SOBRE
TFLITE_ENABLE_MMAP Ativar MMAP SOBRE SOBRE SOBRE N / D

Crie um projeto CMake que usa o TensorFlow Lite

Aqui está o CMakeLists.txt do exemplo mínimo do TFLite .

Você precisa ter add_subdirectory() para o diretório TensorFlow Lite e vincular tensorflow-lite com 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)

Criar biblioteca TensorFlow Lite C

Se você deseja criar uma biblioteca compartilhada do TensorFlow Lite para C API , siga as etapas 1 a 3 primeiro. Depois disso, execute os seguintes comandos.

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

Este comando gera a seguinte biblioteca compartilhada no diretório atual.

Plataforma Nome da biblioteca
Linux libtensorflowlite_c.so
Mac OS libtensorflowlite_c.dylib
janelas tensorflowlite_c.dll
,

Esta página descreve como criar e usar a biblioteca TensorFlow Lite com a ferramenta CMake .

As instruções a seguir foram testadas no Ubuntu 16.04.3 PC de 64 bits (AMD64) , macOS Catalina (x86_64), Windows 10 e TensorFlow devel Docker image tensorflow/tensorflow:devel .

Etapa 1. Instale a ferramenta CMake

Requer CMake 3.16 ou superior. No Ubuntu, você pode simplesmente executar o seguinte comando.

sudo apt-get install cmake

Ou você pode seguir o guia de instalação oficial do cmake

Etapa 2. Clonar repositório do TensorFlow

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

Etapa 3. Crie o diretório de compilação do CMake

mkdir tflite_build
cd tflite_build

Etapa 4. Execute a ferramenta CMake com as configurações

versão de lançamento

Ele gera um binário de liberação otimizado por padrão. Se você deseja construir para sua estação de trabalho, simplesmente execute o seguinte comando.

cmake ../tensorflow_src/tensorflow/lite

Compilação de depuração

Se você precisar produzir uma compilação de depuração que tenha informações de símbolo, será necessário fornecer a opção -DCMAKE_BUILD_TYPE=Debug .

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

Crie com testes de unidade do kernel

Para poder executar testes de kernel, você precisa fornecer o sinalizador -DTFLITE_KERNEL_TEST=on . Detalhes específicos de compilação cruzada de teste de unidade podem ser encontrados na próxima subseção.

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

Construir pacote instalável

Para criar um pacote instalável que pode ser usado como dependência por outro projeto CMake com find_package(tensorflow-lite CONFIG) , use a opção -DTFLITE_ENABLE_INSTALL=ON .

Idealmente, você também deve fornecer suas próprias versões de dependências de biblioteca. Eles também precisarão ser usados ​​pelo projeto que depende do TF Lite. Você pode usar o -DCMAKE_FIND_PACKAGE_PREFER_CONFIG=ON e definir as variáveis <PackageName>_DIR para apontar para suas instalações de biblioteca.

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

Compilação cruzada

Você pode usar o CMake para criar binários para arquiteturas de destino ARM64 ou Android.

Para fazer a compilação cruzada do TF Lite, você precisa fornecer o caminho para o SDK (por exemplo, ARM64 SDK ou NDK no caso do Android) com o sinalizador -DCMAKE_TOOLCHAIN_FILE .

cmake -DCMAKE_TOOLCHAIN_FILE=<CMakeToolchainFileLoc> ../tensorflow/lite/
Especificidades da compilação cruzada do Android

Para compilação cruzada do Android, você precisa instalar o Android NDK e fornecer o caminho do NDK com o sinalizador -DCMAKE_TOOLCHAIN_FILE mencionado acima. Você também precisa definir a ABI de destino com o sinalizador -DANDROID_ABI .

cmake -DCMAKE_TOOLCHAIN_FILE=<NDK path>/build/cmake/android.toolchain.cmake \
  -DANDROID_ABI=arm64-v8a ../tensorflow_src/tensorflow/lite
Especificidades do kernel (unidade) testa a compilação cruzada

A compilação cruzada dos testes de unidade requer um compilador flatc para a arquitetura do host. Para essa finalidade, há um CMakeLists localizado em tensorflow/lite/tools/cmake/native_tools/flatbuffers para criar o compilador flatc com CMake antecipadamente em um diretório de compilação separado usando a cadeia de ferramentas do host.

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

Também é possível instalar o flatc em um local de instalação personalizado (por exemplo, em um diretório contendo outras ferramentas construídas nativamente em vez do diretório de compilação do CMake):

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

Para a própria compilação cruzada do TF Lite, o parâmetro adicional -DTFLITE_HOST_TOOLS_DIR=<flatc_dir_path> apontando para o diretório que contém o binário flatc nativo precisa ser fornecido junto com o sinalizador -DTFLITE_KERNEL_TEST=on mencionado acima.

cmake -DCMAKE_TOOLCHAIN_FILE=${OE_CMAKE_TOOLCHAIN_FILE} -DTFLITE_KERNEL_TEST=on -DTFLITE_HOST_TOOLS_DIR=<flatc_dir_path> ../tensorflow/lite/
Lançamento de testes de kernel (unidade) de compilação cruzada no destino

Os testes de unidade podem ser executados como executáveis ​​separados ou usando o utilitário CTest. No que diz respeito ao CTest, se pelo menos um dos parâmetros TFLITE_ENABLE_NNAPI, TFLITE_ENABLE_XNNPACK ou TFLITE_EXTERNAL_DELEGATE estiver habilitado para a compilação do TF Lite, os testes resultantes serão gerados com dois rótulos diferentes (utilizando o mesmo executável de teste): - simples - denotando os testes aqueles executados no back-end da CPU - delegado - denotando os testes que esperam argumentos de inicialização adicionais usados ​​para a especificação do delegado usado

Ambos CTestTestfile.cmake e run-tests.cmake (conforme referido abaixo) estão disponíveis em <build_dir>/kernels .

Lançamento de testes de unidade com back-end de CPU (desde que o CTestTestfile.cmake esteja presente no destino no diretório atual):

ctest -L plain

Inicie exemplos de testes de unidade usando delegados (desde que o arquivo CTestTestfile.cmake e run-tests.cmake estejam presentes no destino no diretório atual):

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

Uma limitação conhecida dessa maneira de fornecer argumentos de inicialização relacionados a delegados adicionais para testes de unidade é que ele efetivamente oferece suporte apenas àqueles com um valor de retorno esperado de 0 . Valores de retorno diferentes serão relatados como uma falha de teste.

Delegado GPU OpenCL

Se sua máquina de destino tiver suporte a OpenCL, você poderá usar o delegado de GPU , que pode aproveitar o poder de sua GPU.

Para configurar o suporte a delegado de GPU OpenCL:

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

Etapa 5. Crie o TensorFlow Lite

No diretório tflite_build ,

cmake --build . -j

Etapa 6. Crie a ferramenta de benchmark TensorFlow Lite e exemplo de imagem de rótulo (opcional)

No diretório tflite_build ,

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

Opções disponíveis para criar o TensorFlow Lite

Aqui está a lista de opções disponíveis. Você pode substituí-lo com -D<option_name>=[ON|OFF] . Por exemplo, -DTFLITE_ENABLE_XNNPACK=OFF para desativar o XNNPACK, que é ativado por padrão.

Nome da opção Recurso Android Linux Mac OS janelas
TFLITE_ENABLE_RUY Ativar biblioteca de multiplicação de matrizes RUY SOBRE DESLIGADO DESLIGADO DESLIGADO
TFLITE_ENABLE_NNAPI Ativar delegado NNAPI SOBRE DESLIGADO N / D N / D
TFLITE_ENABLE_GPU Ativar delegado de GPU DESLIGADO DESLIGADO N / D N / D
TFLITE_ENABLE_XNNPACK Ativar delegado XNNPACK SOBRE SOBRE SOBRE SOBRE
TFLITE_ENABLE_MMAP Ativar MMAP SOBRE SOBRE SOBRE N / D

Crie um projeto CMake que usa o TensorFlow Lite

Aqui está o CMakeLists.txt do exemplo mínimo do TFLite .

Você precisa ter add_subdirectory() para o diretório TensorFlow Lite e vincular tensorflow-lite com 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)

Criar biblioteca TensorFlow Lite C

Se você deseja criar uma biblioteca compartilhada do TensorFlow Lite para C API , siga as etapas 1 a 3 primeiro. Depois disso, execute os seguintes comandos.

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

Este comando gera a seguinte biblioteca compartilhada no diretório atual.

Plataforma Nome da biblioteca
Linux libtensorflowlite_c.so
Mac OS libtensorflowlite_c.dylib
janelas tensorflowlite_c.dll