Bantuan melindungi Great Barrier Reef dengan TensorFlow pada Kaggle Bergabung Tantangan

Delegasi TensorFlow Lite Hexagon

Dokumen ini menjelaskan cara menggunakan TensorFlow Lite Hexagon Delegate di aplikasi Anda menggunakan Java dan/atau C API. Delegasi memanfaatkan pustaka Qualcomm Hexagon untuk mengeksekusi kernel terkuantisasi pada DSP. Perhatikan bahwa delegasi ini dimaksudkan untuk melengkapi fungsi NNAPI, terutama untuk perangkat di mana percepatan NNAPI DSP tidak tersedia (misalnya, pada perangkat yang lebih tua, atau perangkat yang belum memiliki driver DSP NNAPI).

Perangkat yang didukung:

Saat ini arsitektur Hexagon berikut didukung, termasuk namun tidak terbatas pada:

  • segi enam 680
    • Contoh SoC: Snapdragon 821, 820, 660
  • segi enam 682
    • Contoh SoC: Snapdragon 835
  • segi enam 685
    • Contoh SoC: Snapdragon 845, Snapdragon 710, QCS605, QCS603
  • segi enam 690
    • Contoh SoC: Snapdragon 855, QCS610, QCS410, RB5

Model yang didukung:

Hexagon delegasi mendukung semua model yang sesuai dengan kami 8-bit simetris kuantisasi spesifikasi , termasuk yang dihasilkan menggunakan pasca-pelatihan bilangan bulat kuantisasi . Model uint8 dilatih dengan warisan pelatihan kuantisasi-sadar jalan juga didukung, untuk misalnya, ini versi terkuantisasi pada halaman Model Hosted kami.

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

Contoh penggunaan

Langkah 1. Edit app/build.gradle untuk menggunakan delegasi Hexagon malam AAR

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

Langkah 2. Tambahkan perpustakaan Hexagon ke aplikasi Android Anda

  • Unduh dan jalankan hexagon_nn_skel.run. Itu harus menyediakan 3 perpustakaan bersama yang berbeda "libhexagon_nn_skel.so", "libhexagon_nn_skel_v65.so", "libhexagon_nn_skel_v66.so"

Langkah 3. Buat delegasi dan inisialisasi Penerjemah 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();
}

Delegasi segi enam 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();

Contoh penggunaan

Langkah 1. Edit app/build.gradle untuk menggunakan delegasi Hexagon malam AAR

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

Langkah 2. Tambahkan perpustakaan Hexagon ke aplikasi Android Anda

  • Unduh dan jalankan hexagon_nn_skel.run. Itu harus menyediakan 3 perpustakaan bersama yang berbeda "libhexagon_nn_skel.so", "libhexagon_nn_skel_v65.so", "libhexagon_nn_skel_v66.so"

Langkah 3. Sertakan header C

  • File header "hexagon_delegate.h" dapat didownload dari GitHub atau diekstrak dari Hexagon delegasi AAR.

Langkah 4. Buat delegasi dan inisialisasi Penerjemah TensorFlow Lite

  • Dalam kode Anda, pastikan pustaka Hexagon asli dimuat. Hal ini dapat dilakukan dengan memanggil System.loadLibrary("tensorflowlite_hexagon_jni");
    di titik masuk Aktivitas atau Java Anda.

  • Buat delegasi, contoh:

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

Tambahkan perpustakaan bersama ke aplikasi Anda

  • Buat folder “app/src/main/jniLibs”, dan buat direktori untuk setiap arsitektur target. Sebagai contoh,
    • ARM 64-bit: app/src/main/jniLibs/arm64-v8a
    • ARM 32-bit: app/src/main/jniLibs/armeabi-v7a
  • Letakkan .so Anda di direktori yang sesuai dengan arsitekturnya.

Masukan

Untuk masalah, silahkan buat GitHub masalah dengan semua rincian repro yang diperlukan, termasuk model telepon dan papan yang digunakan ( adb shell getprop ro.product.device dan adb shell getprop ro.board.platform ).

FAQ

  • Operasi mana yang didukung oleh delegasi?
  • Bagaimana saya bisa tahu bahwa model menggunakan DSP ketika saya mengaktifkan delegasi?
    • Dua pesan log akan dicetak saat Anda mengaktifkan delegasi - satu untuk menunjukkan apakah delegasi telah dibuat dan satu lagi untuk menunjukkan berapa banyak node yang berjalan menggunakan delegasi.
      Created TensorFlow Lite delegate for Hexagon.
      Hexagon delegate: X nodes delegated out of Y nodes.
  • Apakah saya memerlukan semua Ops dalam model yang didukung untuk menjalankan delegasi?
    • Tidak, Model akan dipartisi menjadi subgraf berdasarkan operasi yang didukung. Operasi apa pun yang tidak didukung akan berjalan di CPU.
  • Bagaimana saya bisa membangun AAR delegasi Hexagon dari sumber?
    • Gunakan bazel build -c opt --config=android_arm64 tensorflow/lite/delegates/hexagon/java:tensorflow-lite-hexagon .
  • Mengapa delegasi Hexagon gagal untuk menginisialisasi meskipun perangkat Android saya memiliki SoC yang didukung?
    • Verifikasi apakah perangkat Anda memang memiliki SoC yang didukung. Jalankan adb shell cat /proc/cpuinfo | grep Hardware dan melihat apakah ia mengembalikan sesuatu seperti "Hardware: Qualcomm Technologies, Inc MSMXXXX".
    • Beberapa produsen ponsel menggunakan SoC yang berbeda untuk model ponsel yang sama. Oleh karena itu, delegasi Hexagon hanya dapat bekerja pada beberapa tetapi tidak semua perangkat dengan model telepon yang sama.
    • Beberapa produsen ponsel sengaja membatasi penggunaan Hexagon DSP dari aplikasi Android non-sistem, membuat delegasi Hexagon tidak dapat bekerja.
  • Ponsel saya telah mengunci akses DSP. Saya melakukan root pada telepon dan masih tidak dapat menjalankan delegasi, apa yang harus dilakukan?
    • Pastikan untuk SELinux menonaktifkan menegakkan dengan menjalankan adb shell setenforce 0