Estoy tratando de usar el método Pool de multiprocesamiento de python en pytorch para procesar una imagen. Aquí está el código:
from multiprocessing import Process, Pool from torch.autograd import Variable import numpy as np from scipy.ndimage import zoom def get_pred(args): img = args[0] scale = args[1] scales = args[2] img_scale = zoom(img.numpy(), (1., 1., scale, scale), order=1, prefilter=False, mode='nearest') # feed input data input_img = Variable(torch.from_numpy(img_scale), volatile=True).cuda() return input_img scales = [1,2,3,4,5] scale_list = [] for scale in scales: scale_list.append([img,scale,scales]) multi_pool = Pool(processes=5) predictions = multi_pool.map(get_pred,scale_list) multi_pool.close() multi_pool.join()Estoy recibiendo este error:
`RuntimeError: Cannot re-initialize CUDA in forked subprocess. To use CUDA with multiprocessing, you must use the 'spawn' start method` En esta línea:
predictions = multi_pool.map(get_pred,scale_list)¿Alguien puede decirme qué estoy haciendo mal?
Como se indica en la documentación de pytorch, la mejor práctica para manejar el multiprocesamiento es usar torch.multiprocessing en lugar de multiprocessing .
Tenga en cuenta que compartir tensores CUDA entre procesos solo se admite en Python 3, ya sea con spawn o forkserver como método de inicio.
Sin tocar su código, una solución para el error que recibió es reemplazar
from multiprocessing import Process, Poolcon:
from torch.multiprocessing import Pool, Process, set_start_method try: set_start_method('spawn') except RuntimeError: passLe sugiero que lea los documentos del módulo de multiprocesamiento, especialmente esta sección . Deberá cambiar la forma en que se crean los subprocesos llamando a set_start_method . Tomado de los documentos citados:
import multiprocessing as mp def foo(q): q.put('hello') if __name__ == '__main__': mp.set_start_method('spawn') q = mp.Queue() p = mp.Process(target=foo, args=(q,)) p.start() print(q.get()) p.join()