Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

1.1K
Visualizações
Error de memoria insuficiente de CUDA, no se puede reducir el tamaño del lote

Quiero ejecutar algunos experimentos en mi dispositivo GPU, pero aparece este error:

RuntimeError: CUDA sin memoria. Intenté asignar 3,63 GiB (GPU 0; 15,90 GiB de capacidad total; 13,65 GiB ya asignados; 1,57 GiB libres; 13,68 GiB reservados en total por PyTorch)

Leí sobre posibles soluciones aquí , y la solución común es esta:

Se debe a que el mini lote de datos no cabe en la memoria de la GPU. Simplemente disminuya el tamaño del lote. Cuando configuré el tamaño del lote = 256 para el conjunto de datos cifar10, obtuve el mismo error; Luego configuro el tamaño del lote = 128, se soluciona.

Pero en mi caso, es un proyecto de investigación, y quiero tener hiperparámetros específicos y no puedo reducir nada, como el tamaño del lote.

¿Alguien tiene una solución para esto?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Siempre que una sola muestra pueda caber en la memoria de la GPU, no es necesario que reduzca el tamaño efectivo del lote: puede realizar la acumulación de gradientes . En lugar de actualizar los pesos después de cada iteración (en función de los gradientes calculados a partir de un minilote demasiado pequeño), puede acumular los gradientes para varios minilotes y solo cuando vea suficientes ejemplos, solo entonces actualizará los pesos.
Esto está muy bien explicado en este video .

Efectivamente, su código de entrenamiento se vería así. Suponga que su tamaño de lote grande es large_batch , pero solo puede caber small_batch en la memoria de la GPU, de modo que large_batch = small_batch * k . Entonces desea actualizar los pesos cada k iteraciones:

 train_data = DataLoader(train_set, batch_size=small_batch, ...) opt.zero_grad() # this signifies the start of a large_batch for i, (x, y) in train_data: pred = model(x) loss = criterion(pred, y) loss.backward() # gradeints computed for small_batch if (i+1) % k == 0 or (i+1) == len(train_data): opt.step() # update the weights only after accumulating k small batches opt.zero_grad() # reset gradients for accumulation for the next large_batch
over 4 years ago · Santiago Trujillo Relatório

0

La respuesta de Shai es adecuada, pero quiero ofrecer otra solución. Recientemente, observé resultados asombrosos de Nvidia AMP - Automatic Mixed Precision, que es una buena combinación de las ventajas de fp16 vs fp32. Un efecto secundario positivo es que también acelera significativamente el entrenamiento.

Es solo una línea de código en tensorflow: opt = tf.train.experimental.enable_mixed_precision_graph_rewrite(opt)

Más detalles aquí

También puede apilar AMP con la solución de Shai.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda