Cupy получает ошибку в multithread.pool, если графический процессор уже используется
Я пытался использовать cupy в двух частях моей программы, одна из которых была распараллелена с пулом. Мне удалось воспроизвести это на простом примере:
import cupy
import numpy as np
from multiprocessing import pool
def f(x):
return cupy.asnumpy(2*cupy.array(x))
input = np.array([1,2,3,4])
print(cupy.asnumpy(cupy.array(input)))
print(np.array(list(map(f, input))))
p = pool.Pool(4)
output = p.map(f, input)
p.close()
p.join()
print(output)
Вывод следующий:
[1 2 3 4]
[2 4 6 8]
Exception in thread Thread-3:
Traceback (most recent call last):
File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
self.run()
File "/usr/lib/python3.6/threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "/usr/lib/python3.6/multiprocessing/pool.py", line 489, in _handle_results
task = get()
File "/usr/lib/python3.6/multiprocessing/connection.py", line 251, in recv
return _ForkingPickler.loads(buf.getbuffer())
File "cupy/cuda/runtime.pyx", line 126, in cupy.cuda.runtime.CUDARuntimeError.__init__
TypeError: an integer is required
Кроме того, код зависает и не выходит, но я думаю, что это не относится к Cupy.
И мой конфиг такой:
CuPy Version : 5.2.0
CUDA Root : /usr/local/cuda-10.0
CUDA Build Version : 10000
CUDA Driver Version : 10000
CUDA Runtime Version : 10000
cuDNN Build Version : 7301
cuDNN Version : 7301
NCCL Build Version : 2307
2 ответа
Эта проблема не относится к CuPy. Из-за ограничения CUDA процессы не могут быть разветвлены после инициализации CUDA.
Вам нужно использовать multiprocessing.set_start_method('spawn')
(или же forkserver
), или избегайте инициализации CUDA (т. е. не используйте CuPy API, кроме import cupy
), пока вы не разветвите дочерние процессы.
Когда я попробовал многопроцессорную работу с cupy
раньше мне нужно было использовать контекст spawn.
ctx = multiprocessing.get_context('spawn')
pool = ctx.Pool(4)
Я не знаю, что это решит вашу проблему, но вы можете попробовать это?