如果已使用GPU,则Cupy在多线程.pool中出现错误 [英] Cupy get error in multithread.pool if GPU already used

查看:11
本文介绍了如果已使用GPU,则Cupy在多线程.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

推荐答案

此问题并非特定于CuPy。由于CUDA的限制,CUDA初始化后无法派生进程。

在派生子进程之前,您需要使用multiprocessing.set_start_method('spawn')(或forkserver),或避免初始化CUDA(即,除import cupy外,不要使用CuPy API)。

这篇关于如果已使用GPU,则Cupy在多线程.pool中出现错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆