¡El Día de la Comunidad de ML es el 9 de noviembre! Únase a nosotros para recibir actualizaciones de TensorFlow, JAX, y más Más información

Delegado de TensorFlow Lite Hexagon

Este documento explica cómo usar TensorFlow Lite Hexagon Delegate en tu aplicación usando la API de Java y / o C. El delegado aprovecha la biblioteca Qualcomm Hexagon para ejecutar kernels cuantificados en el DSP. Tenga en cuenta que el delegado está destinado a complementar la funcionalidad NNAPI, particularmente para dispositivos donde la aceleración NNAPI DSP no está disponible (por ejemplo, en dispositivos más antiguos o dispositivos que aún no tienen un controlador DSP NNAPI).

Dispositivos soportados:

Actualmente se admite la siguiente arquitectura Hexagon, que incluye, entre otros:

  • Hexágono 680
    • Ejemplos de SoC: Snapdragon 821, 820, 660
  • Hexágono 682
    • Ejemplos de SoC: Snapdragon 835
  • Hexágono 685
    • Ejemplos de SoC: Snapdragon 845, Snapdragon 710, QCS605, QCS603
  • Hexágono 690
    • Ejemplos de SoC: Snapdragon 855, QCS610, QCS410, RB5

Modelos compatibles:

El delegado de Hexagon admite todos los modelos que cumplen con nuestra especificación de cuantificación simétrica de 8 bits , incluidos los generados mediante la cuantificación de enteros posterior al entrenamiento . Los modelos UInt8 entrenados con la ruta de entrenamiento con reconocimiento de cuantización heredada también son compatibles, por ejemplo, estas versiones cuantificadas en nuestra página de modelos alojados.

API Java delegada de Hexagon

public class HexagonDelegate implements Delegate, Closeable {

  /*

   * Creates a new HexagonDelegate object given the current 'context'.
   * Throws UnsupportedOperationException if Hexagon DSP delegation is not
   * available on this device.
   */
  public HexagonDelegate(Context context) throws UnsupportedOperationException


  /**

   * Frees TFLite resources in C runtime.
   *
   * User is expected to call this method explicitly.
   */
  @Override
  public void close();
}

Uso de ejemplo

Paso 1. Edite app / build.gradle para usar el AAR de delegado de Hexagon nocturno

dependencies {
  ...
  implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
  implementation 'org.tensorflow:tensorflow-lite-hexagon:0.0.0-nightly-SNAPSHOT'
}

Paso 2. Agregue bibliotecas Hexagon a su aplicación de Android

  • Descargue y ejecute hexagon_nn_skel.run. Debe proporcionar 3 bibliotecas compartidas diferentes "libhexagon_nn_skel.so", "libhexagon_nn_skel_v65.so", "libhexagon_nn_skel_v66.so"

Paso 3. Crea un delegado e inicializa un intérprete de TensorFlow Lite

import org.tensorflow.lite.HexagonDelegate;

// Create the Delegate instance.
try {
  hexagonDelegate = new HexagonDelegate(activity);
  tfliteOptions.addDelegate(hexagonDelegate);
} catch (UnsupportedOperationException e) {
  // Hexagon delegate is not supported on this device.
}

tfliteInterpreter = new Interpreter(tfliteModel, tfliteOptions);

// Dispose after finished with inference.
tfliteInterpreter.close();
if (hexagonDelegate != null) {
  hexagonDelegate.close();
}

API de Hexagon delegate C

struct TfLiteHexagonDelegateOptions {
  // This corresponds to the debug level in the Hexagon SDK. 0 (default)
  // means no debug.
  int debug_level;
  // This corresponds to powersave_level in the Hexagon SDK.
  // where 0 (default) means high performance which means more power
  // consumption.
  int powersave_level;
  // If set to true, performance information about the graph will be dumped
  // to Standard output, this includes cpu cycles.
  // WARNING: Experimental and subject to change anytime.
  bool print_graph_profile;
  // If set to true, graph structure will be dumped to Standard output.
  // This is usually beneficial to see what actual nodes executed on
  // the DSP. Combining with 'debug_level' more information will be printed.
  // WARNING: Experimental and subject to change anytime.
  bool print_graph_debug;
};

// Return a delegate that uses Hexagon SDK for ops execution.
// Must outlive the interpreter.
TfLiteDelegate*
TfLiteHexagonDelegateCreate(const TfLiteHexagonDelegateOptions* options);

// Do any needed cleanup and delete 'delegate'.
void TfLiteHexagonDelegateDelete(TfLiteDelegate* delegate);

// Initializes the DSP connection.
// This should be called before doing any usage of the delegate.
// "lib_directory_path": Path to the directory which holds the
// shared libraries for the Hexagon NN libraries on the device.
void TfLiteHexagonInitWithPath(const char* lib_directory_path);

// Same as above method but doesn't accept the path params.
// Assumes the environment setup is already done. Only initialize Hexagon.
Void TfLiteHexagonInit();

// Clean up and switch off the DSP connection.
// This should be called after all processing is done and delegate is deleted.
Void TfLiteHexagonTearDown();

Uso de ejemplo

Paso 1. Edite app / build.gradle para usar el AAR de delegado de Hexagon nocturno

dependencies {
  ...
  implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
  implementation 'org.tensorflow:tensorflow-lite-hexagon:0.0.0-nightly-SNAPSHOT'
}

Paso 2. Agregue bibliotecas Hexagon a su aplicación de Android

  • Descargue y ejecute hexagon_nn_skel.run. Debe proporcionar 3 bibliotecas compartidas diferentes "libhexagon_nn_skel.so", "libhexagon_nn_skel_v65.so", "libhexagon_nn_skel_v66.so"

Paso 3. Incluya el encabezado C

  • El archivo de encabezado "hexagon_delegate.h" se puede descargar de GitHub o extraer del AAR del delegado de Hexagon.

Paso 4. Crea un delegado e inicializa un intérprete de TensorFlow Lite

  • En su código, asegúrese de que la biblioteca nativa de Hexagon esté cargada. Esto se puede hacer llamando a System.loadLibrary("tensorflowlite_hexagon_jni");
    en su actividad o punto de entrada de Java.

  • Crea un delegado, ejemplo:

#include "tensorflow/lite/delegates/hexagon/hexagon_delegate.h"

// Assuming shared libraries are under "/data/local/tmp/"
// If files are packaged with native lib in android App then it
// will typically be equivalent to the path provided by
// "getContext().getApplicationInfo().nativeLibraryDir"
const char[] library_directory_path = "/data/local/tmp/";
TfLiteHexagonInitWithPath(library_directory_path);  // Needed once at startup.
::tflite::TfLiteHexagonDelegateOptions params = {0};
// 'delegate_ptr' Need to outlive the interpreter. For example,
// If use case will need to resize input or anything that can trigger
// re-applying delegates then 'delegate_ptr' need to outlive the interpreter.
auto* delegate_ptr = ::tflite::TfLiteHexagonDelegateCreate(&params);
Interpreter::TfLiteDelegatePtr delegate(delegate_ptr,
  [](TfLiteDelegate* delegate) {
    ::tflite::TfLiteHexagonDelegateDelete(delegate);
  });
interpreter->ModifyGraphWithDelegate(delegate.get());
// After usage of delegate.
TfLiteHexagonTearDown();  // Needed once at end of app/DSP usage.

Agrega la biblioteca compartida a tu aplicación

  • Cree la carpeta "app / src / main / jniLibs" y cree un directorio para cada arquitectura de destino. Por ejemplo,
    • ARM de 64 bits: app/src/main/jniLibs/arm64-v8a
    • ARM de 32 bits: app/src/main/jniLibs/armeabi-v7a
  • Coloque su .so en el directorio que coincida con la arquitectura.

Realimentación

Para problemas, cree un problema de GitHub con todos los detalles de reproducción necesarios, incluido el modelo de teléfono y la placa utilizada ( adb shell getprop ro.product.device y adb shell getprop ro.board.platform ).

Preguntas más frecuentes

  • ¿Qué operaciones apoya el delegado?
  • ¿Cómo puedo saber que el modelo está usando el DSP cuando habilito el delegado?
    • Se imprimirán dos mensajes de registro cuando habilite el delegado: uno para indicar si se creó el delegado y otro para indicar cuántos nodos se están ejecutando utilizando el delegado.
      Created TensorFlow Lite delegate for Hexagon.
      Hexagon delegate: X nodes delegated out of Y nodes.
  • ¿Necesito que todas las operaciones del modelo sean compatibles para ejecutar el delegado?
    • No, el modelo se dividirá en subgrafos según las operaciones admitidas. Todas las operaciones no admitidas se ejecutarán en la CPU.
  • ¿Cómo puedo crear el AAR delegado de Hexagon desde la fuente?
    • Utilice bazel build -c opt --config=android_arm64 tensorflow/lite/delegates/hexagon/java:tensorflow-lite-hexagon .
  • ¿Por qué el delegado de Hexagon no se inicializa aunque mi dispositivo Android tiene un SoC compatible?
    • Verifique si su dispositivo tiene un SoC compatible. Ejecute adb shell cat /proc/cpuinfo | grep Hardware y vea si devuelve algo como "Hardware: Qualcomm Technologies, Inc MSMXXXX".
    • Algunos fabricantes de teléfonos utilizan diferentes SoC para el mismo modelo de teléfono. Por lo tanto, el delegado de Hexagon solo puede funcionar en algunos dispositivos del mismo modelo de teléfono, pero no en todos.
    • Algunos fabricantes de teléfonos restringen intencionalmente el uso de Hexagon DSP de aplicaciones de Android que no son del sistema, lo que hace que el delegado de Hexagon no pueda trabajar.
  • Mi teléfono ha bloqueado el acceso a DSP. Rooteé el teléfono y todavía no puedo ejecutar el delegado, ¿qué hacer?
    • Asegúrese de deshabilitar la aplicación de SELinux ejecutando adb shell setenforce 0