Ошибка RuntimeError: CUDA не хватает памяти. Проблема при повторной загрузке модели в цикле

#python #runtime-error #pytorch

#python #время выполнения-ошибка #pytorch

Вопрос:

Я сталкиваюсь с классическим: CUDA не хватает памяти.

Что я хочу сделать: я хочу загружать одну и ту же модель, используя каждый раз другую матрицу вложений. Я должен сделать это 300 раз, по одному для каждого измерения вложений word.

Я не обучаю модель, вот почему я использую model.eval() , я думал, этого будет достаточно, чтобы Pytorch не создавал график.

Пожалуйста, обратите внимание, что я никогда не передаю ни модель, ни данные в cuda. На самом деле, я хотел отладить код с использованием cpu перед отправкой кода для выполнения графическим процессором.

Приведенный ниже цикл выполняется один раз, RuntimeError возникает на второй итерации.

Я предполагаю, что код загружает новую модель в память графического процессора на каждой итерации (о чем я не знал, что это возможно без явного указания на это). emb_matrix довольно тяжелый и может привести к сбою памяти графического процессора.

 emb_dim = 300
acc_dim = torch.zeros((emb_dim, 4))
for d in range(emb_dim):

    #create embeddings with one dimension shuffled
    emb_matrix = text_f.vocab.vectors.clone()

    #get a random permutation across one of the dimensions
    rand_index = torch.randperm(text_f.vocab.vectors.shape[0])
    emb_matrix[:, d] =  text_f.vocab.vectors[rand_index, d]

    #load model with the scrumbled embeddings
    model = load_classifier(emb_matrix, 
                            encoder_type = encoder_type)
    model.eval()
    for batch in batch_iters["test"]:
        x_pre = batch.premise
        x_hyp = batch.hypothesis
        y = batch.label

        #perform forward pass
        y_pred = model.forward(x_pre, x_hyp)        

        #calculate accuracies
        acc_dim[d]  = accuracy(y_pred, y)/test_batches

        #avoid memory issues
        y_pred.detach()

    print(f"Dimension {d} accuracies: {acc_dim[d]}")   
  

Я получаю следующую ошибку:
RuntimeError: CUDA out of memory. Tried to allocate 146.88 MiB (GPU 0; 2.00 GiB total capacity; 374.63 MiB already allocated; 0 bytes free; 1015.00 KiB cached)

Я попытался передать модель и данные в CPU, но получаю точно такую же ошибку.

Я искал, как исправить проблему, но не смог найти очевидного решения. Приветствуются любые предложения о том, как загрузить модель и данные в нужное место или как очистить память графического процессора после каждой итерации.

Комментарии:

1. torch.cuda.empty_cache()

2. Чтобы заставить ее полностью работать на процессоре для отладки, перед запуском вашей программы запустите команду export CUDA_VISIBLE_DEVICES=-1 Это гарантирует, что вы не сможете использовать графический процессор и, следовательно, не исчерпаете память графического процессора.

3. @Chris toch.cuda.empty_cache() не освобождает память графического процессора, верно? Он просто отправляет ее в ОС, но не выгружает модель из графического процессора. pytorch.org/docs/stable/cuda.html#torch.cuda.empty_cache

Ответ №1:

Похоже, что acc_dim накапливается история изменений — см. https://pytorch.org/docs/stable/notes/faq.html

Поскольку вы делаете только вывод, with torch.no_grad(): следует использовать. Это позволит полностью обойти возможную проблему с накоплением истории изменений.

model.eval() не предотвращает ведение бухгалтерии grad, оно просто переключает поведение некоторых слоев, таких как выпадение. Для вывода следует использовать оба model.eval() и with torch.no_grad(): вместе.