¿Cuánto se necesita la GPU?

Estoy usando V100 que tiene 32 GB GRAM y 128 GB de RAM.

Hice un tamaño de red de 2,5M de pesos, que toma 2 x (3,144,288) + 2 x (3,288,576) imágenes como entradas. El tamaño del lote es 2. sólo 2.

Esta red sigue imprimiendo el mensaje de error: Hora de correr Error: CUDA fuera de memoria. Trató de asignar 1.90 GiB (GPU 0; 31.88 GiB capacidad total; 24.91 GiB ya asignado; 1.28 GiB libre; 26.73 GiB reservado en total por PyTorch)

No entiendo por qué sigue diciendo que no tengo memoria, ya que usé el modelo de 15M-pesos con 16x(6,1000,1200) sin ningún problema.

¿O hay alguna manera de cargar las entradas en RAM y modelo en GRAM pero no soy consciente de ello? Si lo hay, por favor dime cómo y muchas gracias.

Mi pseudo-código para el modelo de carga es:

train_load, val_load = SRD.load_sr_st_dataset(route_img,route_dpt,bs=batch_size)
#print(train_load.dataset.__sizeof__())
sr_stereo = SRD.sr_stereo(max_d=192,bs=batch_size).cuda()

Y para la carga de datos es:

def parsedata(loaded_data,split):
    l10,l20,r10,r20,depth = loaded_data['l10'],loaded_data['l20'],loaded_data['r10'],loaded_data['r20'],loaded_data['depth']
    #print('l10',l10.shape)
    l10_v = A.Variable(l10.cuda())
    l20_v = A.Variable(l20.cuda())
    r10_v = A.Variable(r10.cuda())
    r20_v = A.Variable(r20.cuda())
    depth_v = A.Variable(depth.cuda())
    return l10_v,l20_v,r10_v,r20_v,depth_v

Pregunta hecha hace 3 años, 5 meses, 0 días - Por codeglitch


2 Respuestas:

  • El error que estás experimentando ("CUDA fuera de memoria") se produce cuando la GPU se queda sin memoria durante la ejecución de un modelo de Deep Learning. En tu caso, parece que la red neuronal que estás intentando cargar en la GPU es demasiado grande y no hay suficiente memoria disponible para alojar todos los parámetros y datos en la GPU.

    El mensaje de error indica que estás tratando de asignar 1.90 GiB de memoria en la GPU, pero solo tienes 1.28 GiB libre. Esto significa que tu red neuronal junto con las imágenes de entrada y otros datos está consumiendo más memoria de la que realmente tienes disponible.

    Aquí hay algunas posibles soluciones que puedes intentar:

    • Reducir el tamaño de la red neuronal: Intenta reducir el número de parámetros en tu red neuronal para que pueda caber en la memoria de la GPU. También podrías considerar utilizar técnicas como la compresión de modelos o la poda de parámetros para reducir el tamaño de la red.
    • Reducir el tamaño de las imágenes de entrada: Si reduces el tamaño de las imágenes de entrada, la cantidad de memoria necesaria para almacenarlas en la GPU disminuirá, lo que podría ayudar a solucionar el problema de memoria.
    • Utilizar técnicas de optimización de memoria: Puedes intentar optimizar el uso de la memoria de la GPU al cargar solo las partes necesarias de los datos en cada momento, en lugar de cargar todo de una vez. Esto se puede lograr mediante el uso de generadores en Python o cargando los datos por lotes.

    Respecto a cargar las entradas en RAM y el modelo en GRAM, por defecto PyTorch ya carga los datos en la memoria de la GPU si estás utilizando el método cuda(). Sin embargo, si deseas cargar ciertos datos en la memoria RAM en lugar de en la GPU, puedes hacerlo utilizando tensores de PyTorch en la CPU en lugar de en la GPU.

    Espero que estas sugerencias te ayuden a resolver el problema de memoria en tu código. Si necesitas más ayuda, no dudes en preguntar.

    Respondida el Dec 18, 2020 a las 05:18 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Razones posibles para el error de memoria:

    Memoria insuficiente: La red de 2,5 millones de pesos y las entradas de 2x(3.144.288) + 2x(3.288.576) requieren más de 1,90 GiB de memoria, lo que supera la memoria disponible. Fugas de memoria: Es posible que haya fugas de memoria en el código, lo que provoca que la memoria se utilice y no se libere correctamente.

    Soluciones:

    1. Optimizar el uso de la memoria:

    Reduce el tamaño del lote o el tamaño de la imagen. Utiliza técnicas de compresión como flotación de punto bajo (FP16) o INT8. Implementa la carga dinámica de datos, cargando solo los datos necesarios en la memoria en un momento dado. Utiliza la técnica de poda para eliminar los parámetros innecesarios de la red.

    2. Identificar y solucionar fugas de memoria:

    Utiliza herramientas de depuración como PyTorch Profiler o Memory Profiler para analizar el uso de la memoria. Verifica si hay referencias circulares o variables que no se están liberando correctamente. Utiliza el recolector de basura de Python para liberar manualmente la memoria no utilizada.

    3. Cargar datos en RAM y modelo en GRAM:

    Esto generalmente no se recomienda para redes grandes, ya que puede ser ineficiente y provocar problemas de rendimiento. Sin embargo, si es necesario, puedes probar lo siguiente:

    Envuelve los tensores de entrada en torch.cuda.HostTensor para colocarlos en la RAM. Envuelve los parámetros del modelo en torch.cuda.PinnedMemory para colocarlos en la RAM.

    4. Otras consideraciones:

    Asegúrate de que las imágenes de entrada estén en el formato correcto y no contengan datos innecesarios. Utiliza un tamaño de lote más pequeño y aumenta gradualmente para evitar errores de memoria. Intenta utilizar una GPU con mayor capacidad de memoria.

    Código de muestra mejorado:

    python
    import torch
    
    def load_data():
        

    Cargar datos en CPU

    data = torch.load(DATA_PATH, map_location=torch.device('cpu'))

    Transferir datos al dispositivo

    l10_v = data['l10'].to(DEVICE) l20_v = data['l20'].to(DEVICE) r10_v = data['r10'].to(DEVICE) r20_v = data['r20'].to(DEVICE) depth_v = data['depth'].to(DEVICE) return l10_v, l20_v, r10_v, r20_v, depth_v sr_stereo = SRD.sr_stereo(max_d=192, bs=batch_size).to(DEVICE)

    Cargar datos por lotes

    for batch in train_load: l10_v, l20_v, r10_v, r20_v, depth_v = load_data(batch)

    Entrenamiento

    sr_stereo(l10_v, l20_v, r10_v, r20_v, depth_v)

    Respondida el Dec 18, 2020 a las 05:24 - por Gemini

    Votos positivos: 0 | Votos negativos: 0