Моя проблема в том, что если аргументы операции постоянны, TF кэширует результаты:
a = tf.constant(np.random.randn(*(100, 101)))
b = tf.constant(np.random.randn(*(100, 102)))
c = tf.constant(np.random.randn(*(101, 102)))
# Some expensive operation.
res = tf.einsum('si,sj,ij->s', a, b, c)
%timeit sess.run(res)
Самый медленный пробег занял в 577,76 раз больше времени, чем самый быстрый. Это может означать, что промежуточный результат кэшируется. 10000 циклов, лучший из 3: 137 мкс на цикл
Если я генерирую тензоры с нуля при каждом запуске, то я также подсчитываю накладные расходы на генерацию тензора:
a = tf.random_normal((100, 101))
b = tf.random_normal((100, 102))
c = tf.random_normal((101, 102))
res = tf.einsum('si,sj,ij->s', a, b, c)
%timeit sess.run(res)
Самый медленный пробег занял в 4,07 раза больше времени, чем самый быстрый. Это может означать, что промежуточный результат кэшируется. 10 циклов, лучший из 3: 28 мс на цикл
Может быть, в этом конкретном примере накладные расходы невелики, но для более дешевых операций они могут быть значительными.
Есть ли способ заморозить аргументы, чтобы они не пересчитывались при каждом sess.run(), а подавляли все остальное кэширование?