程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

Python中的自动CudaMat转换

发布于2020-02-24 15:52     阅读(1446)     评论(0)     点赞(9)     收藏(4)


我正在考虑使用某种形式的CUDA来加快我的python代码(全部为矩阵数学)的速度。目前,我的代码使用的是Python和Numpy,因此使用PyCUDA或CudaMat之类的代码重写它似乎并不难。

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

我理解为什么这样做是必要的,但它使曾经很容易阅读的方程式变得一团糟,很难检查其正确性。另外,我希望以后能够轻松修改方程式,但这些方程式不是经过转换的。

Theano软件包通过首先创建操作的符号表示,然后将其编译为CUDA来实现此目的。但是,在尝试了Theano一段时间后,我对所有内容的不透明性感到沮丧。例如,要获取myvar.shape [0]的实际值会很困难,因为直到很久以后才对树进行求值。我也更希望框架不符合我的代码,该框架在很大程度上符合代替Numpy隐式运行的库。

因此,我真正想要的是简单得多的东西。我不需要自动区分(如果需要,可以使用OpenOpt等其他软件包)或优化树,而无需将标准Numpy表示法转换为CudaMat / PyCUDA / somethingCUDA。实际上,我希望能够将其评估为Numpy,而无需任何CUDA代码进行测试。

我目前正在考虑自己写这篇文章,但是在考虑进行此类冒险之前,我想看看是否有人知道类似的项目或一个好的起点。我知道唯一可能与之接近的其他项目是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)test grad_W.asNumpy() == grad_W.asCUDA()和(2)将您现有的代码转换为使用CUDA。


解决方案


您是否看过PyCUDA的GPUArray部分?

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

虽然我自己还没有使用过它,但是看起来这正是您想要的。特别是,请查看该页面底部附近的“单遍自定义表达式评估”部分。



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接:https://www.pythonheidong.com/blog/article/232101/c240cc5ae8e964c67858/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

9 0
收藏该文
已收藏

评论内容:(最多支持255个字符)