Delegado do TensorFlow Lite Hexagon,Delegado do TensorFlow Lite Hexagon

Este documento explica como usar o TensorFlow Lite Hexagon Delegate em seu aplicativo usando a API Java e/ou C. O delegado aproveita a biblioteca Qualcomm Hexagon para executar kernels quantizados no DSP. Observe que o delegado se destina a complementar a funcionalidade NNAPI, especialmente para dispositivos onde a aceleração NNAPI DSP não está disponível (por exemplo, em dispositivos mais antigos ou dispositivos que ainda não possuem um driver DSP NNAPI).

Dispositivos suportados:

Atualmente, a seguinte arquitetura Hexagon é suportada, incluindo, mas não se limitando a:

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

Modelos suportados:

O delegado Hexagon oferece suporte a todos os modelos que estão em conformidade com nossa especificação de quantização simétrica de 8 bits , incluindo aqueles gerados usando quantização de inteiros pós-treinamento . Os modelos UInt8 treinados com o caminho de treinamento legado com reconhecimento de quantização também são suportados, por exemplo, essas versões quantizadas em nossa página Modelos hospedados.

API Java delegada 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();
}

Exemplo de uso

Etapa 1. Edite app/build.gradle para usar o AAR delegado Hexagon noturno

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

Etapa 2. Adicione bibliotecas Hexagon ao seu aplicativo Android

  • Baixe e execute hexagon_nn_skel.run. Deve fornecer 3 bibliotecas compartilhadas diferentes “libhexagon_nn_skel.so”, “libhexagon_nn_skel_v65.so”, “libhexagon_nn_skel_v66.so”

Etapa 3. Crie um delegado e inicialize um interpretador 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 C do delegado hexágono

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();

Exemplo de uso

Etapa 1. Edite app/build.gradle para usar o AAR delegado Hexagon noturno

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

Etapa 2. Adicione bibliotecas Hexagon ao seu aplicativo Android

  • Baixe e execute hexagon_nn_skel.run. Deve fornecer 3 bibliotecas compartilhadas diferentes “libhexagon_nn_skel.so”, “libhexagon_nn_skel_v65.so”, “libhexagon_nn_skel_v66.so”

Etapa 3. Incluir o cabeçalho C

  • O arquivo de cabeçalho "hexagon_delegate.h" pode ser baixado do GitHub ou extraído do delegado AAR da Hexagon.

Etapa 4. Crie um delegado e inicialize um interpretador TensorFlow Lite

  • Em seu código, certifique-se de que a biblioteca Hexagon nativa esteja carregada. Isso pode ser feito chamando System.loadLibrary("tensorflowlite_hexagon_jni");
    em sua atividade ou ponto de entrada Java.

  • Crie um delegado, exemplo:

#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 your use case requires resizing the input or anything that can trigger
// re-applying delegates then 'delegate_ptr' must 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.

Adicione a biblioteca compartilhada ao seu aplicativo

  • Crie a pasta “app/src/main/jniLibs” e crie um diretório para cada arquitetura alvo. Por exemplo,
    • ARM de 64 bits: app/src/main/jniLibs/arm64-v8a
    • ARM de 32 bits: app/src/main/jniLibs/armeabi-v7a
  • Coloque seu .so no diretório que corresponde à arquitetura.

Opinião

Para problemas, crie um problema no GitHub com todos os detalhes de reprodução necessários, incluindo o modelo do telefone e a placa usada ( adb shell getprop ro.product.device e adb shell getprop ro.board.platform ).

Perguntas frequentes

  • Quais operações são apoiadas pelo delegado?
  • Como posso saber se o modelo está usando o DSP quando habilito o delegado?
    • Duas mensagens de log serão impressas quando você ativar o delegado - uma para indicar se o delegado foi criado e outra para indicar quantos nós estão em execução usando o delegado.
      Created TensorFlow Lite delegate for Hexagon.
      Hexagon delegate: X nodes delegated out of Y nodes.
  • Preciso que todas as operações do modelo tenham suporte para executar o delegado?
    • Não, o modelo será particionado em subgráficos com base nas operações suportadas. Quaisquer operações não suportadas serão executadas na CPU.
  • Como posso construir o AAR delegado Hexagon a partir da fonte?
    • Use bazel build -c opt --config=android_arm64 tensorflow/lite/delegates/hexagon/java:tensorflow-lite-hexagon .
  • Por que o delegado Hexagon não consegue inicializar embora meu dispositivo Android tenha um SoC compatível?
    • Verifique se o seu dispositivo realmente possui um SoC compatível. Execute adb shell cat /proc/cpuinfo | grep Hardware e veja se ele retorna algo como "Hardware: Qualcomm Technologies, Inc MSMXXXX".
    • Alguns fabricantes de telefones usam SoCs diferentes para o mesmo modelo de telefone. Portanto, o delegado Hexagon pode funcionar apenas em alguns, mas não em todos os dispositivos do mesmo modelo de telefone.
    • Alguns fabricantes de telefones restringem intencionalmente o uso do Hexagon DSP em aplicativos Android que não sejam do sistema, impossibilitando o funcionamento do delegado Hexagon.
  • Meu telefone bloqueou o acesso DSP. Fiz root no telefone e ainda não consigo executar o delegado, o que fazer?
    • Certifique-se de desabilitar a aplicação do SELinux executando adb shell setenforce 0
,

Este documento explica como usar o TensorFlow Lite Hexagon Delegate em seu aplicativo usando a API Java e/ou C. O delegado aproveita a biblioteca Qualcomm Hexagon para executar kernels quantizados no DSP. Observe que o delegado se destina a complementar a funcionalidade NNAPI, especialmente para dispositivos onde a aceleração NNAPI DSP não está disponível (por exemplo, em dispositivos mais antigos ou dispositivos que ainda não possuem um driver DSP NNAPI).

Dispositivos suportados:

Atualmente, a seguinte arquitetura Hexagon é suportada, incluindo, mas não se limitando a:

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

Modelos suportados:

O delegado Hexagon oferece suporte a todos os modelos que estão em conformidade com nossa especificação de quantização simétrica de 8 bits , incluindo aqueles gerados usando quantização de inteiros pós-treinamento . Os modelos UInt8 treinados com o caminho de treinamento legado com reconhecimento de quantização também são suportados, por exemplo, essas versões quantizadas em nossa página Modelos hospedados.

API Java delegada 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();
}

Exemplo de uso

Etapa 1. Edite app/build.gradle para usar o AAR delegado Hexagon noturno

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

Etapa 2. Adicione bibliotecas Hexagon ao seu aplicativo Android

  • Baixe e execute hexagon_nn_skel.run. Deve fornecer 3 bibliotecas compartilhadas diferentes “libhexagon_nn_skel.so”, “libhexagon_nn_skel_v65.so”, “libhexagon_nn_skel_v66.so”

Etapa 3. Crie um delegado e inicialize um interpretador 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 C do delegado hexágono

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();

Exemplo de uso

Etapa 1. Edite app/build.gradle para usar o AAR delegado Hexagon noturno

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

Etapa 2. Adicione bibliotecas Hexagon ao seu aplicativo Android

  • Baixe e execute hexagon_nn_skel.run. Deve fornecer 3 bibliotecas compartilhadas diferentes “libhexagon_nn_skel.so”, “libhexagon_nn_skel_v65.so”, “libhexagon_nn_skel_v66.so”

Etapa 3. Incluir o cabeçalho C

  • O arquivo de cabeçalho "hexagon_delegate.h" pode ser baixado do GitHub ou extraído do delegado AAR da Hexagon.

Etapa 4. Crie um delegado e inicialize um interpretador TensorFlow Lite

  • Em seu código, certifique-se de que a biblioteca Hexagon nativa esteja carregada. Isso pode ser feito chamando System.loadLibrary("tensorflowlite_hexagon_jni");
    em sua atividade ou ponto de entrada Java.

  • Crie um delegado, exemplo:

#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 your use case requires resizing the input or anything that can trigger
// re-applying delegates then 'delegate_ptr' must 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.

Adicione a biblioteca compartilhada ao seu aplicativo

  • Crie a pasta “app/src/main/jniLibs” e crie um diretório para cada arquitetura alvo. Por exemplo,
    • ARM de 64 bits: app/src/main/jniLibs/arm64-v8a
    • ARM de 32 bits: app/src/main/jniLibs/armeabi-v7a
  • Coloque seu .so no diretório que corresponde à arquitetura.

Opinião

Para problemas, crie um problema no GitHub com todos os detalhes de reprodução necessários, incluindo o modelo do telefone e a placa usada ( adb shell getprop ro.product.device e adb shell getprop ro.board.platform ).

Perguntas frequentes

  • Quais operações são apoiadas pelo delegado?
  • Como posso saber se o modelo está usando o DSP quando habilito o delegado?
    • Duas mensagens de log serão impressas quando você habilitar o delegado - uma para indicar se o delegado foi criado e outra para indicar quantos nós estão em execução usando o delegado.
      Created TensorFlow Lite delegate for Hexagon.
      Hexagon delegate: X nodes delegated out of Y nodes.
  • Preciso que todas as operações do modelo tenham suporte para executar o delegado?
    • Não, o modelo será particionado em subgráficos com base nas operações suportadas. Quaisquer operações não suportadas serão executadas na CPU.
  • Como posso construir o AAR delegado Hexagon a partir da fonte?
    • Use bazel build -c opt --config=android_arm64 tensorflow/lite/delegates/hexagon/java:tensorflow-lite-hexagon .
  • Por que o delegado Hexagon não consegue inicializar embora meu dispositivo Android tenha um SoC compatível?
    • Verifique se o seu dispositivo realmente possui um SoC compatível. Execute adb shell cat /proc/cpuinfo | grep Hardware e veja se ele retorna algo como "Hardware: Qualcomm Technologies, Inc MSMXXXX".
    • Alguns fabricantes de telefones usam SoCs diferentes para o mesmo modelo de telefone. Portanto, o delegado Hexagon pode funcionar apenas em alguns, mas não em todos os dispositivos do mesmo modelo de telefone.
    • Alguns fabricantes de telefones restringem intencionalmente o uso do Hexagon DSP em aplicativos Android que não sejam do sistema, impossibilitando o funcionamento do delegado Hexagon.
  • Meu telefone bloqueou o acesso DSP. Fiz root no telefone e ainda não consigo executar o delegado, o que fazer?
    • Certifique-se de desabilitar a aplicação do SELinux executando adb shell setenforce 0