Python中的自动CudaMat转换 - python

我正在考虑使用某种形式的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)测试grad_W.asNumpy() == grad_W.asCUDA(),以及(2)将您现有的代码转换为使用CUDA。

参考方案

您是否看过PyCUDA的GPUArray部分?

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

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

Python GPU资源利用 - python

我有一个Python脚本在某些深度学习模型上运行推理。有什么办法可以找出GPU资源的利用率水平?例如,使用着色器,float16乘法器等。我似乎在网上找不到太多有关这些GPU资源的文档。谢谢! 参考方案 您可以尝试在像Renderdoc这样的GPU分析器中运行pyxthon应用程序。它将分析您的跑步情况。您将能够获得有关已使用资源,已用缓冲区,不同渲染状态上…

Python sqlite3数据库已锁定 - python

我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…

python-docx应该在空单元格已满时返回空单元格 - python

我试图遍历文档中的所有表并从中提取文本。作为中间步骤,我只是尝试将文本打印到控制台。我在类似的帖子中已经看过scanny提供的其他代码,但是由于某种原因,它并没有提供我正在解析的文档的预期输出可以在https://www.ontario.ca/laws/regulation/140300中找到该文档from docx import Document from…

Python ThreadPoolExecutor抑制异常 - python

from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED def div_zero(x): print('In div_zero') return x / 0 with ThreadPoolExecutor(max_workers=4) as execut…

Python:集群作业管理 - python

我在具有两个阶段的计算群集(Slurm)上运行python脚本,它们是顺序的。我编写了两个python脚本,一个用于阶段1,另一个用于阶段2。每天早上,我检查所有第1阶段的工作是否都以视觉方式完成。只有这样,我才开始第二阶段。通过在单个python脚本中组合所有阶段和作业管理,是否有一种更优雅/自动化的方法?我如何知道工作是否完成?工作流程类似于以下内容:w…