我在计算大小为(50500,)
的向量之间的巨大的外积,发现NumPy是(很多?)比Pythorch还快。在
以下是测试:
# NumPy
In [64]: a = np.arange(50500)
In [65]: b = a.copy()
In [67]: %timeit np.outer(a, b)
5.81 s ± 56.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
-------------
# PyTorch
In [73]: t1 = torch.arange(50500)
In [76]: t2 = t1.clone()
In [79]: %timeit torch.ger(t1, t2)
7.73 s ± 143 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
理想情况下,我希望在Pythorch中完成计算。那么,在Pythorch中计算如此巨大的向量的外积,我该如何加速呢?在
注意:我试图将张量移动到GPU,但是我使用了MemoryError
,因为它需要大约19gib的空间。所以,我最终不得不在CPU上完成。在
不幸的是,如果不付出大量的努力,真的没有办法特别加快torch计算外积
torch.ger()
的方法。在说明和选项
numpy函数
np.outer()
这么快的原因是它是用C编写的,您可以在这里看到:https://github.com/numpy/numpy/blob/7e3d558aeee5a8a5eae5ebb6aef03de892a92ebd/numpy/core/numeric.py#L1123 其中函数使用来自umath
C源代码的操作。在PyTrink的{{CD1>}函数是用C++编写的:https://github.com/pytorch/pytorch/blob/7ce634ebc2943ff11d2ec727b7db83ab9758a6e0/aten/src/ATen/native/LinearAlgebra.cpp#L142,它使它在您的示例中看到的稍微慢一些。在
“在Pythorch中加速计算外部产品”的选择是在Pythorch的本机代码中为外部产品添加一个C实现,或者在与C接口时使用Cython之类的东西来创建自己的外部产品函数,如果你真的不想使用numpy(这没什么意义)。在
p.S.
此外,使用GPU只会提高GPU上的并行计算速度,这可能不会超过在RAM和GPU内存之间传输数据所需的时间成本。在
相关问题 更多 >
编程相关推荐