Я запускаю следующий код для точной настройки модели BERT Base Cased в Google Colab. Иногда код работает нормально с первого раза без ошибок. В других случаях тот же код, использующий те же данные, приводит к ошибке «CUDA out of memory». Раньше перезапуск среды выполнения или выход из записной книжки, возвращение в записную книжку, перезапуск заводской среды выполнения и повторный запуск кода выполнялись успешно без ошибок. Только сейчас я попробовал перезапустить и повторить попытку 5 раз и каждый раз получал ошибку.
Проблема, похоже, не в комбинации данных и кода, которые я использую, потому что иногда она работает без ошибок. Похоже, это как-то связано со средой выполнения Google Colab.
Кто-нибудь знает, почему это происходит, почему это периодически и / или что я могу с этим поделать?
I Я использую библиотеку Huggingface transformers
и PyTorch
.
Ячейка кода, которая приводит к ошибке:
# train the model
%%time
history = defaultdict(list)
for epoch in range(EPOCHS):
print(f'Epoch {epoch + 1}/{EPOCHS}')
print('-' * 10)
train_acc, train_loss = train_epoch(
model,
train_data_loader,
loss_fn,
optimizer,
device,
scheduler,
train_set_length
)
print(f'Train loss {train_loss} accuracy {train_acc}')
dev_acc, dev_loss = eval_model(
model,
dev_data_loader,
loss_fn,
device,
evaluation_set_length
)
print(f'Dev loss {dev_loss} accuracy {dev_acc}')
history['train_acc'].append(train_acc)
history['train_loss'].append(train_loss)
history['dev_acc'].append(dev_acc)
history['dev_loss'].append(dev_loss)
model_filename = f'model_{epoch}_state.bin'
torch.save(model.state_dict(), model_filename)
Полная ошибка:
RuntimeError Traceback (most recent call last)
<ipython-input-29-a13774d7aa75> in <module>()
----> 1 get_ipython().run_cell_magic('time', '', "\nhistory = defaultdict(list)\n\nfor epoch in range(EPOCHS):\n\n print(f'Epoch {epoch + 1}/{EPOCHS}')\n print('-' * 10)\n\n train_acc, train_loss = train_epoch(\n model,\n train_data_loader, \n loss_fn, \n optimizer, \n device, \n scheduler, \n train_set_length\n )\n\n print(f'Train loss {train_loss} accuracy {train_acc}')\n\n dev_acc, dev_loss = eval_model(\n model,\n dev_data_loader,\n loss_fn, \n device, \n evaluation_set_length\n )\n\n print(f'Dev loss {dev_loss} accuracy {dev_acc}')\n\n history['train_acc'].append(train_acc)\n history['train_loss'].append(train_loss)\n history['dev_acc'].append(dev_acc)\n history['dev_loss'].append(dev_loss)\n \n model_filename = f'model_{epoch}_state.bin'\n torch.save(model.state_dict(), model_filename)")
15 frames
<decorator-gen-60> in time(self, line, cell, local_ns)
<timed exec> in <module>()
/usr/local/lib/python3.6/dist-packages/transformers/modeling_bert.py in forward(self, hidden_states, attention_mask, head_mask, encoder_hidden_states, encoder_attention_mask)
234 # Take the dot product between "query" and "key" to get the raw attention scores.
235 attention_scores = torch.matmul(query_layer, key_layer.transpose(-1, -2))
--> 236 attention_scores = attention_scores / math.sqrt(self.attention_head_size)
237 if attention_mask is not None:
238 # Apply the attention mask is (precomputed for all layers in BertModel forward() function)
RuntimeError: CUDA out of memory. Tried to allocate 24.00 MiB (GPU 0; 7.43 GiB total capacity; 5.42 GiB already allocated; 8.94 MiB free; 5.79 GiB reserved in total by PyTorch)