我运行了以下代码来计算矩阵的伪逆,但似乎是否打开 GPU 没有什么区别。
mat = theano.shared(numpy.eye(300, dtype="float32")+1)
fn = theano.function([], theano.tensor.nlinalg.pinv(mat))
fn()
然后我查看了Theano的theano.tensor.nlinalg.MatrixPinv
源码,发现它只是在下面的代码中调用了Numpy的numpy.linalg.pinv
(我'将省略评论)。
class MatrixPinv(Op):
__props__ = ()
def __init__(self):
pass
def make_node(self, x):
x = as_tensor_variable(x)
assert x.ndim == 2
return Apply(self, [x], [x.type()])
def perform(self, node, inputs, outputs):
(x,) = inputs
(z,) = outputs
z[0] = numpy.linalg.pinv(x).astype(x.dtype)
pinv = MatrixPinv()
我不是很了解Numpy是如何实现的,它可以在GPU上运行吗?
如果不是,是否意味着每次我想在 Theano 中计算矩阵逆时,我都必须从 GPU 返回到 CPU?
参见文章 Using the GPU在 theano 文档中。
Note that we use the shared
function to make sure that the input x is stored on the graphics device.
您必须确保数据存储在显存中。否则,我想,theano 会退回到使用 numpy 例程。
Numpy 通常不在 GPU 上运行。我不确定是否可以将它与 CudaBLAS 联系起来,但我想这超出了这里的范围。
我是一名优秀的程序员,十分优秀!