【发布时间】:2018-10-11 16:59:25
【问题描述】:
我正在使用经过训练的模型进行预测(仅限 CPU)。我观察到在 Tensorflow 和带有 Tensorflow 后端的 Keras 上,与单个样本相比,当使用一批样本时,每个样本的预测时间要短得多。此外,每个样本的时间似乎随着批量大小的增加而下降,直到内存施加的限制。例如,在纯 Tensorflow 上,单个样本的预测需要 ~ 1.5 秒,在 100 个样本上是 ~ 17 秒(每个样本时间 ~ 0.17 秒),在 1000 个样本上是 ~ 93 秒(每个样本时间 ~ 0.093 秒) )。
这是正常行为吗?如果是这样,是否对此有直观的解释?我想这可能与初始化图表有关,但我需要澄清一下。另外,为什么随着我们增加预测样本的数量,每个样本的时间会下降?在我的用例中,我必须预测单个样本何时可用。所以,很明显,如果事情是这样工作的,我会在速度方面损失很多。
提前感谢您的帮助。
编辑:我正在添加一个最小的工作示例。我的模型有一个图像输入和 4 个矢量输入,产生 4 个输出。我将所有输入初始化为 0 以进行速度测试(我猜实际值对速度无关紧要?)。初始化时间和推理时间分别计算。我发现初始化时间是推理时间的一小部分(100 个样本约为 0.1 秒)。
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import time
import numpy as np
import tensorflow as tf
t00=time.time()
graph = tf.Graph()
graph_def = tf.GraphDef()
with open("output_graph.pb", "rb") as f:
graph_def.ParseFromString(f.read())
with graph.as_default():
tf.import_graph_def(graph_def)
# One image and 4 auxiliary scalar inputs
img_input_layer ="input"
qp4_input_layer ="qp4"
qp3_input_layer ="qp3"
qp2_input_layer ="qp2"
qp1_input_layer ="qp1"
input_name = "import/" + img_input_layer
qp4_input_name = "import/" + qp4_input_layer
qp3_input_name = "import/" + qp3_input_layer
qp2_input_name = "import/" + qp2_input_layer
qp1_input_name = "import/" + qp1_input_layer
input_operation_img = graph.get_operation_by_name(input_name)
input_operation_qp4 = graph.get_operation_by_name(qp4_input_name)
input_operation_qp3 = graph.get_operation_by_name(qp3_input_name)
input_operation_qp2 = graph.get_operation_by_name(qp2_input_name)
input_operation_qp1 = graph.get_operation_by_name(qp1_input_name)
output_operation=[]
for i in range(4):
output_operation.append(graph.get_operation_by_name("import/" + "output_"+str(i)).outputs)
#Initializing dummy inputs
n=100 # Number of samples for inference
img=np.zeros([n,64, 64,1])
qp4=np.zeros([n,1, 1,1])
qp3=np.zeros([n,2, 2,1])
qp2=np.zeros([n,4, 4,1])
qp1=np.zeros([n,8, 8,1])
t01=time.time()
print("Iniialization time",t01-t00)
t0=time.time()
with tf.Session(graph=graph) as sess:
results = sess.run(output_operation,
{input_operation_img.outputs[0]: img, input_operation_qp4.outputs[0]: qp4, input_operation_qp3.outputs[0]: qp3, input_operation_qp2.outputs[0]: qp2, input_operation_qp1.outputs[0]: qp1})
# print(results)
t1 = time.time()
print("Inference time", t1-t0)
【问题讨论】:
标签: python performance tensorflow keras runtime