【发布时间】:2020-07-15 07:28:51
【问题描述】:
我目前正在努力将模型从 TensorFlow 转换为 TensorFlow Lite。我已将模型从常规 TF 1.x 会话转换为 .tflite 文件,方法是首先创建一个检查点和一个保存的失重图 (.pbtxt),然后使用 freeze_graph() 函数将模型冻结为具有图权重的 .pb ,然后最后在我的冻结模型文件上运行 tflite_convert 命令。在此过程中没有量化 - 保留了浮点数。之后,我将模型放入 Android Studio 并在配备 Adreno 506 GPU 的 Motorola Moto G7 Power 上运行它。
但是,我的原始模型与 TF Lite 运行的模型之间存在两个主要区别。我在 TF Lite 上的推理准确度大约降低了 2%(我目前正在研究这个),而且 GPU 计算比我手机上的 CPU 计算慢得多。在计算机上,GPU 计算大大加快了推理速度,但在我的手机上,GPU 上的推理速度比 CPU 慢了约 30 倍。
我发现我的手机当前运行的是 Android 9 可能存在问题,因为它仅支持 ~30 NNAPI 操作,但 Android 10 支持 ~100 (Video : @6:19),但没有没有看到关于 GPU 委托的任何类似情况。我的模型只是一个简单的 MLP,隐藏层大小为 200,我看不到它的简单操作不被支持,导致 CPU-GPU 操作切换滞后。
我的输入数组大小为 [N]x[384] 并输出大小为 [N]x[1] 的数组,其中 N 是我希望在给定时间输入的 384 大小的输入的数量。对于我输入的所有输入数组,N 都在 400-800 之间,但是我尝试使用更大的 n 来查看我注意到的减速是否可能是由于运行 GPU 推理时创建了一个委托内核。对于较大的 n,GPU 的推理时间接近 CPU,这让我认为 GPU 委托可能只是简单地依靠我手机的 CPU 进行计算。
以下是 CPU/GPU 时序与 n 大小相比的一些示例:
N = 500
CPU: 21ms
GPU: 601ms
N = 5,000
CPU: 454ms
GPU: 1004ms
N = 10,000
CPU: 949ms
GPU: 1490ms
请注意,GPU 时间似乎始终比 CPU 时间慢 480 毫秒,这让我认为这 480 毫秒用于创建委托内核,最终只是完全在 CPU 上运行推理。
我正在使用此代码创建我的 GPU 委托:
GpuDelegate delegate = new GpuDelegate();
Interpreter.Options options = (new Interpreter.Options()).addDelegate(delegate);
并使用以下代码创建和运行我的解释器:
Interpreter tfliteGPU = new Interpreter(loadedFile, options);
tfliteGPU.run(inputArray, outputArray);
我正在为 TF Lite GPU 和 TF Lite Base 使用 TF Lite Nightly 0.0.0:
implementation 'org.tensorflow:tensorflow-lite:0.0.0-nightly'
implementation 'org.tensorflow:tensorflow-lite-gpu:0.0.0-nightly'
为什么会发生这种情况?任何帮助表示赞赏!
【问题讨论】:
-
我认为花费处理时间的应该是
new Interpreter(loadedFile, options);。
标签: android-studio tensorflow tensorflow-lite