Я использую свою обученную модель для прогнозирования (только для процессора).Я наблюдаю, что как на Tensorflow, так и на Keras с бэкэндом Tensorflow время прогнозирования для выборки намного меньше при использовании серии выборок по сравнению с отдельной выборкой.Более того, время на выборку уменьшается с увеличением размера пакета до пределов, налагаемых памятью.Например, на чистом Tensorflow прогнозирование отдельной выборки занимает ~ 1,5 секунды, на 100 выборках это ~ 17 секунд (на время выборки ~ 0,17 с), на 1000 выборок это ~ 93 секунды (на время выборки ~ 0,093 с)).
Это нормальное поведение?Если так, есть ли интуитивное объяснение этому?Я думаю, это может быть связано с инициализацией графика, но мне нужно кое-что прояснить.Кроме того, почему время выборки уменьшается, когда мы увеличиваем количество выборок для прогноза?В моем случае использования я должен предсказать по отдельным образцам, когда они станут доступны.Так что, очевидно, я бы совсем немного потерял бы в скорости, если бы это так работало.
Заранее спасибо за вашу помощь.
Редактировать: я добавляю минимальный рабочий пример.У меня есть один вход изображения и 4 векторных входа для моей модели, которая производит 4 выхода.Я инициализирую все входы в 0 для проверки скорости (я думаю, что фактические значения не имеют большого значения для скорости?).Время инициализации и время вывода рассчитываются отдельно.Я обнаружил, что время инициализации является частью времени вывода (~ 0,1 с для 100 выборок).
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)