В Windows Envs Cupy получает ошибку в multithread.pool, если графический процессор уже используется, даже если я использовал multiprocessing.set_start_method ('spawn') - PullRequest
1 голос
/ 25 июня 2019

Я использую структуру цепей, чтобы обучить мою CNN. Для ускорения я использую пакетную и многопроцессорную систему. Однако, даже если я добавил оператор multiprocessing.set_start_method ('spawn'), я все равно сталкиваюсь с такой ошибкой:

CUDARuntimeError. INIT

TypeError: требуется целое число

Мои envs:

win10

py3.7

cuda9.2

Прежде чем я задал этот вопрос, я ссылался на эту ссылку: Ошибка получения Cupy в файле multithread.pool, если графический процессор уже использовал . Весь код программы слишком длинный, поэтому я показываю часть моей программы (функция, которая вызывает ошибку) следующим образом:

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 Ответ

0 голосов
/ 19 июля 2019

Это связано с тем, что исключения CuPy не могут быть выбраны, т.е. исключения, возникшие в дочерних процессах, не могут быть переданы его родительскому процессу.Эта проблема будет исправлена ​​в https://github.com/cupy/cupy/pull/2318.

...