[問題] tensorflow的純計算怎麼那麼慢?

作者: king00000000 (逆天)   2018-05-18 23:37:05
我用TF寫了一個計算使用者cosin相似度的程式如圖
http://i.imgur.com/Ic1gMEH.jpg
n_users = 943,每個user有1682筆資料
結果跑到天荒地老,CUDA開了還是要10分鐘才跑完一個user
我用一般寫法,不用任何套件,只需要40多分鐘就能跑完全部
有人知道背後的原因嗎?
作者: guaptpan (Gua)   2018-05-18 23:46:00
不知道為什麼tf這裡這麼慢有沒有試過用placeholder 當user的資料輸入控制看看?我還有發現這樣的i與j的迴圈是不是有很多次不必要的重複計算嗎?例如總共10個user,i=1時的loop中1號與5號比過了,到i =5的loop中5號又與1號比較一次如果在第二層迴圈中改成for j=I in range 會不會比較快一點
作者: king00000000 (逆天)   2018-05-19 00:17:00
我試試看
作者: tsoahans (ㄎㄎ)   2018-05-19 00:27:00
tensorflow是要建立computing graph再去計算 你這樣會重複建很多次浪費時間input改用placeholder,U1_norm到cosin都放for外面
作者: sma1033 (死馬)   2018-05-19 16:00:00
寫tensorflow要快就是要懂得怎麼樣把資料分給顯卡平行算如果你只是弄一個自己想好的邏輯,然後丟給Tensorflow預期程式就會很"聰明"的幫你分配電腦硬體,最有效率的算出結果,那你的期待應該很容易就會落空y如果不懂如何使用GPU加速的話,其實還是寫Python處理資料就好,因為把一樣的程式單純搬到TF上面應該是不會變快的要速度快就是要利用平行運算的性質來跑(CPU or GPU都是)
作者: NCTUFatGuy (NCTUFatGuy)   2018-05-19 17:56:00
直接用numpy就好了 不知道用tf的意義
作者: teracahou   2018-05-19 21:51:00
tsoahans正解 這裡完全不需要用到 loops 你的computational graph 只需要一組 ops 但你現在建了 n^2 組 那當然很慢這個應用場景其實很常見 比如說CNN 有個 regression task我們想用cosine distance去當 loss (或是一個很customized的loss) 這種情況能vectorize就vectorize. 否則會非常的慢
作者: king00000000 (逆天)   2018-05-21 15:33:00
感謝各位指教,前天改了之後沒問題了,不過倒是發現了一件神奇的事情,我用gpu跑要將近4分鐘,用cpu竟然只要1分多,跟我GPU應該比較快的印象不太一樣,我挺好奇其中原因的
作者: tsoahans (ㄎㄎ)   2018-05-25 11:35:00
要看程式是IO bound還是CPU bound,GPU再運算時需要透過bus把資料搬到GPU的記憶體內,比CPU直接從memory取資料慢另外就是看你的程式有多少部分可以平行化

Links booklink

Contact Us: admin [ a t ] ucptt.com