CUDA错误:在Python中使用并行时的初始化错误。

4

我使用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 能否帮我修复。谢谢。


谢谢您的回复。libcudart的原因是设置了路径库。 我设置了: sudo ln -s /usr/local/cuda/lib64/libcudart.so /usr/lib/libcudart.so sudo ldconfig。然后它不再显示错误。但CUDA错误:初始化仍然显示。 - Hudo
4个回答

8

我发现使用cuda对进程ID进行了互斥操作,从而导致了一个问题。当您使用多进程模块时,会生成具有单独pid的另一个子进程。由于GPU的互斥锁,该子进程无法访问它。

我找到的一个快速解决方法是使用线程模块代替多进程模块。

因此,加载GPU网络的相同pid应该使用它。


1
这对我在五年后使用tensorflow 2.6.0时非常有帮助。谢谢! - clime

3

我知道这篇文章有点老了,但是我遇到了同样的问题,在我的情况下是在运行celery时:

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()))

2
我也遇到了同样的错误。我没有使用Pool,而是使用multiprocessing.Process,我该怎么办? - João Abrantes
这是顺序的。 - Oleg

3

我曾经遇到过同样的问题,原因是如果在fork()之前创建了CUDA上下文,则无法在子进程中使用该上下文。 当您调用cudaGetDeviceCount();时,在父进程中隐式创建的CUDA上下文会尝试共享,而cudaSetDevice(0);调用则会失败。

解决方法:

以上问题有两种可能的解决方案:

1-所有与CUDA相关的操作都应在父进程或子进程下执行(请确保在子进程下不要在父进程中进行任何CUDA调用,例如torch.cuda.is_available()和torch.manual_seed在PyTorch 0.2.0中都被视为CUDA调用

2-将进程类型更改为spawn(),对于Python使用语法multiprocessing.set_start_method('spawn')在初始化进程之前设置

例如:

import multiprocess as multiprocessing
multiprocessing.set_start_method('spawn')
p1 = multiprocessing.Process(target=fun, args=(param1,)
p1.start()
p1.join()

我可以在第二个上加100吗?这真的帮了我很大的忙。 - undefined

-1

尝试

sudo ldconfig /usr/local/cuda/lib64

命令ldconfig可以修复libcudart,因为它无法找到路径。您能帮我修复CUDA错误:初始化错误吗? - Hudo
你可以尝试进入NVIDIA_samples / 1_utilities / deviceQuery并运行/deviceQuery。你看到了什么? - Jim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接