为什么TensorFlow Lite比桌面版的TensorFlow更慢?

19

我目前正在开展单图像超分辨率的工作,并已经设法冻结现有的检查点文件并将其转换为TensorFlow Lite。但是,使用.tflite文件进行推理时,上采样一个图像所需的时间至少比使用.ckpt文件还原模型时多4倍。

使用.ckpt文件进行推理是使用session.run()完成的,而使用.tflite文件进行推理是使用interpreter.invoke()完成的。两个操作都在运行于典型个人电脑的Ubuntu 18 VM中进行。

我为了查找更多问题的信息,运行了top命令以在单独的终端窗口中查看CPU利用率。使用.ckpt文件时,利用率达到270%,而使用.tflite文件时则保持在约100%左右。

interpreter.set_tensor(input_details[0]['index'], input_image_reshaped)
interpreter.set_tensor(input_details[1]['index'], input_bicubic_image_reshaped)
start = time.time()
interpreter.invoke()
end = time.time()

对比

y = self.sess.run(self.y_, feed_dict={self.x: image.reshape(1, image.shape[0], image.shape[1], ch), self.x2: bicubic_image.reshape(1, self.scale * image.shape[0], self.scale * image.shape[1], ch), self.dropout: 1.0, self.is_training: 0})

有一种假设是tensorflow lite没有配置多线程,另一种假设是tensorflow lite针对ARM处理器进行了优化(而不是我的电脑上运行的英特尔处理器),因此速度较慢。然而,我无法确定,也不知道如何追踪问题的根源 - 希望有人能更了解这个问题?


关于“TensorFlow Lite 优化了 ARM 处理器”——我认为这不是问题——因为我目前观察到 tflite 在 M1 MacBook Air(arm64 处理器)上运行的速度比 TensorFlow 慢了 4 倍。 - Peter
1个回答

26
是的,当前的TensorFlow Lite op kernels已经针对ARM处理器进行了优化(使用NEON指令集)。如果SSE可用,则会尝试使用NEON_2_SSE将NEON调用适应为SSE,因此它仍应该具有某种形式的SIMD。但是,我们没有投入太多精力来优化这条代码路径。
关于线程数。在C++ API中有一个SetNumThreads函数,但它尚未在Python API中公开。当它没有设置时,底层实现可能会尝试探测可用核心数。如果您自己构建代码,可以尝试更改该值并查看是否影响结果。
希望这些能帮到您。

是的,这些帮助很大,非常感谢您对问题进行了如此全面的回答! - tehtea
请问您能否分享一下,SSD Mobilenet 在平均性能的 Android 设备上是否可以实时运行,即在使用 tflite 版本后它可以以多少帧每秒的速度运行?我无法找到这方面的信息,因此我不确定是否值得投入时间来制作需要实时响应的 Android 对象检测应用程序。 - hafiz031
1
@hafiz031,我不是回答者,但从我目前所发现的情况来看,SSD Mobilenet 在平均 Android 设备上以 224x224 的输入运行速度大约为每秒 2 到 3 帧。您也可以使用 Google 提供的示例应用程序进行双重检查!https://github.com/tensorflow/examples/blob/master/lite/examples/object_detection/android/README.md - tehtea
我注意到即使在 M1 MacBook Air 的 arm64 处理器上,tflite 的运行速度也比 TensorFlow 慢 4 倍 - 这是预期的吗? - Peter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接