如何在TensorFlow中可靠地测量sess.run()的时间?

时间:2017-04-11 09:51:28

标签: python caching tensorflow profiling timeit

我的问题是,如果一个操作的参数是常量,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μs

如果我在每次运行时从头开始生成张量,那么我也在计算张量生成的开销:

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 ms

也许在这个特定的例子中,开销并不大,但对于更便宜的操作,它可能很重要。

有没有办法冻结参数,以便它们不会在每个sess.run()上重新计算,但是会抑制所有其他缓存?

1 个答案:

答案 0 :(得分:0)

在每次运行(跨会话)时,将评估传递给sess.run()的任何张量对象。来自文档:

  

Session对象封装了Operation对象所在的环境   执行,并评估Tensor对象。

不可能忽略跨会话的评估(计算值),只要它是要评估的表达式的一部分。

在您的示例中,张量对象a, b, c始终在每个会话中进行评估,因为计算einsum需要它们的值。但是,在一个会话中,它们只计算一次并在运行中缓存。

但是,在一个会话中,你可以让它只被评估一次并在其他地方使用它。但同样,这只适用于会话。