¿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)
- ¿Cómo puedo usar
vgg16
(aprendizaje transferido) y ejecutarlo en mi GPU? - ¿Qué debo cambiar en mi código anterior para que se ejecute en mi GPU?
davy.ai
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.
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 argumentopin_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)
yloss.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.