web-dev-qa-db-fra.com

Comment libérer toute la mémoire Pytorch est prise à partir de la mémoire GPU

J'ai une sorte de code de haut niveau, donc la formation des modèles, etc., est enveloppée par pipeline_network classe. Mon objectif principal est de former un nouveau modèle à chaque nouveau pli.

for train_idx, valid_idx in cv.split(meta_train[DEPTH_COLUMN].values.reshape(-1)):

        meta_train_split, meta_valid_split = meta_train.iloc[train_idx], meta_train.iloc[valid_idx]

        pipeline_network = unet(config=CONFIG, suffix = 'fold' + str(fold), train_mode=True)

Mais ensuite je passe au 2e pli tout échoue dans la mémoire du GPU:

RuntimeError: cuda runtime error (2) : out of memory at /pytorch/torch/lib/THC/generic/THCStorage.cu:58

À la fin d'Epoch, j'ai essayé de supprimer manuellement ce pipeline sans succès:

 def clean_object_from_memory(obj): #definition
    del obj
    gc.collect()
    torch.cuda.empty_cache()

clean_object_from_memory( clean_object_from_memory) # calling

Appeler cela n'a pas aidé non plus:

def dump_tensors(gpu_only=True):
        torch.cuda.empty_cache()
        total_size = 0
        for obj in gc.get_objects():
            try:
                if torch.is_tensor(obj):
                    if not gpu_only or obj.is_cuda:
                        del obj
                        gc.collect()
                Elif hasattr(obj, "data") and torch.is_tensor(obj.data):
                    if not gpu_only or obj.is_cuda:
                        del obj
                        gc.collect()
            except Exception as e:
                pass

Comment réinitialiser pytorch puis-je passer au pli suivant?

10
Rocketq

Essayez de supprimer l'objet avec del puis appliquez torch.cuda.empty_cache(). La mémoire réutilisable sera libérée après cette opération.

5
HzCheng