android - 为 android 构建没有 ruy 的 TFLite
问题描述
我正在尝试分析DeepSpeech(使用 TensorFlow 和 TFLite 的第三方库)在 android 设备上的性能,并已成功构建它,正如他们在文档中提到的那样。
看了源码后,发现tensorflow使用谷歌的ruy作为后端进行TFLite的矩阵运算。但我还发现 TFLite 源代码中支持不同的 GEMM 库,如Eigen和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 平台上:
量化 (uint8) | 量化 (int8) | 漂浮 | |
---|---|---|---|
TFLITE_WITH_RUY | 鲁伊 | 鲁伊 | 鲁伊 |
!TFLITE_WITH_RUY | 宝石 | 鲁伊/gemmlowp* | 本征 |
- Ruy 如果 NEON 不可用。
在 x86 平台上:
量化 (uint8) | 量化 (int8) | 漂浮 | |
---|---|---|---|
(默认) | 宝石 | 鲁伊 | 本征 |
TFLITE_X86_RUY_ENABLED && (AVGX 或以上可用) | 鲁伊 | 鲁伊 | 鲁伊 |
在此处查看更多详细信息。