在Android上使用带有TFLite C++API的ARM Neon加速



我正试图在Android设备上利用Neon加速进行TFLite推理。虽然这对于Java来说似乎已经有了很好的文档,而且很简单,但我可以使用帮助来开始使用C++API。我是新手,所以如果答案很明显,我很抱歉。

TensorFlow Lite库包含Neon的源代码https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/kernels,但我想知道如何以及在哪里包含和使用它。

设备规格为:处理器八核,2000 MHz,ARM Cortex-A75和ARM Cortex-A 53,64位,10 nm。CPU(2x2.0 GHz 360金和6x1.7 GHz Kryo 360银(;GPU Adreno 615。

到目前为止我尝试过的:我从更改了build.gradle文件

android {
externalNativeBuild {
cmake {
path file('CMakeLists.txt')
}
}

android {
defaultConfig {
externalNativeBuild {
cmake {
arguments "-DANDROID_ARM_NEON=TRUE"
}
}
externalNativeBuild {
cmake {
path file('CMakeLists.txt')
}
}

然后,推理花了和以前一样长的时间,推理完成后我得到了以下错误:

A/libc: Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x753b9d3000 in tid 9935 (m.example.test2), pid 9935 (m.example.test2)

您可以选择使用XNNPACK委托,如果您的CPU有它,它会主动使用ARM NEON优化的内核。

https://blog.tensorflow.org/2020/07/accelerating-tensorflow-lite-xnnpack-integration.html

通过设置博客文章中解释的布尔标志,使用Java/Oj-C/Swift API启用XNNPACK要容易得多。如果你出于某种原因需要直接使用C++,你可以这样做:

#include "tensorflow/lite/delegates/xnnpack/xnnpack_delegate.h"
// ...
TfLiteXNNPackDelegateOptions options = TfLiteXNNPackDelegateOptionsDefault();
// options.num_threads = <desired_num_threads>;
tflite::Interpreter::TfLiteDelegatePtr delegate(
TfLiteXNNPackDelegateCreate(&options),
[](TfLiteDelegate* delegate) { TfLiteXNNPackDelegateDelete(delegate); });
auto status = interpreter->ModifyGraphWithDelegate(std::move(delegate));
// check on the returned status code ...

另请参阅Java API如何在内部调用C++API以启用XNNPack委托。

最新更新