为什么同样的矩阵乘法, Pytorch 和 Cupy 要比 Numpy 慢?

2018-11-30 20:44:25 +08:00
 Hzzone
import cupy as cp
import numpy as np
x_cpu = np.random.randn(100, 100).astype(np.float32)
x_gpu = cp.asarray(x_cpu)
%%timeit
x_cpu*x_cpu
2.41 µs ± 19.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%%timeit
x_gpu*x_gpu
14.3 µs ± 53.4 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
import torch
x_tensor = torch.from_numpy(x_cpu)
%%timeit
x_tensor*x_tensor
3.01 µs ± 33.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
x_gpu_tensor = x_tensor.cuda()
%%timeit
x_gpu_tensor*x_gpu_tensor
7.85 µs ± 13.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
6391 次点击
所在节点    Python
11 条回复
leido
2018-11-30 21:13:15 +08:00
用 Python 你还在乎效率?
Hzzone
2018-11-30 21:14:02 +08:00
@leido GPU 加速
justou
2018-11-30 21:19:05 +08:00
数据量太小,让 gpu 工作的一系列中间步骤所花费的时间占主要了,换大点的矩阵试试,比如 100000*100000
justou
2018-11-30 21:22:29 +08:00
gpu 适合一次性处理大量的数据
wlwood
2018-11-30 21:26:55 +08:00
当然,矩阵计算,numpy 可是堪比 matlab 的
necomancer
2018-11-30 21:41:25 +08:00
直接用 * 是矩阵乘法吗……别的不知道,numpy 下是批量相乘吧……

numpy 里 x_cpu.dot(x_cpu) 才是矩阵乘法。
Nimrod
2018-11-30 21:56:45 +08:00
numpy 的矩阵乘法是 dot 不是*吧。。
lonccc
2018-12-01 01:04:42 +08:00
你这也不是矩阵乘法啊,这是 element wise 的乘法。另外,numpy 的矩阵乘法可以用到 blas 的库,优化的很好了
takato
2018-12-01 01:22:01 +08:00
用 matmul()
Xs0ul
2018-12-01 02:24:14 +08:00
给个数量级参照:
def add(a, b):
return a+b
def add2(a, b):
return add(a, b)

x = 100.0

%%timeit
add(x, x)
180 ns ± 6.67 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%%timeit
add2(x, x)
281 ns ± 3.59 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

函数调用的开销都只比你低一个数量级了
northisland
2018-12-01 12:44:39 +08:00
量太小了,换成 5000 维的方阵,GPU 的并行加速的特性就能体现出来了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/513189

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX