本文档介绍了如何在应用程序中使用 Java 和/或 C API 使用 TensorFlow Lite 六边形委托。该委托利用 Qualcomm 六边形库在 DSP 上执行量化内核。请注意,该委托旨在补充 NNAPI 功能,特别是对于 NNAPI DSP 加速不可用(例如,在旧设备上或尚未配备 DSP NNAPI 驱动程序的设备上)的设备。
支持的设备
目前支持以下六边形架构,包括但不限于
- 六边形 680
- SoC 示例:骁龙 821、820、660
- 六边形 682
- SoC 示例:骁龙 835
- 六边形 685
- SoC 示例:骁龙 845、骁龙 710、QCS410、QCS610、QCS605、QCS603
- 六边形 690
- SoC 示例:骁龙 855、RB5
支持的模型
六边形委托支持所有符合我们 8 位对称量化规范 的模型,包括使用 训练后整数量化 生成的模型。使用传统 量化感知训练 路径训练的 UInt8 模型也受支持,例如,这些量化版本 在我们的托管模型页面上。
六边形委托 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
dependencies {
...
implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
implementation 'org.tensorflow:tensorflow-lite-hexagon:0.0.0-nightly-SNAPSHOT'
}
步骤 2. 将六边形库添加到您的 Android 应用程序
- 下载并运行 hexagon_nn_skel.run。它应该提供 3 个不同的共享库“libhexagon_nn_skel.so”、“libhexagon_nn_skel_v65.so”、“libhexagon_nn_skel_v66.so”
- 将所有 3 个库与其他共享库一起包含在您的应用程序中。请参阅 如何将共享库添加到您的应用程序。委托将根据设备自动选择性能最佳的库。
步骤 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
dependencies {
...
implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly-SNAPSHOT'
implementation 'org.tensorflow:tensorflow-lite-hexagon:0.0.0-nightly-SNAPSHOT'
}
步骤 2. 将六边形库添加到您的 Android 应用程序
- 下载并运行 hexagon_nn_skel.run。它应该提供 3 个不同的共享库“libhexagon_nn_skel.so”、“libhexagon_nn_skel_v65.so”、“libhexagon_nn_skel_v66.so”
- 将所有 3 个库与其他共享库一起包含在您的应用程序中。请参阅 如何将共享库添加到您的应用程序。委托将根据设备自动选择性能最佳的库。
步骤 3. 包含 C 头文件
- 头文件 "hexagon_delegate.h" 可以从 GitHub 下载,也可以从 Hexagon 代理 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 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(¶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?
- 启用代理时会打印两条日志消息 - 一条指示代理是否已创建,另一条指示使用代理运行了多少个节点。
已创建用于 Hexagon 的 TensorFlow Lite 代理。
Hexagon 代理:Y 个节点中的 X 个节点已委托。
- 启用代理时会打印两条日志消息 - 一条指示代理是否已创建,另一条指示使用代理运行了多少个节点。
- 模型中是否需要所有操作都受支持才能运行代理?
- 不需要,模型将根据支持的操作划分为子图。任何不受支持的操作将在 CPU 上运行。
- 如何从源代码构建 Hexagon 代理 AAR?
- 使用
bazel build -c opt --config=android_arm64 tensorflow/lite/delegates/hexagon/java:tensorflow-lite-hexagon
。
- 使用
- 为什么我的 Android 设备具有支持的 SoC,但 Hexagon 代理无法初始化?
- 验证您的设备是否确实具有支持的 SoC。运行
adb shell cat /proc/cpuinfo | grep Hardware
并查看它是否返回类似于 "Hardware : Qualcomm Technologies, Inc MSMXXXX" 的内容。 - 一些手机制造商对同一手机型号使用不同的 SoC。因此,Hexagon 代理可能只在某些设备上工作,而不在同一手机型号的所有设备上工作。
- 一些手机制造商有意限制非系统 Android 应用程序使用 Hexagon DSP,导致 Hexagon 代理无法工作。
- 验证您的设备是否确实具有支持的 SoC。运行
- 我的手机锁定了 DSP 访问权限。我已经 root 了手机,但仍然无法运行代理,该怎么办?
- 确保通过运行
adb shell setenforce 0
禁用 SELinux 强制执行。
- 确保通过运行