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, 4 meses, 29 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 a classifier 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