在 Windows 环境中,如果 GPU 已经使用,Cupy 在 multithread.pool 中会出错,即使我使用了 multiprocessing.set_start_method('spaw

Posted

技术标签:

【中文标题】在 Windows 环境中,如果 GPU 已经使用,Cupy 在 multithread.pool 中会出错,即使我使用了 multiprocessing.set_start_method(\'spawn\')【英文标题】:In windows envs, Cupy get error in multithread.pool if GPU already used, even if I have used multiprocessing.set_start_method('spawn')在 Windows 环境中,如果 GPU 已经使用,Cupy 在 multithread.pool 中会出错,即使我使用了 multiprocessing.set_start_method('spawn') 【发布时间】:2019-06-25 11:46:54 【问题描述】:

我使用 chainer 框架来训练我的 CNN。为了加快速度,我使用了 cupy 和 multiprocess 包。但是,即使我添加了 multiprocessing.set_start_method('spawn') 语句,我仍然会遇到这样的错误:

CUDARuntimeError.初始化

TypeError:需要一个整数

我的环境是:

win10

py3.7

cuda9.2

在我问这个问题之前,我已经参考了这个链接:Cupy get error in multithread.pool if GPU already used。总的程序代码太长,所以我把我的部分程序(引发错误的函数)显示如下:

class CNNEvaluation(object):

    def __init__(self, gpu_num, epoch_num=50, batchsize=256,dataset='cifar10', valid_data_ratio=0.1, verbose=True):

        self.gpu_num = gpu_num
        self.epoch_num = epoch_num
        self.batchsize = batchsize
        self.dataset = dataset
        self.valid_data_ratio = valid_data_ratio
        self.verbose = verbose

    def __call__(self, net_lists):
        ctx = mp.get_context('spawn')
        evaluations = np.zeros(len(net_lists))

        for i in np.arange(0, len(net_lists), self.gpu_num):
            process_num = np.min((i + self.gpu_num, len(net_lists))) - i
            pool = ctx.Pool(process_num)
            arg_data = [(cnn_eval, net_lists[i+j], j, self.epoch_num, self.batchsize, self.dataset,
                         self.valid_data_ratio, self.verbose) for j in range(process_num)]
            evaluations[i:i+process_num] = pool.map(arg_wrapper_mp, arg_data)
            pool.terminate()

        return evaluations

输出如下:

Exception in thread Thread-6:
Traceback (most recent call last):
File "D:\AppInstall\Anaconda3\envs\py3_7\lib\threading.py", line 917, in _bootstrap_inner
    self.run()
File "D:\AppInstall\Anaconda3\envs\py3_7\lib\threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)

  File "D:\AppInstall\Anaconda3\envs\py3_7\lib\multiprocessing\pool.py", line 470, in _handle_results

    task = get()

  File "D:\AppInstall\Anaconda3\envs\py3_7\lib\multiprocessing\connection.py", line 251, in recv

    return _ForkingPickler.loads(buf.getbuffer())

  File "cupy\cuda\runtime.pyx", line 134, in 

cupy.cuda.runtime.CUDARuntimeError.__init__
TypeError: an integer is required

然后代码冻结并且不退出。我不明白为什么我添加了 multiprocessing.set_start_method('spawn') 语句,我仍然有错误消息。是不是因为我在 windows envs 中运行程序而不是在 linux 中运行程序?

【问题讨论】:

【参考方案1】:

这是因为 CuPy 异常不能被腌制,即子进程中引发的异常不能传播到其父进程。此问题将在https://github.com/cupy/cupy/pull/2318 中修复。

【讨论】:

以上是关于在 Windows 环境中,如果 GPU 已经使用,Cupy 在 multithread.pool 中会出错,即使我使用了 multiprocessing.set_start_method('spaw的主要内容,如果未能解决你的问题,请参考以下文章

Keras 不使用 GPU - 如何排除故障?

在windows上极简安装GPU版AI框架

在windows上极简安装GPU版AI框架(TensorflowPytorch)

TensorFlow-GPU环境配置之一——安装Ubuntu双系统

Windows搭建Pytorch环境(GPU版本,含CUDAcuDNN),并在Pycharm上使用(零基础小白向)

windows系统下,gpu开发环境部署