【发布时间】:2019-07-27 17:03:38
【问题描述】:
这是一个基于(或跟进)另一个问题的问题:Faster implementation of ReLU derivative。
本着想出一种最快计算导数的方法的精神,我写了一些解决方案,其中一个是:
In [35]: np.random.seed(0)
In [36]: X = np.random.randn(3072,10000)
# computing ReLU derivative
In [42]: np.ceil(np.clip(X, 0, 1))
在以other solutions of Divakar 进行基准测试时,我发现上述方法非常缓慢(30x 以北)。以下是时间(从最快到最慢)
In [43]: %timeit -n100 ne.evaluate('X>=0').view('i1')
10.6 ms ± 203 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [44]: %timeit -n100 (X>=0).view('i1')
13.6 ms ± 77.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [45]: %timeit -n100 ne.evaluate('(X>=0)+0')
22.1 ms ± 16.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
# the super slowest one
In [46]: %timeit -n100 np.ceil(np.clip(X, 0, 1))
317 ms ± 2.14 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
造成这种缓慢的因素是什么?瓶颈在哪里?
【问题讨论】:
-
那个 ceil/clip 东西比你测试它的任何东西都要复杂得多,尤其是在优化某些选项时似乎是 numexpr。
-
(也是分支预测。分支预测器与
clip相处得不好。)
标签: python numpy neural-network performance-testing ceil