Помогают защитить Большой Барьерный Риф с TensorFlow на Kaggle Присоединяйтесь вызов

Делегат TensorFlow Lite Hexagon

В этом документе объясняется, как использовать шестигранный делегат TensorFlow Lite в вашем приложении с помощью Java и / или C API. Делегат использует библиотеку Qualcomm Hexagon для выполнения квантованных ядер на DSP. Обратите внимание , что делегат должен дополнить функциональность NNAPI, в частности , для устройств , где ускорение NNAPI DSP недоступно (например, на старых устройствах или устройствах , которые еще не имеют драйвера DSP NNAPI).

Поддерживаемые устройства:

В настоящее время поддерживается следующая архитектура Hexagon, в том числе, но не ограничиваясь:

  • Шестиугольник 680
    • Примеры SoC: Snapdragon 821, 820, 660
  • Шестиугольник 682
    • Примеры SoC: Snapdragon 835
  • Шестиугольник 685
    • Примеры SoC: Snapdragon 845, Snapdragon 710, QCS605, QCS603
  • Шестиугольник 690
    • Примеры SoC: Snapdragon 855, QCS610, QCS410, RB5

Поддерживаемые модели:

Делегат шестигранного поддерживает все модели , которые соответствуют нашей 8-битной симметричной спецификации квантования , в том числе генерируется с использованием после обучения целочисленного квантования . Модели Uint8 тренировали с унаследованным квантованием, в курсе обучения пути также поддерживаются, например , для, этих квантованных версий на нашей странице Hosted Models.

Hexagon делегат Java API

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

Пример использования

Шаг 1. Отредактируйте app / build.gradle, чтобы использовать ночной делегат AAR Hexagon.

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

Шаг 2. Добавьте библиотеки Hexagon в свое приложение для Android.

  • Скачайте и запустите hexagon_nn_skel.run. Он должен предоставлять 3 разные разделяемые библиотеки «libhexagon_nn_skel.so», «libhexagon_nn_skel_v65.so», «libhexagon_nn_skel_v66.so»

Шаг 3. Создайте делегата и инициализируйте интерпретатор 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();
}

Шестигранный делегат C API

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

Пример использования

Шаг 1. Отредактируйте app / build.gradle, чтобы использовать ночной делегат AAR Hexagon.

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

Шаг 2. Добавьте библиотеки Hexagon в свое приложение для Android.

  • Скачайте и запустите hexagon_nn_skel.run. Он должен предоставлять 3 разные разделяемые библиотеки «libhexagon_nn_skel.so», «libhexagon_nn_skel_v65.so», «libhexagon_nn_skel_v66.so»

Шаг 3. Добавьте заголовок C

  • Файл заголовка «hexagon_delegate.h» можно загрузить с GitHub или извлечен из делегата AAR шестиугольника.

Шаг 4. Создайте делегата и инициализируйте интерпретатор TensorFlow Lite.

  • Убедитесь, что в вашем коде загружена собственная библиотека Hexagon. Это может быть сделано путем вызова System.loadLibrary("tensorflowlite_hexagon_jni");
    в вашей Activity или точке входа Java.

  • Создайте делегата, пример:

#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.

Добавьте общую библиотеку в свое приложение

  • Создайте папку «app / src / main / jniLibs» и создайте каталог для каждой целевой архитектуры. Например,
    • ARM - 64-бит: app/src/main/jniLibs/arm64-v8a
    • ARM - 32-бит: app/src/main/jniLibs/armeabi-v7a
  • Поместите ваш .so в каталог, соответствующий архитектуре.

Обратная связь

По вопросам, пожалуйста , создайте GitHub вопрос со всеми необходимыми репро деталей, в том числе модели телефона и используемую платы ( adb shell getprop ro.product.device и adb shell getprop ro.board.platform ).

часто задаваемые вопросы

  • Какие операции поддерживает делегат?
  • Как я могу узнать, что модель использует DSP, когда я включаю делегата?
    • Когда вы активируете делегат, будут напечатаны два сообщения журнала - одно, чтобы указать, был ли создан делегат, и другое, чтобы указать, сколько узлов запущено с использованием делегата.
      Created TensorFlow Lite delegate for Hexagon.
      Hexagon delegate: X nodes delegated out of Y nodes.
  • Мне нужно, чтобы все операции в модели поддерживались для запуска делегата?
    • Нет, Модель будет разбита на подграфы в зависимости от поддерживаемых операций. Любые неподдерживаемые операции будут выполняться на ЦП.
  • Как я могу создать AAR делегата Hexagon из исходников?
    • Использование bazel build -c opt --config=android_arm64 tensorflow/lite/delegates/hexagon/java:tensorflow-lite-hexagon .
  • Почему делегат Hexagon не инициализируется, хотя мое устройство Android имеет поддерживаемую SoC?
    • Убедитесь, что ваше устройство действительно поддерживает SoC. Запуск adb shell cat /proc/cpuinfo | grep Hardware и посмотреть , если он возвращает что - то вроде «Оборудование: Qualcomm Technologies, Inc MSMXXXX».
    • Некоторые производители телефонов используют разные SoC для одной и той же модели телефона. Таким образом, представитель Hexagon может работать только на некоторых, но не на всех устройствах одной модели телефона.
    • Некоторые производители телефонов намеренно ограничивают использование Hexagon DSP из несистемных приложений Android, в результате чего делегат Hexagon не может работать.
  • Мой телефон заблокировал доступ к DSP. Я рутировал телефон, но все еще не могу запустить делегата, что мне делать?
    • Убедитесь в том , чтобы отключить SELinux в жизнь, запустив adb shell setenforce 0