1

我正在尝试实现一个简单的示例来展示如何在两个不同的 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:同一个gpu中的两个点

4

1 回答 1

1

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

导出 THEANO_FLAGS="contexts=dev0->cuda0;dev1->cuda1,optimizer_verbose=True,optimizer_ exclude=local_cut_gpua_host_gpua"

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

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

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

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

optdb['canonicalize'].register('local_cut_gpua_host_gpua', local_cut_gpu_transfers, 'fast_compile', 'fast_run', 'gpuarray')

然后我将“local_cut_gpua_host_gpua”添加到 Theano Flag 中的 optimizer_ exclude 中。 希望 Theano 提供详细的原因和优化器 Theano Flag 的图?

于 2016-04-27T04:17:27.330 回答