Hoe deze vreemde fout op te lossen: “RuntimeError: CUDA-fout: onvoldoende geheugen”

Ik heb een code uitgevoerd over het deep learning-netwerk, eerst heb ik het netwerk getraind en het werkt goed, maar deze fout treedt op wanneer ik naar het valideringsnetwerk ren.

Ik heb vijf tijdperken, elk tijdperk heeft een proces van training en validatie. Ik ontmoette de fout bij het valideren in het eerste tijdperk. Dus ik voer de valideringscode niet uit, ik ontdekte dat die code naar het tweede tijdperk kan lopen en geen fout heeft.

Mijn code:

for epoch in range(10,15): # epoch: 10~15
    if(options["training"]["train"]):
        trainer.epoch(model, epoch)
    if(options["validation"]["validate"]):
    #if(epoch == 14):
        validator.epoch(model)


Ik heb het gevoel dat de validatiecode fouten bevat. Maar dat kan ik niet vinden.


Antwoord 1, autoriteit 100%

De fout die u heeft opgegeven, wordt weergegeven omdat u onvoldoende geheugen heeft op uw GPU. Een manier om dit op te lossen, is door de batchgrootte te verkleinen totdat uw code zonder deze fout wordt uitgevoerd.


Antwoord 2, autoriteit 74%

1.. Wanneer u alleen validatie uitvoert en niet traint,
u hoeft geen hellingen te berekenen voor voorwaartse en achterwaartse fase.
In dat geval kan uw code worden gevonden onder

with torch.no_grad():
    ...
    net=Net()
    pred_for_validation=net(input)
    ...

Bovenstaande code gebruikt geen GPU-geheugen

2.. Als u de operator += in uw code gebruikt,
het kan continu verloop in uw verloopgrafiek accumuleren.
In dat geval moet je float() gebruiken zoals de volgende site
https ://pytorch.org/docs/stable/notes/faq.html#my-model-reports-cuda-runtime-error-2-out-of-memory

Zelfs als docs-gidsen met float(), in het geval van mij, werkte item() ook als

entire_loss=0.0
for i in range(100):
    one_loss=loss_function(prediction,label)
    entire_loss+=one_loss.item()

3.. Als u for loop in trainingscode gebruikt,
gegevens kunnen worden aangehouden totdat de hele for-lus eindigt.
Dus in dat geval kun je variabelen expliciet verwijderen na het uitvoeren van optimizer.step()

for one_epoch in range(100):
    ...
    optimizer.step()
    del intermediate_variable1,intermediate_variable2,...

Antwoord 3, autoriteit 44%

De beste manier is om het proces met gpu-geheugen te vinden en het te doden:

vind de PID van het python-proces van:

nvidia-smi

kopieer de PID en verwijder deze door:

sudo kill -9 pid

Antwoord 4, autoriteit 37%

Ik had hetzelfde probleem en deze code werkte voor mij :

import gc
gc.collect()
torch.cuda.empty_cache()

Antwoord 5, autoriteit 26%

Het kan zijn dat ik een aantal redenen probeer te vermelden in de volgende lijst:

  1. Modules parameters: controleer het aantal dimensies voor uw modules. Lineaire lagen die een grote invoertensor (bijvoorbeeld grootte 1000) transformeren in een andere grote uitvoertensor (bijvoorbeeld grootte 1000), hebben een matrix nodig met een grootte van (1000, 1000).
  2. Maximum aantal stappen RNN-decoder: als u een RNN-decoder in uw architectuur gebruikt, vermijd dan het doorlopen van een groot aantal stappen. Gewoonlijk bepaal je een bepaald aantal decoderingsstappen dat redelijk is voor je dataset.
  3. Gebruik van tensoren: minimaliseer het aantal tensoren dat u maakt. De vuilnisman zal ze pas vrijgeven als ze buiten bereik zijn.
  4. Batchgrootte: verhoog uw batchgrootte stapsgewijs totdat u geen geheugen meer heeft. Het is een veelgebruikte truc die zelfs beroemde bibliotheken implementeren (zie de biggest_batch_firstbeschrijving voor de BucketIteratorin AllenNLP.

Daarnaast raad ik u aan de officiële PyTorch-documentatie te bekijken: https ://pytorch.org/docs/stable/notes/faq.html


Antwoord 6, autoriteit 7%

Ik ben een Pytorch-gebruiker. In mijn geval was de oorzaak van deze foutmelding eigenlijk niet te wijten aan GPU-geheugen, maar aan de versie die niet overeenkomt tussen Pytorch en CUDA.

Controleer of de oorzaak echt aan uw GPU-geheugen ligt, door middel van een code hieronder.

import torch
foo = torch.tensor([1,2,3])
foo = foo.to('cuda')

Als er nog steeds een fout optreedt voor de bovenstaande code, is het beter om uw Pytorch opnieuw te installeren volgens uw CUDA-versie. (In mijn geval loste dit het probleem op.)
Pytorch-installatielink

Een soortgelijk geval zal zich ook voordoen voor Tensorflow/Keras.


Antwoord 7, autoriteit 4%

Als je deze foutmelding krijgt in Google Colab, gebruik dan deze code:

import torch
torch.cuda.empty_cache()

Antwoord 8

Als iemand hier arriveert vanwege fast.ai, kan de batchgrootte van een loader zoals ImageDataLoadersworden geregeld via bs=Nwaarbij N de grootte is van de batch.

Mijn speciale GPU is beperkt tot 2 GB geheugen, het gebruik van bs=8in het volgende voorbeeld werkte in mijn situatie:

from fastai.vision.all import *
path = untar_data(URLs.PETS)/'images'
def is_cat(x): return x[0].isupper()
dls = ImageDataLoaders.from_name_func(
    path, get_image_files(path), valid_pct=0.2, seed=42,
    label_func=is_cat, item_tfms=Resize(244), num_workers=0, bs=)
learn = cnn_learner(dls, resnet34, metrics=error_rate)
learn.fine_tune(1)

Antwoord 9

Ik had hetzelfde probleem met mijn computer. Het enige dat u hoeft te doen, is uw cfg-bestand aanpassen aan uw computer. Het blijkt dat mijn computer een afbeeldingsgrootte heeft van minder dan 600 X 600 en toen ik hetzelfde aanpaste in het configuratiebestand, liep het programma soepel.Afbeelding die mijn cfg-bestand beschrijft


Antwoord 10

Probleem opgelost door de volgende code:

import os
os.environ['CUDA_VISIBLE_DEVICES']='2, 3'

Other episodes