Ten dokument wyjaśnia, jak używać TensorFlow Lite Hexagon Delegate w aplikacji przy użyciu Java i/lub C API. Delegat wykorzystuje bibliotekę Qualcomm Hexagon do wykonywania skwantyzowanych jąder na DSP. Należy zauważyć, że delegat ma na celu uzupełnienie funkcjonalności NNAPI, szczególnie w przypadku urządzeń, w których akceleracja NNAPI DSP jest niedostępna (np. na starszych urządzeniach lub urządzeniach, które nie mają jeszcze sterownika DSP NNAPI).
Wspierane urządzenia:
Obecnie obsługiwana jest następująca architektura Hexagon, w tym między innymi:
- Sześciokąt 680
- Przykłady SoC: Snapdragon 821, 820, 660
- Sześciokąt 682
- Przykłady SoC: Snapdragon 835
- Sześciokąt 685
- Przykłady SoC: Snapdragon 845, Snapdragon 710, QCS410, QCS610, QCS605, QCS603
- Sześciokąt 690
- Przykłady SoC: Snapdragon 855, RB5
Obsługiwane modele:
Delegat Hexagon obsługuje wszystkie modele, które są zgodne z naszą 8-bitową specyfikacją kwantyzacji symetrycznej , w tym te wygenerowane za pomocą kwantyzacji liczb całkowitych po szkoleniu . Modele UInt8 wytrenowane za pomocą starszej ścieżki szkoleniowej uwzględniającej kwantyzację są również obsługiwane, na przykład te skwantyzowane wersje na naszej stronie Hosted Models.
Sześciokątna delegacja 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();
}
Przykładowe użycie
Krok 1. Edytuj app/build.gradle, aby użyć nocnego delegata Hexagon AAR
dependencies {
...
implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
implementation 'org.tensorflow:tensorflow-lite-hexagon:0.0.0-nightly-SNAPSHOT'
}
Krok 2. Dodaj biblioteki Hexagon do swojej aplikacji na Androida
- Pobierz i uruchom hexagon_nn_skel.run. Powinien zawierać 3 różne biblioteki współdzielone „libhexagon_nn_skel.so”, „libhexagon_nn_skel_v65.so”, „libhexagon_nn_skel_v66.so”
- Uwzględnij wszystkie 3 w swojej aplikacji wraz z innymi bibliotekami udostępnionymi. Zobacz Jak dodać bibliotekę udostępnioną do swojej aplikacji . W zależności od urządzenia delegat automatycznie wybierze ten, który ma najlepszą wydajność.
Krok 3. Utwórz delegata i zainicjuj interpreter 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();
}
Sześciokątny delegat 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();
Przykładowe użycie
Krok 1. Edytuj app/build.gradle, aby użyć nocnego delegata Hexagon AAR
dependencies {
...
implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
implementation 'org.tensorflow:tensorflow-lite-hexagon:0.0.0-nightly-SNAPSHOT'
}
Krok 2. Dodaj biblioteki Hexagon do swojej aplikacji na Androida
- Pobierz i uruchom hexagon_nn_skel.run. Powinien zawierać 3 różne biblioteki współdzielone „libhexagon_nn_skel.so”, „libhexagon_nn_skel_v65.so”, „libhexagon_nn_skel_v66.so”
- Uwzględnij wszystkie 3 w swojej aplikacji wraz z innymi bibliotekami udostępnionymi. Zobacz Jak dodać bibliotekę udostępnioną do swojej aplikacji . W zależności od urządzenia delegat automatycznie wybierze ten, który ma najlepszą wydajność.
Krok 3. Dołącz nagłówek C
- Plik nagłówkowy „hexagon_delegate.h” można pobrać z serwisu GitHub lub wyodrębnić z AAR delegata Hexagon.
Krok 4. Utwórz delegata i zainicjuj interpreter TensorFlow Lite
W swoim kodzie upewnij się, że natywna biblioteka Hexagon jest załadowana. Można to zrobić, wywołując
System.loadLibrary("tensorflowlite_hexagon_jni");
w punkcie wejścia Działania lub Java.Utwórz delegata, przykład:
#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(¶ms);
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.
Dodaj udostępnioną bibliotekę do swojej aplikacji
- Utwórz folder „app/src/main/jniLibs” i utwórz katalog dla każdej architektury docelowej. Na przykład,
- 64-bitowe ARM:
app/src/main/jniLibs/arm64-v8a
- 32-bitowe ARM:
app/src/main/jniLibs/armeabi-v7a
- 64-bitowe ARM:
- Umieść swój .so w katalogu, który pasuje do architektury.
Informacja zwrotna
W przypadku problemów utwórz zgłoszenie na GitHubie ze wszystkimi niezbędnymi szczegółami replikacji, w tym modelem telefonu i używaną płytą ( adb shell getprop ro.product.device
i adb shell getprop ro.board.platform
).
FAQ
- Które operacje są obsługiwane przez delegata?
- Zobacz aktualną listę obsługiwanych operacji i ograniczeń
- Jak mogę stwierdzić, że model korzysta z DSP, gdy włączam pełnomocnika?
- Po włączeniu delegata zostaną wydrukowane dwa komunikaty dziennika — jeden wskazujący, czy delegat został utworzony, a drugi wskazujący, ile węzłów działa przy użyciu delegata.
Created TensorFlow Lite delegate for Hexagon.
Hexagon delegate: X nodes delegated out of Y nodes.
- Po włączeniu delegata zostaną wydrukowane dwa komunikaty dziennika — jeden wskazujący, czy delegat został utworzony, a drugi wskazujący, ile węzłów działa przy użyciu delegata.
- Czy do uruchomienia delegata potrzebne są wszystkie operacje w modelu?
- Nie, Model zostanie podzielony na podgrafy na podstawie obsługiwanych operacji. Wszelkie nieobsługiwane operacje będą działać na procesorze.
- Jak mogę zbudować AAR z delegacją Hexagon ze źródła?
- Użyj
bazel build -c opt --config=android_arm64 tensorflow/lite/delegates/hexagon/java:tensorflow-lite-hexagon
.
- Użyj
- Dlaczego delegat Hexagon nie może się zainicjować, chociaż moje urządzenie z systemem Android ma obsługiwany SoC?
- Sprawdź, czy Twoje urządzenie rzeczywiście ma obsługiwany SoC. Uruchom
adb shell cat /proc/cpuinfo | grep Hardware
i sprawdź, czy zwraca coś w stylu „Hardware : Qualcomm Technologies, Inc MSMXXXX”. - Niektórzy producenci telefonów stosują różne SoC dla tego samego modelu telefonu. Dlatego delegat Hexagon może działać tylko na niektórych, ale nie na wszystkich urządzeniach tego samego modelu telefonu.
- Niektórzy producenci telefonów celowo ograniczają korzystanie z Hexagon DSP z niesystemowych aplikacji na Androida, przez co delegat Hexagon nie może działać.
- Sprawdź, czy Twoje urządzenie rzeczywiście ma obsługiwany SoC. Uruchom
- Mój telefon ma zablokowany dostęp do DSP. Zrootowałem telefon i nadal nie mogę uruchomić delegata, co robić?
- Pamiętaj, aby wyłączyć wymuszanie SELinux, uruchamiając
adb shell setenforce 0
- Pamiętaj, aby wyłączyć wymuszanie SELinux, uruchamiając