code: def test_batch_split_with_heads(self):
      model = AutoAdapterModel.from_config(self.config())
      model.add_adapter("a")
      model.add_adapter("b")
      self.add_head(model, "a", num_labels=2)
      self.add_head(model, "b", num_labels=3)
      model.eval()
      model.to(torch_device)
  
      inputs = self.get_input_samples(config=model.config)
      if isinstance(model, T5AdapterModel):
          inputs["decoder_input_ids"] = inputs["input_ids"]
  
      # for reference, pass through single adapters
      model.active_adapters = "a"
      model.active_head = "a"
      outputs_a = model(**{k: v[:1] for k, v in inputs.items()})
      model.active_adapters = "b"
      model.active_head = "b"
      outputs_b = model(**{k: v[1:] for k, v in inputs.items()})
  
      model.set_active_adapters(
          BatchSplit("a", "b", batch_sizes=[1, 2])
      )
      output = model(**inputs)
  
      self.assertEqual(2, len(output))
      self.assertTrue(
          torch.allclose(
              output[0]["logits"],
              outputs_a["logits"],
              atol=1e-05,
          )
      )
      self.assertTrue(
          torch.allclose(
              output[1]["logits"],
              outputs_b["logits"],
              atol=1e-05,
          )
      )
  
imports: import copy
  import random
  import torch
  from adapters import ADAPTER_MODEL_MAPPING, AutoAdapterModel, PrefixTuningConfig, SeqBnConfig, T5AdapterModel
  from adapters.composition import BatchSplit, Parallel
  from adapters.models.bert_generation.adapter_model import BertGenerationAdapterModel
  from transformers import MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING, Trainer, TrainingArguments
  from transformers.testing_utils import require_torch, torch_device
label_desc: Use image node_id 3 for calling the ParallelAdapterInferenceTestMixin obj's underlying member method code with example usage: obj.test_batch_split_with_heads() without return types