Theano:在GPU工作之间显式传输数据

时间:2016-04-26 09:01:10

标签: cuda theano theano-cuda

我试图实现一个简单的示例,以展示如何在两个不同的GPU中计算两个theano.tensor.dot。两个点共享相同的A和不同的B。

  

theano.tensor.dot(A,B0); theano.tensor.dot(A,B1)

我愿意将B0和B1存储在不同的GPU中。并且A最初存储在一个GPU中,然后我使用显式传输功能将副本复制到另一个GPU。最后,我分别在两个GPU中点。

我的实施如下:

import numpy
import theano
va0 = theano.shared(numpy.random.random((1024, 1024)).astype('float32'),
                    target='dev0')
va1 = va0.transfer('dev1')
vb0 = theano.shared(numpy.random.random((1024, 512)).astype('float32'),
                    target='dev0')
vb1 = theano.shared(numpy.random.random((1024, 2048)).astype('float32'),
                    target='dev1')
vc0 = theano.tensor.dot(va0,vb0)
vc1 = theano.tensor.dot(va1,vb1)

f = theano.function([], [vc1,vc0])
print f()

当我查看nvprof结果时,我发现两个点仍然在同一GPU中运行。而va0.tranfer(' dev1')并不起作用。实际上它将vb1复制到dev0中,并且两个点都在dev0中计算。

我尝试过切断Theano Flags的组合,但是没有用。任何人都可以帮忙吗?

nvprof: two dot in same gpu

1 个答案:

答案 0 :(得分:1)

下面的Theano Flag解决了这个问题。

  

出口   THEANO_FLAGS = “上下文= dev0-> cuda0; dev1-> cuda1,optimizer_verbose =真,optimizer_excluding = local_cut_gpua_host_gpua”

optimizer_verbose提供由theano函数完成的优化。我注意到如下所示的一行:

  

local_cut_gpu_transfers HostFromGpu(gpuarray).0   HostFromGpu(gpuarray)0.0

local_cut_gpu_transfers的原因 HostFromGpu(gpuarray).0是原始节点,最后一个段是原始节点被替换为。

然后,我在Theano的源代码中搜索了关键字“local_cut_gpu_transfer”,直到找到:

  

optdb [ '规范化']。寄存器( 'local_cut_gpua_host_gpua',                                  local_cut_gpu_transfers,                                  'fast_compile','fast_run','gpuarray')

然后我将'local_cut_gpua_host_gpua'添加到Theano Flag中的optimizer_excluding。 希望Theano将提供详细的原因地图和优化人Theano Flag?