我用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 会不会比较快一点
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. 否则会非常的慢
感谢各位指教,前天改了之后没问题了,不过倒是发现了一件神奇的事情,我用gpu跑要将近4分钟,用cpu竟然只要1分多,跟我GPU应该比较快的印象不太一样,我挺好奇其中原因的
要看程式是IO bound还是CPU bound,GPU再运算时需要透过bus把资料搬到GPU的内存内,比CPU直接从memory取资料慢另外就是看你的程式有多少部分可以平行化