在Android上通过TFLite C ++ API使用ARM Neon加速

问题描述

我正在尝试在Android设备上利用Neon加速进行TFLite推理。尽管对于Java而言,这似乎有据可查且简单明了,但我可以在开始使用C ++ API时使用帮助。我对此很陌生,所以如果答案很明显,我会道歉。

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

设备规格为:处理器八核,2000 MHz,ARM Cortex-A75和ARM Cortex-A53(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拥有XNNPACK委托,它将主动使用ARM NEON优化的内核。

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

通过设置boolean标志(如博客文章中所述),使用Java / Obj-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 ...

另请参见how the Java API calls the C++ API internally启用XNNPack委托。