【问题标题】:Slowness of numpy.ceil and numpy.clip in ReLU thresholding: where is the bottleneck?ReLU 阈值中 numpy.ceil 和 numpy.clip 的缓慢性:瓶颈在哪里?
【发布时间】: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


【解决方案1】:

首先,您只是在执行更复杂的操作序列。对于每个输入,您的 ceil/clip 事物执行以下操作:

  • 输入值是否小于0?如果是这样,请将中间值设置为 0。
  • 否则,它是否大于 1?如果是这样,请将中间值设置为 1。
  • 否则,将中间值设置为输入值。
  • 计算中间值的上限并将输出设置为该值。

(这发生在两个阶段,一个完成所有剪辑,一个完成所有上限。)

您正在根据对每个输入执行以下操作的选项来计时:

  • 在输入和 0 之间执行 >= 比较,并将输出设置为该值。

>= 更快也就不足为奇了。


其次,您的 ceil/clip 事物写入的字节数是 >= 的 16 倍。 >= 为每个输入元素生成一个单字节的输出(view 是一个视图,因此那里没有数据副本),而您的 ceil/clip 事物生成一个中间数组和一个输出数组,两者都是 dtype float64。


第三,分支预测器在随机数组上使用 clip 的时间很糟糕。它不知道每次将采用哪个分支。一个更可预测的数组通过clip 的速度要快得多:

In [21]: %timeit X.clip(0, 1)
1 loop, best of 5: 211 ms per loop

In [22]: A = np.full_like(X, 0.5)

In [23]: %timeit A.clip(0, 1)
10 loops, best of 5: 86.6 ms per loop

最后,至少在我测试过的机器和 NumPy 构建上,numpy.ceil 的速度出奇的慢:

In [24]: %timeit np.ceil(X)
10 loops, best of 5: 166 ms per loop

我不确定它是针对软件ceil 实现还是什么。这在不同的构建中可能会有所不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-25
    • 2012-12-03
    • 2017-07-17
    • 1970-01-01
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多