为什么TensorFlow Lite比台式机上的TensorFlow慢?

时间:2019-01-08 13:59:22

标签: tensorflow tensorflow-lite

我目前正在研究Single Image Superresolution,并且设法冻结了现有的检查点文件并将其转换为tensorflow lite。但是,当使用.tflite文件执行推理时,对一幅图像进行升采样所需的时间至少是使用.ckpt文件恢复模型时所花费的时间的四倍。

使用.ckpt文件进行的推理是使用session.run()完成的,而使用.tflite文件进行的推理是使用解释器.invoke()完成的。两种操作都是在典型PC上运行的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()

vs

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处理器(而不是我的计算机所运行的Intel处理器)进行优化的,因此速度较慢。但是,我不能肯定地说,也不知道如何找到问题的根源-希望外面有人对此有更多的了解?

1 个答案:

答案 0 :(得分:5)

是的,当前的TensorFlow Lite操作内核已针对ARM处理器进行了优化(使用NEON指令集)。 如果SSE可用,它将尝试使用NEON_2_SSE使NEON调用适应SSE,因此它仍应与某种SIMD一起运行。但是,我们并未花太多精力来优化此代码路径。

关于线程数。 C ++ API中有一个SetNumThreads函数,但尚未在Python API中公开。如果未设置,则基础实现可能会尝试探查可用核心的数量。如果您自己构建代码,则可以尝试更改该值并查看它是否影响结果。

希望这些帮助。