RuntimeError: CUDA не хватает памяти.Проблема при повторной загрузке модели в цикле - PullRequest
0 голосов
/ 22 апреля 2019

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

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

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

Обратите внимание, что я никогда не передаю модель или данные в cuda.Фактически, я хотел отладить код с помощью cpu перед отправкой кода для выполнения графическим процессором.

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

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

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, но я получаю точно такую ​​же ошибку.

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

1 Ответ

0 голосов
/ 23 апреля 2019

Похоже, acc_dim накапливает историю града - см. https://pytorch.org/docs/stable/notes/faq.html

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...