为什么 TensorFlow Lite 比桌面版 TensorFlow 慢?
Why is TensorFlow Lite slower than TensorFlow on desktop?
我目前正在研究单图像超分辨率,我已经设法冻结现有的检查点文件并将其转换为 tensorflow lite。但是,使用.tflite 文件进行推理时,对一张图像进行上采样所花费的时间至少是使用.ckpt 文件恢复模型所花费的时间的 4 倍。
使用 .ckpt 文件的推理是使用 session.run() 完成的,而使用 .tflite 文件的推理是使用 interpreter.invoke() 完成的。这两个操作都是在典型 PC 上的 Ubuntu 18 VM 运行ning 上完成的。
为了进一步了解该问题,我所做的是在单独的终端中 运行 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 处理器进行了优化(而不是我的计算机 运行 上的 Intel 处理器),因此速度较慢.但是,我不能确定,我也不知道如何追查问题的根源 - 希望有人对此有更多了解?
是的,当前的 TensorFlow Lite op 内核针对 ARM 处理器(使用 NEON 指令集)进行了优化。
如果 SSE 可用,它将尝试使用 NEON_2_SSE 将 NEON 调用适配到 SSE,因此它应该仍然是 运行 某种 SIMD。然而,我们并没有花太多精力来优化这个代码路径。
关于线程数。 C++ API 中有一个 SetNumThreads 函数,但它没有在 Python API 中公开(还)。如果未设置,底层实现可能会尝试探测可用内核的数量。如果您自己构建代码,您可以尝试更改该值,看看它是否影响结果。
希望这些对您有所帮助。
我目前正在研究单图像超分辨率,我已经设法冻结现有的检查点文件并将其转换为 tensorflow lite。但是,使用.tflite 文件进行推理时,对一张图像进行上采样所花费的时间至少是使用.ckpt 文件恢复模型所花费的时间的 4 倍。
使用 .ckpt 文件的推理是使用 session.run() 完成的,而使用 .tflite 文件的推理是使用 interpreter.invoke() 完成的。这两个操作都是在典型 PC 上的 Ubuntu 18 VM 运行ning 上完成的。
为了进一步了解该问题,我所做的是在单独的终端中 运行 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 处理器进行了优化(而不是我的计算机 运行 上的 Intel 处理器),因此速度较慢.但是,我不能确定,我也不知道如何追查问题的根源 - 希望有人对此有更多了解?
是的,当前的 TensorFlow Lite op 内核针对 ARM 处理器(使用 NEON 指令集)进行了优化。 如果 SSE 可用,它将尝试使用 NEON_2_SSE 将 NEON 调用适配到 SSE,因此它应该仍然是 运行 某种 SIMD。然而,我们并没有花太多精力来优化这个代码路径。
关于线程数。 C++ API 中有一个 SetNumThreads 函数,但它没有在 Python API 中公开(还)。如果未设置,底层实现可能会尝试探测可用内核的数量。如果您自己构建代码,您可以尝试更改该值,看看它是否影响结果。
希望这些对您有所帮助。