Я использую TensorFlow 2.0 и у меня есть вопросы по производительности по поводу Tensor
освобождения. Я делаю вывод о большом наборе данных, используя керасы. Входные данные, которые я предоставляю, Dataset
, которые возвращают «мини-пакеты» записей. Поскольку это быстрее, я объединяю многочисленные мини-пакеты для вызова predict_on_batch
для большего количества записей одновременно. Упрощенная версия моего кода выглядит следующим образом:
K.set_learning_phase(0)
batches_preds = []
minibatches = []
for i_minibatch,minibatch in enumerate(iter(my_dataset)):
minibatches.append(minibatch)
if (i_minibatch % minis_per_batch == 0):
batch = tf.concat(minibatches, 0)
batch_preds = model.predict_on_batch(batch).numpy().flatten()
batches_preds.append(batch_preds)
minibatches = []
if len(minibatches) > 0:
batch = tf.concat(minibatches, 0)
batch_preds = model.predict_on_batch(batch).numpy().flatten()
batches_preds.append(batch_preds)
preds = np.hstack(batches_preds)
Я пытаюсь улучшить производительность этого процесса. Интересно, что если я time
на различных шагах, то шаг, на котором я повторно инициализирую minibatches
в пустой список, занимает большой процент времени. Я предполагаю, что фактическая работа, проделанная TensorFlow на этом шаге, представляет собой некоторую комбинацию обеспечения того, что Tensor
s, на которые больше нет ссылок, безопасны для освобождения, и затем освобождения их.
У меня есть два вопроса по этому поводуПоведение:
- Является ли освобождение
Tensor
по своей сути дорогостоящим? Почему это занимает так много времени? - В TensorFlow 2.0 есть ли способ, которым я могу вручную освободить
Tensor
, чтобы я мог анализировать производительность операции и, возможно, пропустить ненужные проверки безопасности?