使用Python3 / Theano,CUDA可能导致设备属性错误的原因是什么?

时间:2016-11-18 04:33:12

标签: python theano python-multiprocessing lasagne

我正在尝试在Python3中使用多个GPU进行多处理。我可以运行一个简单的测试用例,如下所示:

import theano
import theano.tensor as T
import multiprocessing as mp
import time
# import lasagne

def target():
    import theano.sandbox.cuda
    print("target about to use")
    theano.sandbox.cuda.use('gpu1')
    print("target is using")
    import lasagne
    time.sleep(15)
    print("target is exiting")

x = T.scalar('x', dtype='float32')

p = mp.Process(target=target)

p.start()

time.sleep(1)
import theano.sandbox.cuda
print("master about to use")
theano.sandbox.cuda.use('gpu0')
print("master is using")
import lasagne
time.sleep(4)
print("master will join")

p.join()
print("master is exiting")

当我运行它时,我成功地使用GPU获得了主程序和衍生程序:

>> target about to use
>> master about to use
>> Using gpu device 1: GeForce GTX 1080 (CNMeM is enabled with initial size: 50.0% of memory, cuDNN 5105)
>> target is using
>> Using gpu device 0: GeForce GTX 1080 (CNMeM is enabled with initial size: 50.0% of memory, cuDNN 5105)
>> master is using
>> master will join
>> target is exiting
>> master is exiting

但是在更复杂的代码库中,当我尝试设置相同的方案时,衍生的工作程序失败了:

ERROR (theano.sandbox.cuda): ERROR: Not using GPU. Initialisation of device 1 failed:
Unable to get properties of gpu 1: initialization error
ERROR (theano.sandbox.cuda): ERROR: Not using GPU. Initialisation of device gpu failed:
Not able to select available GPU from 2 cards (initialization error).

我正在努力追逐造成这种情况的原因。在上面的代码段中,如果在分叉之前在顶部导入lasagne,则会重新创建问题。但我设法阻止我的代码导入lasagne,直到分叉并尝试使用GPU(我检查sys.modules.keys()),但问题仍然存在。我没有看到任何与Theano相关的内容,除了theano本身和theano.tensor在分叉之前被导入,但在上面的示例中没有问题。

还有其他人追了类似的东西吗?

2 个答案:

答案 0 :(得分:0)

在使用GTX-980在Windows PC中尝试使用Python3配置Theano之前,我遇到了类似的问题。它在CPU上运行良好,但它只是没有使用GPU。

之后,我尝试使用Python2 / Theano进行配置,问题得到了解决。我想CUDA版本可能有问题。 您可以尝试使用Python2 / Theano(如果需要,可以使用虚拟环境)。

答案 1 :(得分:0)

好的,结果很简单......我在前叉位置有一个迷路import theano.sandbox.cuda,但这只需要在之后分叉。还有必要将lasagne导入到fork之后,以防其他人帮助。

(在我的情况下,我实际上需要在fork之前基于lasagne的代码提供信息,因此我必须生成一个抛弃进程,该进程加载该进程并将相关值返回给主线程。然后,master可以相应地构建共享对象,fork,然后每个进程构建自己的基于lasagne的对象,这些对象在自己的GPU上工作。)