Theano 的 GPU 上是不是可以进行 int 操作?
Posted
技术标签:
【中文标题】Theano 的 GPU 上是不是可以进行 int 操作?【英文标题】:Are int operations possible on GPU in Theano?Theano 的 GPU 上是否可以进行 int 操作? 【发布时间】:2015-11-20 16:26:46 【问题描述】:所以我读到 theano 不能使用 float64
进行 gpu 计算,并将整数作为共享变量存储在 gpu 上,它们必须初始化为共享的 float32
数据,然后重新转换为整数(就像在“小hack" 在逻辑回归example)...但是经过这样的重铸,theano 可以在 ints 上进行 gpu 计算吗?存储是计算的先决条件吗?换句话说,以下两种情况可能吗?
场景 1. 我想对两个大型整数向量进行点积。因此,我将它们共享为float32
,并在点积之前将它们重铸为 int,然后这个点积是否在 gpu 上完成(不管 int 类型)?
场景 2。如果场景 1 是可能的,是否仍然可以在 gpu 上进行计算而不先将它们存储为共享 float32? (我知道共享变量可能会减轻 gpu-cpu 通信,但点积仍然可能吗?存储是在 gpu 上计算的先决条件吗?)
【问题讨论】:
【参考方案1】:不,(目前)没有办法在 GPU 上使用除float32
以外的任何类型执行任何操作。
这可以通过这个小演示代码看到:
import numpy
import theano
import theano.tensor as tt
x = theano.shared(numpy.arange(9 * 10).reshape((9, 10)).astype(numpy.float32))
y = theano.shared(numpy.arange(10 * 11).reshape((10, 11)).astype(numpy.float32))
z = theano.dot(tt.cast(x, 'int32'), tt.cast(y, 'int32'))
f = theano.function([], outputs=z)
theano.printing.debugprint(f)
在 GPU 上运行时,它将打印以下计算图:
dot [@A] '' 4
|ElemwiseCastint32 [@B] '' 3
| |HostFromGpu [@C] '' 1
| |<CudaNdarrayType(float32, matrix)> [@D]
|ElemwiseCastint32 [@E] '' 2
|HostFromGpu [@F] '' 0
|<CudaNdarrayType(float32, matrix)> [@G]
在这里你可以看到两个共享变量确实存储在GPU内存中(两个CudaNdarrayType
s)但是它们是从GPU移动到主机(即CPU/主内存)的(HostFromGpu
操作)在被强制转换为整数并使用常规 dot
操作之前。
如果演员被省略,那么你会看到
HostFromGpu [@A] '' 1
|GpuDot22 [@B] '' 0
|<CudaNdarrayType(float32, matrix)> [@C]
|<CudaNdarrayType(float32, matrix)> [@D]
显示 GPU 正在执行点积(GpuDot22
运算),但针对的是浮点数据,而不是整数数据。
【讨论】:
非常好的答案,我肯定会支持它(但我没有所需的声誉:S)。然而,据此,在'deeplearrning.net' logistic regression example 中,他们首先将 shared_y 存储为 floatX 然后重新转换为 int 似乎有点没用。根据您上面的示例,这只会增加 gpu-cpu 通信。 我相信,如果 int 仅用作其他张量的索引,例如在该示例中,情况会有所不同。当您想对整数执行数学运算时,就会出现问题。以上是关于Theano 的 GPU 上是不是可以进行 int 操作?的主要内容,如果未能解决你的问题,请参考以下文章
paper 167:GPU的使用Theano之tutorial
Theano-gpu坑:ERROR (theano.gpuarray): Could not initialize pygpu, support disabled