为 android 构建没有 ruy 的 TFLite

Build TFLite without ruy for android

我正在尝试分析 DeepSpeech's (a third-party library that uses TensorFlow and TFLite) performance on android devices and had built it successfully as they mentioned in their docs

看了源码后发现tensorflow在TFLite源码中使用了Google's ruy as the back-end for matrix operations for TFLite. But I also found out that there is support for different GEMM libraries like Eigen and GEMMLOWP

但我找不到使用它们构建 TFLite 的方法。

如何使用它们代替 ruy?

我的构建命令与DeepSpeech docs中的命令几乎相同。

bazel build --jobs 5 --workspace_status_command="bash native_client/bazel_workspace_status_cmd.sh" --config=monolithic --config=android --config=android_arm64 --define=runtime=tflite --action_env ANDROID_NDK_API_LEVEL=21 --cxxopt=-std=c++14 --copt=-D_GLIBCXX_USE_C99 --copt=-g --cxxopt=-g //native_client:libdeepspeech.so

修改后台库的命令需要修改什么?

请注意,我构建库没有问题,我可以成功构建它,对我来说效果很好。我想更改TFLite 的后端GEMM 库。

我没有测试过 DeepSpeech 库编译,但以下 bazel 标志可以禁用 RUY 以通过 bazel 工具为 TensorFlow Lite 库编译启用其他 GEMM 库。

bazel build --define=tflite_with_ruy=false

下表总结了 TensorFlow Lite 内核如何根据上述构建标志选择 GEMM 库:

在 ARM 平台上:

Quantized (uint8) Quantized (int8) Float
TFLITE_WITH_RUY Ruy Ruy Ruy
!TFLITE_WITH_RUY gemmlowp Ruy/gemmlowp* eigen
  • 如果 NEON 不可用,请联系。

在 x86 平台上:

Quantized (uint8) Quantized (int8) Float
(default) gemmlowp Ruy eigen
TFLITE_X86_RUY_ENABLED && (AVGX or above available) Ruy Ruy Ruy

here 查看更多详细信息。