يشرح هذا المستند كيفية استخدام TensorFlow Lite Hexagon Delegate في تطبيقك باستخدام 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 و QCS410 و QCS610 و QCS605 و QCS603
- مسدس 690
- أمثلة على SoC: Snapdragon 855 ، RB5
الموديلات المدعومة:
يدعم مندوب Hexagon جميع النماذج التي تتوافق مع مواصفات التكميم المتماثل 8 بت ، بما في ذلك تلك التي تم إنشاؤها باستخدام تكميم صحيح بعد التدريب . يتم أيضًا دعم نماذج UInt8 المدربة على مسار التدريب القديم المدرك للتكميم ، على سبيل المثال ، هذه الإصدارات الكمية على صفحة النماذج المستضافة لدينا.
مندوب 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();
}
مثال على الاستخدام
الخطوة الأولى: قم بتحرير app / build.gradle لاستخدام مندوب Hexagon الليلي AAR
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();
مثال على الاستخدام
الخطوة الأولى: قم بتحرير app / build.gradle لاستخدام مندوب Hexagon الليلي AAR
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 أو استخراجه من مندوب Hexagon AAR.
الخطوة 4. إنشاء مندوب وتهيئة مترجم TensorFlow Lite
في التعليمات البرمجية الخاصة بك ، تأكد من تحميل مكتبة Hexagon الأصلية. يمكن القيام بذلك عن طريق استدعاء
System.loadLibrary("tensorflowlite_hexagon_jni");
في نشاطك أو نقطة دخول 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(¶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.
أضف المكتبة المشتركة إلى تطبيقك
- أنشئ مجلدًا "app / src / main / jniLibs" ، وأنشئ دليلًا لكل بنية مستهدفة. فمثلا،
- ARM 64 بت:
app/src/main/jniLibs/arm64-v8a
- ARM 32 بت:
app/src/main/jniLibs/armeabi-v7a
- ARM 64 بت:
- ضع .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 من المصدر؟
- استخدم
bazel build -c opt --config=android_arm64 tensorflow/lite/delegates/hexagon/java:tensorflow-lite-hexagon
.
- استخدم
- لماذا يفشل مندوب Hexagon في التهيئة على الرغم من أن جهازي الذي يعمل بنظام Android يحتوي على SoC مدعوم؟
- تحقق مما إذا كان جهازك يحتوي بالفعل على شركة نفط الجنوب مدعومة. قم بتشغيل
adb shell cat /proc/cpuinfo | grep Hardware
ومعرفة ما إذا كانت تُرجع شيئًا مثل "Hardware: Qualcomm Technologies، Inc MSMXXXX". - تستخدم بعض الشركات المصنعة للهواتف SoCs مختلفة لنفس طراز الهاتف. لذلك ، قد يعمل مندوب Hexagon فقط على بعض الأجهزة من طراز الهاتف نفسه وليس جميعها.
- تقوم بعض الشركات المصنعة للهواتف بتقييد استخدام Hexagon DSP عمدًا من تطبيقات Android غير التابعة للنظام ، مما يجعل مندوب Hexagon غير قادر على العمل.
- تحقق مما إذا كان جهازك يحتوي بالفعل على شركة نفط الجنوب مدعومة. قم بتشغيل
- قام هاتفي بتأمين الوصول إلى DSP. لقد قمت بتجذير الهاتف وما زلت لا أستطيع تشغيل المندوب ، ماذا أفعل؟
- تأكد من تعطيل فرض SELinux عن طريق تشغيل
adb shell setenforce 0
- تأكد من تعطيل فرض SELinux عن طريق تشغيل