CUDA错误:在python

时间:2015-11-17 03:40:11

标签: python cuda parallel-processing

我将CUDA用于我的代码,但它仍然运行缓慢。因此,我将其更改为使用python中的多处理(pool.map)并行运行。但我有CUDA ERROR: initialization error

这是功能:

def step_M(self, iter_training):
    gpe, e_tuple_list = iter_training
    g = gpe[0]
    p = gpe[1]
    em_iters = gpe[2]

    e_tuple_list = sorted(e_tuple_list, key=lambda tup: tup[0])
    data = self.X[e_tuple_list[0][0]:e_tuple_list[0][1]]
    cluster_indices = np.array(range(e_tuple_list[0][0], e_tuple_list[0][1], 1), dtype=np.int32)
    for i in range(1, len(e_tuple_list)):
        d = e_tuple_list[i]
        cluster_indices = np.concatenate((cluster_indices, np.array(range(d[0], d[1], 1), dtype=np.int32)))
        data = np.concatenate((data, self.X[d[0]:d[1]]))

    g.train_on_subset(self.X, cluster_indices, max_em_iters=em_iters)
    return g, cluster_indices, data

这里代码调用:

pool = Pool()
iter_bic_list = pool.map(self.step_M, iter_training.items())

iter_training相同: enter image description here

这是错误 enter image description here 你能帮我修理一下吗。谢谢你。

3 个答案:

答案 0 :(得分:2)

我意识到这有点老了,但我遇到了同样的问题,在我的情况下在芹菜下运行:

syncedmem.cpp:63] Check failed: error == cudaSuccess (3 vs. 0)  initialization error

从prefork切换到基于eventlet的池已解决了该问题。您的代码可以更新类似于:

from eventlet import GreenPool
pool = GreenPool()
iter_bic_list = list(pool.imap(self.step_M, iter_training.items()))

答案 1 :(得分:1)

我发现这是cuda为进程ID添加互斥锁的问题。 因此,当您使用多处理模块时,会生成另一个带有单独pid的子进程。由于GPU的互斥锁,它无法访问。

我发现一个快速的解决方案是使用线程模块而不是多处理模块。

所以基本上在gpu中加载网络的pid应该使用它。

答案 2 :(得分:0)

尝试

sudo ldconfig /usr/local/cuda/lib64