首页 > 解决方案 > 为 android 构建没有 ruy 的 TFLite

问题描述

我正在尝试分析DeepSpeech(使用 TensorFlow 和 TFLite 的第三方库)在 android 设备上的性能,并已成功构建它,正如他们在文档中提到的那样。

看了源码后,发现tensorflow使用谷歌的ruy作为后端进行TFLite的矩阵运算。但我还发现 TFLite 源代码中支持不同的 GEMM 库,如EigenGEMMLOWP

但是我无法找到一种方法来使用它们来构建 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 库。

标签: androidtensorflowtensorflow-litemozilla-deepspeech

解决方案


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

bazel build --define=tflite_with_ruy=false

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

在 ARM 平台上:

量化 (uint8) 量化 (int8) 漂浮
TFLITE_WITH_RUY 鲁伊 鲁伊 鲁伊
!TFLITE_WITH_RUY 宝石 鲁伊/gemmlowp* 本征
  • Ruy 如果 NEON 不可用。

在 x86 平台上:

量化 (uint8) 量化 (int8) 漂浮
(默认) 宝石 鲁伊 本征
TFLITE_X86_RUY_ENABLED && (AVGX 或以上可用) 鲁伊 鲁伊 鲁伊

在此处查看更多详细信息。


推荐阅读