私は、それぞれが独自の CUDA デバイスに関連付けられている複数の python プロセスに計算タスクを分散するプロジェクトに取り組んでいます。
サブプロセスを生成するときは、次のコードを使用します。
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 スクリプトを実行しても問題はありません。この問題は、新しいプロセスを生成するときにのみ発生します。
以前にこの問題に遭遇した人はいますか?