es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo ejecutar vgg16 (transfer learning) en mi GPU que tiene 4GB de memoria?

Quiero usar VGG16 (aprendizaje transferido), pero no tengo suficiente memoria:

  • Según nvidia-smi, tengo 4GB de memoria
  • Modelo:
  • model = torchvision.models.vgg16(pretrained=True)          
    for p in model.parameters():
        p.requires_grad = False
    
    sin                 = model.classifier[0].in_features    
    model.classifier = nn.Sequential(
        nn.Linear(sin, 128), nn.ReLU(),
        nn.Linear(128, 2)
    )
    

De acuerdo con: torchinfo.summary(model, (64, 3, 224, 224))

Tamaño total estimado (MB): 7046.64

Y estoy intentando entrenar con:

DEVICE    = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") 
model     = model.to(DEVICE)
adam      = optim.AdamW  (model.parameters(), lr=1e-4, betas=(0.9, 0.99), weight_decay=2e-4)
loss      = nn.CrossEntropyLoss()

model.train(True) 
for ii, (x, y) in enumerate(trainDL):
    x = x.to(DEVICE)
    y = y.to(DEVICE)

    z   = model(x) 
    ...

Donde trainDL es torch.utils.data.DataLoader

  • Versiones:
  • torch==1.10.0

    torchinfo==1.5.3

    torchvision==0.11.1

Estoy recibiendo un mensaje de CUDA sin memoria (lo cual parece ser cierto porque tengo menos memoria GPU que el tamaño del modelo)

  1. ¿Cómo puedo usar vgg16 (aprendizaje transferido) y ejecutarlo en mi GPU?
  2. ¿Qué debo cambiar en mi código anterior para que se ejecute en mi GPU?
Tags:  

Answer

  1. Avatar for davy.ai
    1. Para utilizar vgg16 (aprendizaje transferido) con una memoria GPU limitada, puedes probar lo siguiente:
    • Utilizar un tamaño de grupo más pequeño: Reduce el tamaño del grupo en tu cargador de datos para ajustar el modelo a la memoria disponible.

    • Congelar más capas: Si el modelo todavía no cabe, intenta congelar más capas del modelo pre-entrenado. Cuantas más capas congeles, menos memoria requerirá el modelo.

    • Utilizar el punto de control de gradientes: Puedes utilizar el punto de control de gradientes para intercambiar cálculos y memoria. Esta técnica calcula gradientes para pequeños subconjuntos de los parámetros del modelo en cada iteración, reduciendo así el uso de la memoria GPU.

    1. Para que el código anterior se ejecute en tu GPU, necesitas:
    • Verificar si el dispositivo está disponible: la primera línea de código verifica si la GPU está disponible o no. Asegúrate de que devuelva True antes de ejecutar el entrenamiento en la GPU.

    • Mover el cargador de datos a la GPU: Utiliza trainDL = torch.utils.data.DataLoader(trainDS, batch_size=batch_size, shuffle=True, num_workers=2, pin_memory=True) para mover los datos a la GPU. El argumento pin_memory copia los datos a la memoria fijada, lo que hace que sea más rápido transferirlo a la GPU.

    • Mover el modelo y la pérdida a la GPU: Utiliza model.to(device) y loss.to(device) para mover el modelo y la función de pérdida a la GPU.

    • Reducir el tamaño de grupo: Si aún enfrentas un error CUDA fuera de memoria, reduce el tamaño del grupo hasta que se ajuste a tu memoria GPU.

Comments are closed.