Python中的自动CudaMat转换

时间:2011-07-18 15:51:22

标签: python optimization matrix cuda pycuda

我正在考虑使用某种形式的CUDA加速我的python代码,这是所有矩阵数学。目前我的代码使用的是Python和Numpy,因此使用PyCUDA或CudaMat这样的内容重写它似乎不会太难。

然而,在我第一次尝试使用CudaMat时,我意识到我必须重新排列很多方程式,以便将操作全部保留在GPU上。这包括创建许多临时变量,以便我可以存储操作的结果。

我理解为什么这是必要的,但它使曾经容易阅读的方程变得有点混乱,难以检查正确性。另外,我希望以后能够轻松修改方程式,这不是转换后的形式。

Theano设法通过首先创建操作的符号表示,然后将它们编译为CUDA来实现此目的。然而,在尝试了Theano之后,我对一切都不透明感到沮丧。例如,只是获取myvar.shape [0]的实际值很困难,因为直到很久之后才会对树进行求值。我也更喜欢一个框架,在这个框架中,我的代码非常符合一个无形的行为代替Numpy的库。

因此,我真正想要的是更简单的东西。我不希望自动区分(如果我需要,还有其他类似OpenOpt的软件包可以执行此操作),或树的优化,但只是从标准Numpy表示法转换为CudaMat / PyCUDA / somethingCUDA。实际上,我希望能够在没有任何CUDA代码的情况下将其评估为Numpy。

我正在考虑自己写这篇文章,但在考虑这样的冒险之前,我想知道是否有其他人知道类似的项目或一个好的起点。我所知道的唯一可能与之相近的其他项目是SymPy,但我不知道适应这个目的是多么容易。

我目前的想法是创建一个看起来像Numpy.array类的数组类。它的唯一功能就是构建一棵树。在任何时候,该符号数组类都可以转换为Numpy数组类并进行评估(也会有一对一的奇偶校验)。或者,可以遍历数组类并生成CudaMat命令。如果需要优化,可以在该阶段完成(例如重新排序操作,创建临时变量等),而不会妨碍检查正在发生的事情。

任何想法/评论等。对此我将不胜感激!

更新

用例可能看起来像(sym是理论模块),我们可能会做一些事情,比如计算渐变:

W = sym.array(np.rand(size=(numVisible, numHidden)))
delta_o = -(x - z)
delta_h = sym.dot(delta_o, W)*h*(1.0-h)
grad_W = sym.dot(X.T, delta_h)

在这种情况下,grad_W实际上只是一个包含需要完成的操作的树。如果你想正常评估表达式(即通过Numpy),你可以这样做:

npGrad_W = grad_W.asNumpy()

只执行树代表的Numpy命令。另一方面,如果你想使用CUDA,你会这样做:

cudaGrad_W = grad_W.asCUDA()

将树转换为可以通过CUDA执行的表达式(这可能以几种不同的方式发生)。

这样做应该是微不足道的:(1)测试grad_W.asNumpy() == grad_W.asCUDA(),以及(2)转换你原有的代码以使用CUDA。

1 个答案:

答案 0 :(得分:2)

您是否看过PyCUDA的GPUArray部分?

http://documen.tician.de/pycuda/array.html

虽然我自己没有使用它,但它似乎就是你要找的东西。特别是,请查看该页面底部附近的“单程自定义表达式评估”部分。