RuntimeError: CUDA sin memoria

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:

inserte la descripción de la imagen aquí

El estado de la tarjeta gráfica durante el entrenamiento del modelo:

inserte la descripción de la imagen aquí

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:

inserte la descripción de la imagen aquí

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:

inserte la descripción de la imagen aquí

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:

inserte la descripción de la imagen aquí
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! ! !

Supongo que te gusta

Origin blog.csdn.net/qq_41990294/article/details/128999777
Recomendado
Clasificación