我试图实现一个简单的示例,以展示如何在两个不同的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的组合,但是没有用。任何人都可以帮忙吗?
答案 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?