作者king00000000 (逆天)
看板Python
标题[问题] tensorflow的纯计算怎麽那麽慢?
时间Fri May 18 23:37:05 2018
我用TF写了一个计算使用者cosin相似度的程式如图
http://i.imgur.com/Ic1gMEH.jpg
n_users = 943,每个user有1682笔资料
结果跑到天荒地老,CUDA开了还是要10分钟才跑完一个user
我用一般写法,不用任何套件,只需要40多分钟就能跑完全部
有人知道背後的原因吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.246.153.113
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1526657828.A.0DD.html
1F:推 guaptpan: 不知道为什麽tf这里这麽慢 05/18 23:46
2F:→ guaptpan: 有没有试过用placeholder 当user的资料输入控制看看? 05/18 23:46
3F:→ guaptpan: 我还有发现这样的i与j的回圈是不是有很多次不必要的重复 05/18 23:46
4F:→ guaptpan: 计算吗? 05/18 23:46
5F:→ guaptpan: 例如总共10个user,i=1时的loop中1号与5号比过了,到i = 05/18 23:46
6F:→ guaptpan: 5的loop中5号又与1号比较一次 05/18 23:46
7F:→ guaptpan: 如果在第二层回圈中改成 05/18 23:46
8F:→ guaptpan: for j=I in range 会不会比较快一点 05/18 23:46
9F:→ king00000000: 我试试看 05/19 00:17
10F:推 tsoahans: tensorflow是要建立computing graph再去计算 你这样会 05/19 00:27
11F:→ tsoahans: 重复建很多次浪费时间 05/19 00:28
12F:推 tsoahans: input改用placeholder,U1_norm到cosin都放for外面 05/19 00:36
13F:推 sma1033: 写tensorflow要快就是要懂得怎麽样把资料分给显卡平行算 05/19 16:00
14F:→ sma1033: 如果你只是弄一个自己想好的逻辑,然後丢给Tensorflow 05/19 16:00
15F:→ sma1033: 预期程式就会很"聪明"的帮你分配电脑硬体,最有效率的算 05/19 16:01
16F:→ sma1033: 出结果,那你的期待应该很容易就会落空y 05/19 16:01
17F:→ sma1033: 如果不懂如何使用GPU加速的话,其实还是写Python处理资料 05/19 16:03
18F:→ sma1033: 就好,因为把一样的程式单纯搬到TF上面应该是不会变快的 05/19 16:04
19F:→ sma1033: 要速度快就是要利用平行运算的性质来跑(CPU or GPU都是) 05/19 16:05
20F:推 NCTUFatGuy: 直接用numpy就好了 不知道用tf的意义 05/19 17:56
21F:推 teracahou: tsoahans正解 这里完全不需要用到 loops 你的computati 05/19 21:51
22F:→ teracahou: onal graph 只需要一组 ops 但你现在建了 n^2 组 那当 05/19 21:51
23F:→ teracahou: 然很慢 05/19 21:51
24F:推 teracahou: 这个应用场景其实很常见 比如说CNN 有个 regression ta 05/19 21:58
25F:→ teracahou: sk我们想用cosine distance去当 loss (或是一个很custo 05/19 21:58
26F:→ teracahou: mized的loss) 这种情况能vectorize就vectorize. 否则会 05/19 21:58
27F:→ teracahou: 非常的慢 05/19 21:59
28F:→ king00000000: 感谢各位指教,前天改了之後没问题了,不过倒是发现 05/21 15:33
29F:→ king00000000: 了一件神奇的事情,我用gpu跑要将近4分钟,用cpu竟 05/21 15:33
30F:→ king00000000: 然只要1分多,跟我GPU应该比较快的印象不太一样,我 05/21 15:33
31F:→ king00000000: 挺好奇其中原因的 05/21 15:33
32F:推 tsoahans: 要看程式是IO bound还是CPU bound,GPU再运算时需要透过 05/25 11:35
33F:→ tsoahans: bus把资料搬到GPU的记忆体内,比CPU直接从memory取资料 05/25 11:36
34F:→ tsoahans: 慢 05/25 11:36
35F:推 tsoahans: 另外就是看你的程式有多少部分可以平行化 05/25 11:46