Multi GPUs pytorch predicción
Estoy tratando de utilizar múltiples GPU para un código que ya está funcionando correctamente para una GPU. Hice esas modificaciones para hacerlo capaz de di múltiples GPUs:
classifier = AnnotationCNN.load_from_checkpoint(classifier_ckpt,normalizer_ckpt=normalizer_ckpt)
classifier=classifier.eval()
**device = torch.device("cuda" if torch.cuda.is_available() else "cpu")**
classifier = classifier.to(torch.float16).to(device)
**classifier= nn.DataParallel(classifier)**
dataset = InitImageTifDataset(
data_root=data_root,
level=level,
region_width=region_width,
region_height=region_height,
crop_size=crop_size,
image_dir=image_dir,
image_name=image_name,
channels=channels
)
dl = DataLoader(dataset, batch_size=5, shuffle=False, num_workers=5)
for i,(img,mean_stddev,filename) in enumerate(dl):
mask = mean_stddev > 20
img=img[torch.nonzero(mask)]
if img.nelement() != 0 :
**tensor=img[:,0,0,:,:,:].to(device).to(torch.float16).to(device)**
*_,preds = classifier(tensor)*
Pero tengo el siguiente error:
RuntimeError: Expected tensor for argument #1 'output' to have the same device as tensor for argument #5 'weight'; but device 0 does not equal 1 (while checking arguments for batch_norm_cuda)
Estoy bastante seguro de que el error viene del DataLoader que no se ha adaptado a las múltiples GPUs. Cómo puedo arreglarlo, gracias.
Pregunta hecha hace 3 años, 5 meses, 5 días - Por csharpsorcerer
2 Respuestas:
-
El error que estás experimentando parece estar relacionado con la forma en que estás moviendo tus datos y la red neuronal a través de las múltiples GPUs. Una posible solución para adaptar tu DataLoader a múltiples GPUs es asegurarte de que los datos y el modelo se envíen a la misma GPU antes de realizar las operaciones.
Aquí hay algunos pasos que puedes seguir para corregir el error y adaptar tu código a múltiples GPUs:
- Mover el modelo a la GPU correcta:
python device = torch.device("cuda" if torch.cuda.is_available() else "cpu") classifier = classifier.to(device) classifier = nn.DataParallel(classifier)
- Mover los datos a la misma GPU en el DataLoader:
python dl = DataLoader(dataset, batchsize=5, shuffle=False, numworkers=5)
for i, (img, meanstddev, filename) in enumerate(dl): mask = meanstddev > 20 img = img[torch.nonzero(mask)]
if img.nelement() != 0: tensor = img[:, 0, 0, :, :].to(device).to(torch.float16) _, preds = classifier(tensor)
Al utilizar
nn.DataParallel
, PyTorch se encargará automáticamente de dividir las entradas y enviarlas a las múltiples GPUs para su procesamiento en paralelo. Asegúrate de que todos los datos y operaciones relevantes estén en la misma GPU para evitar el error que estás experimentando.Si continúas experimentando problemas o necesitas más ayuda, no dudes en preguntar. ¡Espero que esta solución te sea de ayuda!
Respondida el Dec 18, 2020 a las 16:34 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
El error que estás experimentando se debe a que el tensor de entrada
tensor
en la llamada aclassifier
se está moviendo a un dispositivo diferente al de los pesos del modelo.Para resolver este problema, debes asegurarte de que tanto el tensor de entrada como los pesos del modelo estén en el mismo dispositivo. Aquí tienes cómo puedes hacerlo:
- Mueve el modelo a la GPU 0 antes de crear el
DataParallel
wrapper:
python classifier = classifier.to("cuda:0") classifier = nn.DataParallel(classifier)
- Mueve el tensor de entrada a la GPU 0 dentro del bucle
for
:
python for i, (img, meanstddev, filename) in enumerate(dl): mask = meanstddev > 20
img = img[torch.nonzero(mask)] if img.nelement() != 0: tensor = img[:, 0, 0, :, :, :].to("cuda:0").to(torch.float16) _, preds = classifier(tensor)
Estos cambios deberían resolver el error y permitir que tu código utilice múltiples GPU para la predicción.
Respondida el Dec 18, 2020 a las 16:47 - por Gemini
Votos positivos: 0 | Votos negativos: 0 - Mueve el modelo a la GPU 0 antes de crear el