如何加速numpy中的tanh函数?

4

NumPy的tanh函数似乎比其PyTorch等价物慢得多:

import torch
import numpy as np

data=np.random.randn(128,64,32).astype(np.float32)
%timeit torch.tanh(torch.tensor(data))
%timeit np.tanh(data)

820 µs ± 24.6 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
3.89 ms ± 95.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

有没有办法在numpy中加速tanh计算?谢谢!


我不是100%确定,但我相信numpy实际上正在计算tanh的值,而torch则是从查找表中读取并插值。 - Eumel
谢谢您的回复,Eumel!Torch和Numpy tanh之间的最大误差约为6e-8,因此这是相当准确的插值。您知道我在哪里可以查看它的代码以进行双重检查吗?还有,我在哪里可以找到这样的预计算查找表?只是好奇。 - Sam-gege
我可能错了,但我认为 numpy 直接从(C99及以上版本) math.h 头文件中使用三角函数。三角函数的实际实现可能取决于系统,尽管我想它会利用它们相关的泰勒级数。 - OTheDev
有人可以帮我展示一下PyTorch如何实现tanh吗?我不知道在它的GitHub存储库中该去哪里查找。谢谢! - Sam-gege
如果你在谷歌上搜索“torch github”,并在其中使用搜索功能,你应该能够找到它。 - Eumel
numpytanh 的运行时间与 sinh 相同,而且比 sin 稍微多一点。 - hpaulj
1个回答

4

您可以尝试使用以下方法使用 numexpr

pip install numexpr

然后:

import numexpr as ne
import numpy as np

data=np.random.randn(128,64,32).astype(np.float32)

resne = ne.evaluate("tanh(data)")
resnp = np.tanh(data)

然后检查所有关闭的内容:

In [16]: np.allclose(resne,resnp)
Out[16]: True

并检查时间:

In [14]: %timeit res = ne.evaluate("tanh(data)")
311 µs ± 1.26 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

In [15]: %timeit np.tanh(data)
1.85 ms ± 7.43 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

1
知道这点很好,谢谢马克!你知道为什么速度差距那么大吗?为什么numexpr要快得多? - Sam-gege
它是多线程的,并且它进行预编译-所有魔法都在此处描述 https://numexpr.readthedocs.io/projects/NumExpr3/en/latest/ - Mark Setchell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接