Theano 中是不是有 GPU 加速的 numpy.max(X, axis=0) 实现?

Posted

技术标签:

【中文标题】Theano 中是不是有 GPU 加速的 numpy.max(X, axis=0) 实现?【英文标题】:Is there a GPU accelerated numpy.max(X, axis=0) implementation in Theano?Theano 中是否有 GPU 加速的 numpy.max(X, axis=0) 实现? 【发布时间】:2014-07-10 09:22:01 【问题描述】:

我们在 Theano 中是否有 numpy.max(X, axis=None) 版本的 GPU 加速。 我查看了文档,发现theano.tensor.max(X, axis=None),但它比 numpy 实现慢 4-5 倍。

我可以向你保证,它不会因为矩阵大小的错误选择而变慢。 theano.tensor.exp 下的相同矩阵比其对应的 numpy 快 40 倍。

有什么建议吗?

【问题讨论】:

【参考方案1】:

前面的答案是片面的。该建议不应该起作用,因为解决方法是最终编译代码中使用的解决方法。有优化会自动进行这种转换。

问题的标题与内容不同。它们因轴参数而异。我会回答这两个问题。

如果轴为 0 或无,我们在 GPU 上支持该矩阵操作。如果轴是无,我们的基本实现没有得到很好的优化,因为它更难并行化。如果轴为 0,我们有一个基本的实现,但它更快,因为它更容易并行化。

另外,你是如何安排时间的?如果您只使用该操作创建一个功能并通过 device=gpu 标志对其进行测试以进行比较,这将包括 CPU 和 GPU 之间的传输时间。这是一个内存绑定操作,所以如果你在你的时间安排中包含传输,我个人认为这种情况下不会有任何速度操作。要仅查看 GPU 操作,请使用 Theano 分析器:使用 Theano 标志 profile=True 运行。

【讨论】:

是的,我正在计时整个复制+计算。我将尝试 Theano 分析器。我希望加快 the max(X, axis=0) 操作,包括复制开销。对于任何矩阵大小,我似乎都无法获得它。你有什么建议? 正如我试图在答案中所说的那样,如果您将传输时间包含在任何系统中,而不仅仅是 Theano,我认为您将无法加快最大减少速度。要在 CPU 上做减少,瓶颈是从内存中读取。传输到 GPU 的速度比 CPU 内核从 CPU 内存中读取的速度要慢。如果您希望 GPU 加速包括传输,则需要在 GPU 上完成更多计算。【参考方案2】:

maxexp 操作根本不同; exp(以及其他操作,如加法、sin 等)是一种可并行化的元素操作,而max 需要一种并行处理扫描算法,该算法基本上在数组上构建成对比较树。提速max并非不可能,但也没有exp那么容易。

无论如何,maxtheano 实现基本上由以下几行组成(在 theano/tensor/basic.py 中):

try:
    out = max_and_argmax(x, axis)[0]
except Exception:
    out = CAReduce(scal.maximum, axis)(x)

max_and_argmax 是一堆自定义代码,在我看来,它使用 numpy 实现了一个 max+argmax 操作,CAReduce 是一个通用的 GPU 加速扫描操作,用作后备(根据对于 cmets,不支持 grad 等)。您可以尝试直接使用回退,看看是否更快,可能是这样的:

from theano.tensor.elemwise import CAReduce
from theano.scalar import maximum

def mymax(X, axis=None):
    CAReduce(maximum, axis)(X)

【讨论】:

这似乎并没有改善,至少性能现在与 CPU 相当。为了确定,我尝试了各种矩阵大小。 编辑:对于我的较大矩阵,它仍然慢 4 倍。 毫不奇怪,找到最大值是内存限制。

以上是关于Theano 中是不是有 GPU 加速的 numpy.max(X, axis=0) 实现?的主要内容,如果未能解决你的问题,请参考以下文章

基于CUDA的Theano GPU加速环境配置 GPU没有反应.求解答

基于CUDA的Theano GPU加速环境配置 GPU没有反应.求解答

ubuntu16.04下安装TensorFlow(GPU加速)----详细图文教程

Theano 的 GPU 上是不是可以进行 int 操作?

windows 下配置 theano 及 pygpu

Theano-gpu坑:ERROR (theano.gpuarray): Could not initialize pygpu, support disabled