【发布时间】:2013-02-05 23:43:16
【问题描述】:
我正在做一个项目,我将计算任务分配给多个 python 进程,每个进程都与自己的 CUDA 设备相关联。
在生成子进程时,我使用以下代码:
import pycuda.driver as cuda
class ComputeServer(object):
def _init_workers(self):
self.workers = []
cuda.init()
for device_id in range(cuda.Device.count()):
print "initializing device {}".format(device_id)
worker = CudaWorker(device_id)
worker.start()
self.workers.append(worker)
CudaWorker 在另一个文件中定义如下:
from multiprocessing import Process
import pycuda.driver as cuda
class CudaWorker(Process):
def __init__(self, device_id):
Process.__init__(self)
self.device_id = device_id
def run(self):
self._init_cuda_context()
while True:
# process requests here
def _init_cuda_context(self):
# the following line fails
cuda.init()
device = cuda.Device(self.device_id)
self.cuda_context = device.make_context()
当我在 Windows 7 或 Linux 上运行此代码时,我没有遇到任何问题。在装有 OSX 10.8.2、Cuda 5.0 和 PyCuda 2012.1 的 MacBook Pro 上运行代码时,出现以下错误:
Process CudaWorker-1:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/Users/tombnorwood/pymodules/computeserver/worker.py", line 32, in run
self._init_cuda_context()
File "/Users/tombnorwood/pymodules/computeserver/worker.py", line 38, in _init_cuda_context
cuda.init()
RuntimeError: cuInit failed: no device
我没有在我的 Mac 上分叉新进程的情况下运行 PyCuda 脚本没有问题。我只有在生成新进程时才会遇到这个问题。
以前有人遇到过这个问题吗?
【问题讨论】:
-
我怀疑这与 OS X 有一大堆核心框架在
fork之后无法使用有关,而且 PyCuda 或 CUDA 本身都依赖其中一个...... -
我实际上也认为是这样。有没有办法解决?真的很烦人。
-
如果是这种情况,最简单的解决方法是执行一个新的 Python 解释器,而不是继续使用分叉的解释器。在某个地方有一个补丁版本的
multiprocessing可以做到这一点。 (它可能有一天会作为一个选项添加到主干,但它永远不会成为默认设置,因为这会使 OS Xmultiprocessing更像 Windows,而不是像 POSIX。)如果你想,你找不到它或自己弄清楚如何做(实际上很简单),我可以挖掘它。 -
没关系,找到了。特定于 Mac 的问题已作为错误提交,该错误已作为 #8713 的副本关闭(上面写着“Linux”,但实际上与所有 POSIX 平台有关)。如果您从源代码中复制
multiprocessing.py,应用补丁,将其重命名为其他名称,然后在其他任何内容之前调用mymultiprocessing.forking_disable(),它应该可以工作。 (2.7的补丁可能需要稍微按摩一下,但应该不会太难。) -
CudaWorker 进程对 GPU 的限制肯定比对 CPU 的限制更多,因此线程解决方案可能会起作用。如果我没记错的话,自从 PyCuda 0.9 CUDA 内核调用释放了 GIL,所以使用线程也不应该导致任何问题。
标签: python cuda multiprocessing osx-mountain-lion pycuda