code: def test_model_adapter_summary(self):
      # count model parameters before
      model = self.get_model()
      model_no_params = sum(p.numel() for p in model.parameters())
      for k, v in ADAPTER_CONFIG_MAP.items():
          # HACK: reduce the reduction factor such that
          # the small test model can have a phm_dim of 4
          if hasattr(v, "phm_layer") and v.phm_layer:
              v = v.__class__(reduction_factor=4)
          model.add_adapter(k, config=v)
      summary = model.adapter_summary(as_dict=True)
      self.assertEqual(len(ADAPTER_CONFIG_MAP) + 1, len(summary))
      for name in ADAPTER_CONFIG_MAP.keys():
          self.assertTrue(any([row["name"] == name for row in summary]))
      self.assertEqual(model_no_params, summary[-1]["#param"])
  
imports: import copy
  import tempfile
  import torch
  import adapters
  from adapters import ADAPTER_CONFIG_MAP, ADAPTER_MODEL_MAPPING, AutoAdapterModel, BatchSplit, DoubleSeqBnConfig, DoubleSeqBnInvConfig, Fuse, InvertibleAdaptersMixin, InvertibleAdaptersWrapperMixin, MAMConfig, SeqBnConfig, SeqBnInvConfig
  from adapters.heads.language_modeling import CausalLMHead
  from transformers import MODEL_FOR_SEQ_TO_SEQ_CAUSAL_LM_MAPPING, CLIPConfig
  from transformers.testing_utils import require_torch, torch_device
  from .base import AdapterMethodBaseTestMixin, create_twin_models
label_desc: Use image node_id 16 for calling the BottleneckAdapterTestMixin obj's underlying member method code with example usage: obj.test_model_adapter_summary() without return types