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内存中(两个CudaNdarrayTypes)但是它们是从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

配置安装theano环境(非GPU版)

tensorflow 在 GPU 内存上存储训练数据

在 AWS g2 上的 Ubuntu 14.04 上使用带 GPU 的 Theano

python 在GPU上测试Theano