#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():
вместе.