code: def test_retain_grad_hidden_states_attentions(self):
      # no need to test all models as different heads yield the same functionality
      model_class = PerceiverForMaskedLM
      (
          config,
          inputs_dict,
      ) = self.model_tester.prepare_config_and_inputs_for_model_class(
          model_class
      )
      config.output_hidden_states = True
      config.output_attentions = True
  
      model = model_class(config)
      model.to(torch_device)
  
      inputs = self._prepare_for_class(inputs_dict, model_class)
  
      outputs = model(**inputs)
  
      output = outputs[0]
  
      # Encoder-only model
      hidden_states = outputs.hidden_states[0]
      attentions = outputs.attentions[0]
  
      hidden_states.retain_grad()
      attentions.retain_grad()
  
      output.flatten()[0].backward(retain_graph=True)
  
      self.assertIsNotNone(hidden_states.grad)
      self.assertIsNotNone(attentions.grad)
  
imports: import copy
  import inspect
  import math
  import tempfile
  import unittest
  import warnings
  from typing import Dict, List, Tuple
  import numpy
  from datasets import load_dataset
  from transformers import PerceiverConfig
  from transformers.models.auto import get_values
  from transformers.testing_utils import require_torch, require_torch_multi_gpu, require_vision, slow, torch_device
  from transformers.utils import is_torch_available, is_vision_available
  from ...test_configuration_common import ConfigTester
  from ...test_modeling_common import ModelTesterMixin, floats_tensor, ids_tensor, random_attention_mask
label_desc: Use image node_id 16 for calling the PerceiverModelTest obj's underlying member method code with example usage: obj.test_retain_grad_hidden_states_attentions() without return types