OutOfMemoryError: CUDA out of memory

Hi :slight_smile:
I am writing to seek assistance regarding an error I encountered while running a custum BERT-based classifier.

I am currently working with a relatively small dataset, and I have set the batch sizes as follows:

  • train_batch_size: 4
  • val_batch_size: 4

The validation set consists of fewer than 200 examples, while the training set has approximately 600 examples.

I would greatly appreciate your help in resolving this issue.

Here is the code snippet that Iโ€™m working with:

class BERTClassifier(BertPreTrainedModel):
    def __init__(self, config):
        super().__init__(config)
        self.num_labels = config.num_labels
        self.config = config

        self.bert = BertModel(config)
        self.dropout = torch.nn.Dropout(0.3)
        self.linear = torch.nn.Linear(768, self.num_labels)
        self.post_init()

    def forward(self, input_ids, attention_mask=None,  
                token_type_ids=None, labels=None,
                features=None, output_attentions=False):
        outputs = self.bert(
          input_ids,
          attention_mask=attention_mask,
          token_type_ids=token_type_ids,
          output_attentions=True
        )
        if features is not None:
          dropout_output = torch.cat((dropout_output, features), dim=1)
        logits = self.linear(dropout_output)
        loss = None
        if labels is not None:
            loss_fct = BCEWithLogitsLoss()
            loss = loss_fct(logits, labels)
        return SequenceClassifierOutput(loss=loss, logits=logits, hidden_states=outputs.hidden_states,attentions=outputs.attentions)

model = BERTClassifier.from_pretrained('bert-base-uncased')
model.to(device)

I encountered the following error message:

โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Traceback (most recent call last) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ /tmp/ipykernel_29/4032920361.py:1 in <module>                                                    โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ [Errno 2] No such file or directory: '/tmp/ipykernel_29/4032920361.py'                           โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /opt/conda/lib/python3.10/site-packages/transformers/trainer.py:1645 in train                    โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   1642 โ”‚   โ”‚   inner_training_loop = find_executable_batch_size(                                 โ”‚
โ”‚   1643 โ”‚   โ”‚   โ”‚   self._inner_training_loop, self._train_batch_size, args.auto_find_batch_size  โ”‚
โ”‚   1644 โ”‚   โ”‚   )                                                                                 โ”‚
โ”‚ โฑ 1645 โ”‚   โ”‚   return inner_training_loop(                                                       โ”‚
โ”‚   1646 โ”‚   โ”‚   โ”‚   args=args,                                                                    โ”‚
โ”‚   1647 โ”‚   โ”‚   โ”‚   resume_from_checkpoint=resume_from_checkpoint,                                โ”‚
โ”‚   1648 โ”‚   โ”‚   โ”‚   trial=trial,                                                                  โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /opt/conda/lib/python3.10/site-packages/transformers/trainer.py:2035 in _inner_training_loop     โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   2032 โ”‚   โ”‚   โ”‚   โ”‚   self.control.should_training_stop = True                                  โ”‚
โ”‚   2033 โ”‚   โ”‚   โ”‚                                                                                 โ”‚
โ”‚   2034 โ”‚   โ”‚   โ”‚   self.control = self.callback_handler.on_epoch_end(args, self.state, self.con  โ”‚
โ”‚ โฑ 2035 โ”‚   โ”‚   โ”‚   self._maybe_log_save_evaluate(tr_loss, model, trial, epoch, ignore_keys_for_  โ”‚
โ”‚   2036 โ”‚   โ”‚   โ”‚                                                                                 โ”‚
โ”‚   2037 โ”‚   โ”‚   โ”‚   if DebugOption.TPU_METRICS_DEBUG in self.args.debug:                          โ”‚
โ”‚   2038 โ”‚   โ”‚   โ”‚   โ”‚   if is_torch_tpu_available():                                              โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /opt/conda/lib/python3.10/site-packages/transformers/trainer.py:2321 in _maybe_log_save_evaluate โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   2318 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   )                                                                     โ”‚
โ”‚   2319 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   metrics.update(dataset_metrics)                                       โ”‚
โ”‚   2320 โ”‚   โ”‚   โ”‚   else:                                                                         โ”‚
โ”‚ โฑ 2321 โ”‚   โ”‚   โ”‚   โ”‚   metrics = self.evaluate(ignore_keys=ignore_keys_for_eval)                 โ”‚
โ”‚   2322 โ”‚   โ”‚   โ”‚   self._report_to_hp_search(trial, self.state.global_step, metrics)             โ”‚
โ”‚   2323 โ”‚   โ”‚   โ”‚                                                                                 โ”‚
โ”‚   2324 โ”‚   โ”‚   โ”‚   # Run delayed LR scheduler now that metrics are populated                     โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /opt/conda/lib/python3.10/site-packages/transformers/trainer.py:3053 in evaluate                 โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   3050 โ”‚   โ”‚   start_time = time.time()                                                          โ”‚
โ”‚   3051 โ”‚   โ”‚                                                                                     โ”‚
โ”‚   3052 โ”‚   โ”‚   eval_loop = self.prediction_loop if self.args.use_legacy_prediction_loop else se  โ”‚
โ”‚ โฑ 3053 โ”‚   โ”‚   output = eval_loop(                                                               โ”‚
โ”‚   3054 โ”‚   โ”‚   โ”‚   eval_dataloader,                                                              โ”‚
โ”‚   3055 โ”‚   โ”‚   โ”‚   description="Evaluation",                                                     โ”‚
โ”‚   3056 โ”‚   โ”‚   โ”‚   # No point gathering the predictions if there are no metrics, otherwise we d  โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /opt/conda/lib/python3.10/site-packages/transformers/trainer.py:3270 in evaluation_loop          โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   3267 โ”‚   โ”‚   โ”‚   โ”‚   if self.preprocess_logits_for_metrics is not None:                        โ”‚
โ”‚   3268 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   logits = self.preprocess_logits_for_metrics(logits, labels)           โ”‚
โ”‚   3269 โ”‚   โ”‚   โ”‚   โ”‚   logits = self._nested_gather(logits)                                      โ”‚
โ”‚ โฑ 3270 โ”‚   โ”‚   โ”‚   โ”‚   preds_host = logits if preds_host is None else nested_concat(preds_host,  โ”‚
โ”‚   3271 โ”‚   โ”‚   โ”‚   if labels is not None:                                                        โ”‚
โ”‚   3272 โ”‚   โ”‚   โ”‚   โ”‚   labels = self._nested_gather(labels)                                      โ”‚
โ”‚   3273 โ”‚   โ”‚   โ”‚   โ”‚   labels_host = labels if labels_host is None else nested_concat(labels_ho  โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /opt/conda/lib/python3.10/site-packages/transformers/trainer_pt_utils.py:114 in nested_concat    โ”‚
โ”‚                                                                                                  โ”‚
โ”‚    111 โ”‚   โ”‚   new_tensors                                                                       โ”‚
โ”‚    112 โ”‚   ), f"Expected `tensors` and `new_tensors` to have the same type but found {type(tens  โ”‚
โ”‚    113 โ”‚   if isinstance(tensors, (list, tuple)):                                                โ”‚
โ”‚ โฑ  114 โ”‚   โ”‚   return type(tensors)(nested_concat(t, n, padding_index=padding_index) for t, n i  โ”‚
โ”‚    115 โ”‚   elif isinstance(tensors, torch.Tensor):                                               โ”‚
โ”‚    116 โ”‚   โ”‚   return torch_pad_and_concatenate(tensors, new_tensors, padding_index=padding_ind  โ”‚
โ”‚    117 โ”‚   elif isinstance(tensors, Mapping):                                                    โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /opt/conda/lib/python3.10/site-packages/transformers/trainer_pt_utils.py:114 in <genexpr>        โ”‚
โ”‚                                                                                                  โ”‚
โ”‚    111 โ”‚   โ”‚   new_tensors                                                                       โ”‚
โ”‚    112 โ”‚   ), f"Expected `tensors` and `new_tensors` to have the same type but found {type(tens  โ”‚
โ”‚    113 โ”‚   if isinstance(tensors, (list, tuple)):                                                โ”‚
โ”‚ โฑ  114 โ”‚   โ”‚   return type(tensors)(nested_concat(t, n, padding_index=padding_index) for t, n i  โ”‚
โ”‚    115 โ”‚   elif isinstance(tensors, torch.Tensor):                                               โ”‚
โ”‚    116 โ”‚   โ”‚   return torch_pad_and_concatenate(tensors, new_tensors, padding_index=padding_ind  โ”‚
โ”‚    117 โ”‚   elif isinstance(tensors, Mapping):                                                    โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /opt/conda/lib/python3.10/site-packages/transformers/trainer_pt_utils.py:114 in nested_concat    โ”‚
โ”‚                                                                                                  โ”‚
โ”‚    111 โ”‚   โ”‚   new_tensors                                                                       โ”‚
โ”‚    112 โ”‚   ), f"Expected `tensors` and `new_tensors` to have the same type but found {type(tens  โ”‚
โ”‚    113 โ”‚   if isinstance(tensors, (list, tuple)):                                                โ”‚
โ”‚ โฑ  114 โ”‚   โ”‚   return type(tensors)(nested_concat(t, n, padding_index=padding_index) for t, n i  โ”‚
โ”‚    115 โ”‚   elif isinstance(tensors, torch.Tensor):                                               โ”‚
โ”‚    116 โ”‚   โ”‚   return torch_pad_and_concatenate(tensors, new_tensors, padding_index=padding_ind  โ”‚
โ”‚    117 โ”‚   elif isinstance(tensors, Mapping):                                                    โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /opt/conda/lib/python3.10/site-packages/transformers/trainer_pt_utils.py:114 in <genexpr>        โ”‚
โ”‚                                                                                                  โ”‚
โ”‚    111 โ”‚   โ”‚   new_tensors                                                                       โ”‚
โ”‚    112 โ”‚   ), f"Expected `tensors` and `new_tensors` to have the same type but found {type(tens  โ”‚
โ”‚    113 โ”‚   if isinstance(tensors, (list, tuple)):                                                โ”‚
โ”‚ โฑ  114 โ”‚   โ”‚   return type(tensors)(nested_concat(t, n, padding_index=padding_index) for t, n i  โ”‚
โ”‚    115 โ”‚   elif isinstance(tensors, torch.Tensor):                                               โ”‚
โ”‚    116 โ”‚   โ”‚   return torch_pad_and_concatenate(tensors, new_tensors, padding_index=padding_ind  โ”‚
โ”‚    117 โ”‚   elif isinstance(tensors, Mapping):                                                    โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /opt/conda/lib/python3.10/site-packages/transformers/trainer_pt_utils.py:116 in nested_concat    โ”‚
โ”‚                                                                                                  โ”‚
โ”‚    113 โ”‚   if isinstance(tensors, (list, tuple)):                                                โ”‚
โ”‚    114 โ”‚   โ”‚   return type(tensors)(nested_concat(t, n, padding_index=padding_index) for t, n i  โ”‚
โ”‚    115 โ”‚   elif isinstance(tensors, torch.Tensor):                                               โ”‚
โ”‚ โฑ  116 โ”‚   โ”‚   return torch_pad_and_concatenate(tensors, new_tensors, padding_index=padding_ind  โ”‚
โ”‚    117 โ”‚   elif isinstance(tensors, Mapping):                                                    โ”‚
โ”‚    118 โ”‚   โ”‚   return type(tensors)(                                                             โ”‚
โ”‚    119 โ”‚   โ”‚   โ”‚   {k: nested_concat(t, new_tensors[k], padding_index=padding_index) for k, t i  โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /opt/conda/lib/python3.10/site-packages/transformers/trainer_pt_utils.py:75 in                   โ”‚
โ”‚ torch_pad_and_concatenate                                                                        โ”‚
โ”‚                                                                                                  โ”‚
โ”‚     72 โ”‚   tensor2 = atleast_1d(tensor2)                                                         โ”‚
โ”‚     73 โ”‚                                                                                         โ”‚
โ”‚     74 โ”‚   if len(tensor1.shape) == 1 or tensor1.shape[1] == tensor2.shape[1]:                   โ”‚
โ”‚ โฑ   75 โ”‚   โ”‚   return torch.cat((tensor1, tensor2), dim=0)                                       โ”‚
โ”‚     76 โ”‚                                                                                         โ”‚
โ”‚     77 โ”‚   # Let's figure out the new shape                                                      โ”‚
โ”‚     78 โ”‚   new_shape = (tensor1.shape[0] + tensor2.shape[0], max(tensor1.shape[1], tensor2.shap  โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
OutOfMemoryError: CUDA out of memory. Tried to allocate 288.00 MiB (GPU 0; 15.90 GiB total capacity; 14.14 GiB 
already allocated; 201.75 MiB free; 14.82 GiB reserved in total by PyTorch) If reserved memory is >> allocated 
memory try setting max_split_size_mb to avoid fragmentation.  See documentation for Memory Management and 
PYTORCH_CUDA_ALLOC_CONF

Thank you