2017-04-11 538 views
0

我的問題是,如果一個操作的參數都是恆定的,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()上重新計算,但會抑制所有其他緩存?

回答

0

在每次運行(跨越會話)時,將評估您傳遞給sess.run()的任何張量對象。來自文檔:

Session對象封裝了執行Operation對象的環境,並且計算Tensor對象。

只要它是要評估的表達式的一部分,就不可能忽略跨會話評估(計算)張量的值(計算值)。

在您的示例中,張量對象a, b, c總是在每個會話中進行評估,因爲它們的值需要計算einsum。但是,在一個會話中,它們只能計算一次並跨運行緩存。

但是,在一個會話中,您可以讓它只被評估一次並在其他地方使用。但是,這隻能在一個會話中使用。

+1

所以你說我們沒有辦法可靠地測量一個op的執行時間,比如einsum? 如果作爲一個骯髒的黑客我修正了參數,但會乘以一個隨機數呢?它將迫使TF重新計算所有內容,同時不會增加顯着的開銷... const = tf.random_normal((1,))[0] res = tf.einsum('si,sj,ij-> s',const * a,const * b,const * c) – Bihaqo

+0

在一個會話中,你測量的實際上是操作符'einsum'所花費的時間。 – kmario23

+0

但是,似乎中間計算會在運行過程中緩存,請參閱原始問題中的第一個示例。運行時間爲137μs,比這個特定的輸入法輸入隨機輸入要快得多(即使排除產生這些輸入的時間)。 – Bihaqo

相關問題