Hoy, cuando estaba entrenando el modelo, de repente reporté el problema de memoria de video insuficiente. Después de analizarlo, encontré una solución. Lo registraré aquí para futuras referencias.
Nota : ¡La siguiente solución es cuando este error ocurre durante la prueba del modelo en lugar del entrenamiento del modelo!
RuntimeError: CUDA sin memoria
Mensaje de error completo:
Traceback (most recent call last):
File "/home/pytorch/LiangXiaohan/MI_Same_limb/Joint_Motion_Decoding/SelfAten_Mixer/main.py", line 420, in <module>
main()
File "/home/pytorch/LiangXiaohan/MI_Same_limb/Joint_Motion_Decoding/SelfAten_Mixer/main.py", line 414, in main
train_with_cross_validate(training_epochs, kfolds, train_indices, eval_indices, X_train, Y_train, model, losser, optimizer)
File "/home/pytorch/LiangXiaohan/MI_Same_limb/Joint_Motion_Decoding/SelfAten_Mixer/main.py", line 77, in train_with_cross_validate
val_probs = model(inputs)
File "/home/pytorch/anaconda3/envs/pytorch_env/lib/python3.7/site-packages/torch/nn/modules/module.py", line 1130, in _call_impl
return forward_call(*input, **kwargs)
File "/home/pytorch/LiangXiaohan/MI_Same_limb/Joint_Motion_Decoding/SelfAten_Mixer/model/S_CAMLP_Net.py", line 235, in forward
x = self.camlp_mixer(x) # (batch_size, F, C, L)
File "/home/pytorch/anaconda3/envs/pytorch_env/lib/python3.7/site-packages/torch/nn/modules/module.py", line 1130, in _call_impl
return forward_call(*input, **kwargs)
File "/home/pytorch/anaconda3/envs/pytorch_env/lib/python3.7/site-packages/torch/nn/modules/container.py", line 139, in forward
input = module(input)
File "/home/pytorch/anaconda3/envs/pytorch_env/lib/python3.7/site-packages/torch/nn/modules/module.py", line 1130, in _call_impl
return forward_call(*input, **kwargs)
File "/home/pytorch/LiangXiaohan/MI_Same_limb/Joint_Motion_Decoding/SelfAten_Mixer/model/S_CAMLP_Net.py", line 202, in forward
x = self.time_mixing_unit(x)
File "/home/pytorch/anaconda3/envs/pytorch_env/lib/python3.7/site-packages/torch/nn/modules/module.py", line 1130, in _call_impl
return forward_call(*input, **kwargs)
File "/home/pytorch/LiangXiaohan/MI_Same_limb/Joint_Motion_Decoding/SelfAten_Mixer/model/S_CAMLP_Net.py", line 186, in forward
x = self.mixing_unit(x)
File "/home/pytorch/anaconda3/envs/pytorch_env/lib/python3.7/site-packages/torch/nn/modules/module.py", line 1130, in _call_impl
return forward_call(*input, **kwargs)
File "/home/pytorch/LiangXiaohan/MI_Same_limb/Joint_Motion_Decoding/SelfAten_Mixer/model/S_CAMLP_Net.py", line 147, in forward
x = self.activate(x)
File "/home/pytorch/anaconda3/envs/pytorch_env/lib/python3.7/site-packages/torch/nn/modules/module.py", line 1130, in _call_impl
return forward_call(*input, **kwargs)
File "/home/pytorch/anaconda3/envs/pytorch_env/lib/python3.7/site-packages/torch/nn/modules/activation.py", line 772, in forward
return F.leaky_relu(input, self.negative_slope, self.inplace)
File "/home/pytorch/anaconda3/envs/pytorch_env/lib/python3.7/site-packages/torch/nn/functional.py", line 1633, in leaky_relu
result = torch._C._nn.leaky_relu(input, negative_slope)
RuntimeError: CUDA out of memory. Tried to allocate 2.49 GiB (GPU 0; 23.70 GiB total capacity; 21.49 GiB already allocated; 550.81 MiB free; 21.53 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF
Debido a que el programa escrito por mí tendrá salida después de una ronda de entrenamiento, esta información ocurre durante el proceso de predicción del modelo .
Mensaje de error clave:
RuntimeError: CUDA out of memory. Tried to allocate 2.49 GiB (GPU 0; 23.70 GiB total capacity; 21.49 GiB already allocated; 550.81 MiB free; 21.53 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF
Generalmente significa que la memoria de video no es suficiente .
Use el siguiente código para ver el estado de la tarjeta gráfica durante la ejecución del programa:
nvidia-smi -l 1
Después de cargar el modelo, el estado de la tarjeta gráfica en este momento:
El estado de la tarjeta gráfica durante el entrenamiento del modelo:
Una vez que se completa el entrenamiento del modelo, comienza la etapa de predicción del modelo y, una vez que se ingresan los datos en el modelo, aparece inmediatamente el siguiente estado de la tarjeta gráfica y la duración de este estado es muy corta. Durante el proceso de visualización, solo hay una salida como esta:
Inmediatamente después de que el programa informara un error, se liberó la memoria de la tarjeta gráfica y el programa en ejecución desapareció de la barra de tareas de la tarjeta gráfica:
Entonces, me siento muy extraño, creo que es un problema de gradiente, porque es normal durante el entrenamiento, y luego hay un problema con la predicción del modelo, y luego el entrenamiento del modelo necesita información de gradiente, la predicción del modelo no necesita información de gradiente, entonces yo intenta resolver el problema del gradiente:
Simplemente agregue la siguiente oración delante del código de entrenamiento del modelo:
with torch.no_grad():
El código modificado se ve así:
with torch.no_grad():
# validation
model.eval()
inputs = x_eval.to(device)
val_probs = model(inputs)
val_acc = (val_probs.argmax(dim=1) == y_eval.to(device)).float().mean()
# print(f"Eval : Epoch : {iter} - kfold : {kfold+1} - acc: {val_acc:.4f}\n")
epoch_val_acc += val_acc
El estado de la tarjeta gráfica en la etapa de predicción del modelo después del cambio es el siguiente:
Luego comience una nueva ronda de proceso de capacitación y el uso de la memoria de video de la tarjeta gráfica no ha cambiado.
¡De esta manera, no se informarán más errores! ! !