我的問題是,如果一個操作的參數都是恆定的,TF緩存結果:如何在TensorFlow中可靠地測量sess.run()的時間?
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()上重新計算,但會抑制所有其他緩存?
所以你說我們沒有辦法可靠地測量一個op的執行時間,比如einsum? 如果作爲一個骯髒的黑客我修正了參數,但會乘以一個隨機數呢?它將迫使TF重新計算所有內容,同時不會增加顯着的開銷... const = tf.random_normal((1,))[0] res = tf.einsum('si,sj,ij-> s',const * a,const * b,const * c) – Bihaqo
在一個會話中,你測量的實際上是操作符'einsum'所花費的時間。 – kmario23
但是,似乎中間計算會在運行過程中緩存,請參閱原始問題中的第一個示例。運行時間爲137μs,比這個特定的輸入法輸入隨機輸入要快得多(即使排除產生這些輸入的時間)。 – Bihaqo