code: # coding=utf-8
  # Copyright {{cookiecutter.authors}} and The HuggingFace Inc. team. All rights reserved.
  #
  # Licensed under the Apache License, Version 2.0 (the "License");
  # you may not use this file except in compliance with the License.
  # You may obtain a copy of the License at
  #
  #     http://www.apache.org/licenses/LICENSE-2.0
  #
  # Unless required by applicable law or agreed to in writing, software
  # distributed under the License is distributed on an "AS IS" BASIS,
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  # See the License for the specific language governing permissions and
  # limitations under the License.
  """ Testing suite for the PyTorch {{cookiecutter.modelname}} model. """
  
  
  {% if cookiecutter.is_encoder_decoder_model == "False" -%}
  import unittest
  
  from tests.test_modeling_common import floats_tensor
  from transformers import is_torch_available
  from transformers.testing_utils import require_torch, slow, torch_device
  from .test_configuration_common import ConfigTester
  
  from .test_modeling_common import ModelTesterMixin, ids_tensor, random_attention_mask
  
  
  if is_torch_available():
      import torch
  
      from transformers import (
          {{cookiecutter.camelcase_modelname}}Config,
          {{cookiecutter.camelcase_modelname}}ForMaskedLM,
          {{cookiecutter.camelcase_modelname}}ForCausalLM,
          {{cookiecutter.camelcase_modelname}}ForMultipleChoice,
          {{cookiecutter.camelcase_modelname}}ForQuestionAnswering,
          {{cookiecutter.camelcase_modelname}}ForSequenceClassification,
          {{cookiecutter.camelcase_modelname}}ForTokenClassification,
          {{cookiecutter.camelcase_modelname}}Model,
      )
      from transformers.models.{{cookiecutter.lowercase_modelname}}.modeling_{{cookiecutter.lowercase_modelname}} import {{cookiecutter.uppercase_modelname}}_PRETRAINED_MODEL_ARCHIVE_LIST
  
  
  class {{cookiecutter.camelcase_modelname}}ModelTester:
      def __init__(
              self,
              parent,
              batch_size=13,
              seq_length=7,
              is_training=True,
              use_input_mask=True,
              use_token_type_ids=True,
              use_labels=True,
              vocab_size=99,
              hidden_size=32,
              num_hidden_layers=5,
              num_attention_heads=4,
              intermediate_size=37,
              hidden_act="gelu",
              hidden_dropout_prob=0.1,
              attention_probs_dropout_prob=0.1,
              max_position_embeddings=512,
              type_vocab_size=16,
              type_sequence_label_size=2,
              initializer_range=0.02,
              num_labels=3,
              num_choices=4,
              scope=None,
      ):
          self.parent = parent
          self.batch_size = batch_size
          self.seq_length = seq_length
          self.is_training = is_training
          self.use_input_mask = use_input_mask
          self.use_token_type_ids = use_token_type_ids
          self.use_labels = use_labels
          self.vocab_size = vocab_size
          self.hidden_size = hidden_size
          self.num_hidden_layers = num_hidden_layers
          self.num_attention_heads = num_attention_heads
          self.intermediate_size = intermediate_size
          self.hidden_act = hidden_act
          self.hidden_dropout_prob = hidden_dropout_prob
          self.attention_probs_dropout_prob = attention_probs_dropout_prob
          self.max_position_embeddings = max_position_embeddings
          self.type_vocab_size = type_vocab_size
          self.type_sequence_label_size = type_sequence_label_size
          self.initializer_range = initializer_range
          self.num_labels = num_labels
          self.num_choices = num_choices
          self.scope = scope
  
      def prepare_config_and_inputs(self):
          input_ids = ids_tensor([self.batch_size, self.seq_length], self.vocab_size)
  
          input_mask = None
          if self.use_input_mask:
              input_mask = random_attention_mask([self.batch_size, self.seq_length])
  
          token_type_ids = None
          if self.use_token_type_ids:
              token_type_ids = ids_tensor([self.batch_size, self.seq_length], self.type_vocab_size)
  
          sequence_labels = None
          token_labels = None
          choice_labels = None
          if self.use_labels:
              sequence_labels = ids_tensor([self.batch_size], self.type_sequence_label_size)
              token_labels = ids_tensor([self.batch_size, self.seq_length], self.num_labels)
              choice_labels = ids_tensor([self.batch_size], self.num_choices)
  
          config = {{cookiecutter.camelcase_modelname}}Config(
              vocab_size=self.vocab_size,
              hidden_size=self.hidden_size,
              num_hidden_layers=self.num_hidden_layers,
              num_attention_heads=self.num_attention_heads,
              intermediate_size=self.intermediate_size,
              hidden_act=self.hidden_act,
              hidden_dropout_prob=self.hidden_dropout_prob,
              attention_probs_dropout_prob=self.attention_probs_dropout_prob,
              max_position_embeddings=self.max_position_embeddings,
              type_vocab_size=self.type_vocab_size,
              is_decoder=False,
              initializer_range=self.initializer_range,
          )
  
          return config, input_ids, token_type_ids, input_mask, sequence_labels, token_labels, choice_labels
  
      def prepare_config_and_inputs_for_decoder(self):
          (
              config,
              input_ids,
              token_type_ids,
              input_mask,
              sequence_labels,
              token_labels,
              choice_labels,
          ) = self.prepare_config_and_inputs()
  
          config.is_decoder = True
          encoder_hidden_states = floats_tensor([self.batch_size, self.seq_length, self.hidden_size])
          encoder_attention_mask = ids_tensor([self.batch_size, self.seq_length], vocab_size=2)
  
          return (
              config,
              input_ids,
              token_type_ids,
              input_mask,
              sequence_labels,
              token_labels,
              choice_labels,
              encoder_hidden_states,
              encoder_attention_mask,
          )
  
      def create_and_check_model(
              self, config, input_ids, token_type_ids, input_mask, sequence_labels, token_labels, choice_labels
      ):
          model = {{cookiecutter.camelcase_modelname}}Model(config=config)
          model.to(torch_device)
          model.eval()
          result = model(input_ids, attention_mask=input_mask, token_type_ids=token_type_ids)
          result = model(input_ids, token_type_ids=token_type_ids)
          result = model(input_ids)
          self.parent.assertEqual(result.last_hidden_state.shape, (self.batch_size, self.seq_length, self.hidden_size))
  
      def create_and_check_model_as_decoder(
              self,
              config,
              input_ids,
              token_type_ids,
              input_mask,
              sequence_labels,
              token_labels,
              choice_labels,
              encoder_hidden_states,
              encoder_attention_mask,
      ):
          config.add_cross_attention = True
          model = {{cookiecutter.camelcase_modelname}}Model(config)
          model.to(torch_device)
          model.eval()
          result = model(
              input_ids,
              attention_mask=input_mask,
              token_type_ids=token_type_ids,
              encoder_hidden_states=encoder_hidden_states,
              encoder_attention_mask=encoder_attention_mask,
          )
          result = model(
              input_ids,
              attention_mask=input_mask,
              token_type_ids=token_type_ids,
              encoder_hidden_states=encoder_hidden_states,
          )
          result = model(input_ids, attention_mask=input_mask, token_type_ids=token_type_ids)
          self.parent.assertEqual(result.last_hidden_state.shape, (self.batch_size, self.seq_length, self.hidden_size))
  
      def create_and_check_for_causal_lm(
              self,
              config,
              input_ids,
              token_type_ids,
              input_mask,
              sequence_labels,
              token_labels,
              choice_labels,
              encoder_hidden_states,
              encoder_attention_mask,
      ):
          model = {{cookiecutter.camelcase_modelname}}ForCausalLM(config=config)
          model.to(torch_device)
          model.eval()
          result = model(input_ids, attention_mask=input_mask, token_type_ids=token_type_ids, labels=token_labels)
          self.parent.assertEqual(result.logits.shape, (self.batch_size, self.seq_length, self.vocab_size))
  
      def create_and_check_for_masked_lm(
              self, config, input_ids, token_type_ids, input_mask, sequence_labels, token_labels, choice_labels
      ):
          model = {{cookiecutter.camelcase_modelname}}ForMaskedLM(config=config)
          model.to(torch_device)
          model.eval()
          result = model(input_ids, attention_mask=input_mask, token_type_ids=token_type_ids, labels=token_labels)
          self.parent.assertEqual(result.logits.shape, (self.batch_size, self.seq_length, self.vocab_size))
  
      def create_and_check_decoder_model_past_large_inputs(
          self,
          config,
          input_ids,
          token_type_ids,
          input_mask,
          sequence_labels,
          token_labels,
          choice_labels,
          encoder_hidden_states,
          encoder_attention_mask,
      ):
          config.is_decoder = True
          config.add_cross_attention = True
          model = {{cookiecutter.camelcase_modelname}}ForCausalLM(config=config)
          model.to(torch_device)
          model.eval()
  
          # first forward pass
          outputs = model(
              input_ids,
              attention_mask=input_mask,
              encoder_hidden_states=encoder_hidden_states,
              encoder_attention_mask=encoder_attention_mask,
              use_cache=True,
          )
          past_key_values = outputs.past_key_values
  
          # create hypothetical multiple next token and extent to next_input_ids
          next_tokens = ids_tensor((self.batch_size, 3), config.vocab_size)
          next_mask = ids_tensor((self.batch_size, 3), vocab_size=2)
  
          # append to next input_ids and
          next_input_ids = torch.cat([input_ids, next_tokens], dim=-1)
          next_attention_mask = torch.cat([input_mask, next_mask], dim=-1)
  
          output_from_no_past = model(
              next_input_ids,
              attention_mask=next_attention_mask,
              encoder_hidden_states=encoder_hidden_states,
              encoder_attention_mask=encoder_attention_mask,
              output_hidden_states=True,
          )["hidden_states"][0]
          output_from_past = model(
              next_tokens,
              attention_mask=next_attention_mask,
              encoder_hidden_states=encoder_hidden_states,
              encoder_attention_mask=encoder_attention_mask,
              past_key_values=past_key_values,
              output_hidden_states=True,
          )["hidden_states"][0]
  
          # select random slice
          random_slice_idx = ids_tensor((1,), output_from_past.shape[-1]).item()
          output_from_no_past_slice = output_from_no_past[:, -3:, random_slice_idx].detach()
          output_from_past_slice = output_from_past[:, :, random_slice_idx].detach()
  
          self.parent.assertTrue(output_from_past_slice.shape[1] == next_tokens.shape[1])
  
          # test that outputs are equal for slice
          self.parent.assertTrue(torch.allclose(output_from_past_slice, output_from_no_past_slice, atol=1e-3))
  
      def create_and_check_for_question_answering(
              self, config, input_ids, token_type_ids, input_mask, sequence_labels, token_labels, choice_labels
      ):
          model = {{cookiecutter.camelcase_modelname}}ForQuestionAnswering(config=config)
          model.to(torch_device)
          model.eval()
          result = model(
              input_ids,
              attention_mask=input_mask,
              token_type_ids=token_type_ids,
              start_positions=sequence_labels,
              end_positions=sequence_labels,
          )
          self.parent.assertEqual(result.start_logits.shape, (self.batch_size, self.seq_length))
          self.parent.assertEqual(result.end_logits.shape, (self.batch_size, self.seq_length))
  
      def create_and_check_for_sequence_classification(
              self, config, input_ids, token_type_ids, input_mask, sequence_labels, token_labels, choice_labels
      ):
          config.num_labels = self.num_labels
          model = {{cookiecutter.camelcase_modelname}}ForSequenceClassification(config)
          model.to(torch_device)
          model.eval()
          result = model(input_ids, attention_mask=input_mask, token_type_ids=token_type_ids, labels=sequence_labels)
          self.parent.assertEqual(result.logits.shape, (self.batch_size, self.num_labels))
  
      def create_and_check_for_token_classification(
              self, config, input_ids, token_type_ids, input_mask, sequence_labels, token_labels, choice_labels
      ):
          config.num_labels = self.num_labels
          model = {{cookiecutter.camelcase_modelname}}ForTokenClassification(config=config)
          model.to(torch_device)
          model.eval()
          result = model(input_ids, attention_mask=input_mask, token_type_ids=token_type_ids, labels=token_labels)
          self.parent.assertEqual(result.logits.shape, (self.batch_size, self.seq_length, self.num_labels))
  
      def create_and_check_for_multiple_choice(
              self, config, input_ids, token_type_ids, input_mask, sequence_labels, token_labels, choice_labels
      ):
          config.num_choices = self.num_choices
          model = {{cookiecutter.camelcase_modelname}}ForMultipleChoice(config=config)
          model.to(torch_device)
          model.eval()
          multiple_choice_inputs_ids = input_ids.unsqueeze(1).expand(-1, self.num_choices, -1).contiguous()
          multiple_choice_token_type_ids = token_type_ids.unsqueeze(1).expand(-1, self.num_choices, -1).contiguous()
          multiple_choice_input_mask = input_mask.unsqueeze(1).expand(-1, self.num_choices, -1).contiguous()
          result = model(
              multiple_choice_inputs_ids,
              attention_mask=multiple_choice_input_mask,
              token_type_ids=multiple_choice_token_type_ids,
              labels=choice_labels,
          )
          self.parent.assertEqual(result.logits.shape, (self.batch_size, self.num_choices))
  
      def prepare_config_and_inputs_for_common(self):
          config_and_inputs = self.prepare_config_and_inputs()
          (
              config,
              input_ids,
              token_type_ids,
              input_mask,
              sequence_labels,
              token_labels,
              choice_labels,
          ) = config_and_inputs
          inputs_dict = {"input_ids": input_ids, "token_type_ids": token_type_ids, "attention_mask": input_mask}
          return config, inputs_dict
  
  
  @require_torch
  class {{cookiecutter.camelcase_modelname}}ModelTest(ModelTesterMixin, unittest.TestCase):
  
      all_model_classes = (
          (
              {{cookiecutter.camelcase_modelname}}Model,
              {{cookiecutter.camelcase_modelname}}ForMaskedLM,
              {{cookiecutter.camelcase_modelname}}ForCausalLM,
              {{cookiecutter.camelcase_modelname}}ForMultipleChoice,
              {{cookiecutter.camelcase_modelname}}ForQuestionAnswering,
              {{cookiecutter.camelcase_modelname}}ForSequenceClassification,
              {{cookiecutter.camelcase_modelname}}ForTokenClassification,
          )
          if is_torch_available()
          else ()
      )
      all_generative_model_classes = ({{cookiecutter.camelcase_modelname}}ForCausalLM,) if is_torch_available() else ()
  
      def setUp(self):
          self.model_tester = {{cookiecutter.camelcase_modelname}}ModelTester(self)
          self.config_tester = ConfigTester(self, config_class={{cookiecutter.camelcase_modelname}}Config, hidden_size=37)
  
      def test_config(self):
          self.config_tester.run_common_tests()
  
      def test_model(self):
          config_and_inputs = self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_model(*config_and_inputs)
  
      def test_model_various_embeddings(self):
          config_and_inputs = self.model_tester.prepare_config_and_inputs()
          for type in ["absolute", "relative_key", "relative_key_query"]:
              config_and_inputs[0].position_embedding_type = type
              self.model_tester.create_and_check_model(*config_and_inputs)
  
      def test_for_masked_lm(self):
          config_and_inputs = self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_for_masked_lm(*config_and_inputs)
  
      def test_for_multiple_choice(self):
          config_and_inputs = self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_for_multiple_choice(*config_and_inputs)
  
      def test_decoder_model_past_with_large_inputs(self):
          config_and_inputs = self.model_tester.prepare_config_and_inputs_for_decoder()
          self.model_tester.create_and_check_decoder_model_past_large_inputs(*config_and_inputs)
  
      def test_for_question_answering(self):
          config_and_inputs = self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_for_question_answering(*config_and_inputs)
  
      def test_for_sequence_classification(self):
          config_and_inputs = self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_for_sequence_classification(*config_and_inputs)
  
      def test_for_token_classification(self):
          config_and_inputs = self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_for_token_classification(*config_and_inputs)
  
      def test_model_as_decoder(self):
          config_and_inputs = self.model_tester.prepare_config_and_inputs_for_decoder()
          self.model_tester.create_and_check_model_as_decoder(*config_and_inputs)
  
      def test_model_as_decoder_with_default_input_mask(self):
          # This regression test was failing with PyTorch < 1.3
          (
              config,
              input_ids,
              token_type_ids,
              input_mask,
              sequence_labels,
              token_labels,
              choice_labels,
              encoder_hidden_states,
              encoder_attention_mask,
          ) = self.model_tester.prepare_config_and_inputs_for_decoder()
  
          input_mask = None
  
          self.model_tester.create_and_check_model_as_decoder(
              config,
              input_ids,
              token_type_ids,
              input_mask,
              sequence_labels,
              token_labels,
              choice_labels,
              encoder_hidden_states,
              encoder_attention_mask,
          )
  
      @slow
      def test_model_from_pretrained(self):
          for model_name in {{cookiecutter.uppercase_modelname}}_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
              model = {{cookiecutter.camelcase_modelname}}Model.from_pretrained(model_name)
              self.assertIsNotNone(model)
  
  
  @require_torch
  class {{cookiecutter.camelcase_modelname}}ModelIntegrationTest(unittest.TestCase):
      @slow
      def test_inference_masked_lm(self):
          model = {{cookiecutter.camelcase_modelname}}ForMaskedLM.from_pretrained("{{cookiecutter.checkpoint_identifier}}")
          input_ids = torch.tensor([[0, 1, 2, 3, 4, 5]])
          output = model(input_ids)[0]
  
          # TODO Replace vocab size
          vocab_size = 32000
  
          expected_shape = torch.Size((1, 6, vocab_size))
          self.assertEqual(output.shape, expected_shape)
  
          # TODO Replace values below with what was printed above.
          expected_slice = torch.tensor(
              [[[-0.0483, 0.1188, -0.0313], [-0.0606, 0.1435, 0.0199], [-0.0235, 0.1519, 0.0175]]]
          )
  
          self.assertTrue(torch.allclose(output[:, :3, :3], expected_slice, atol=1e-4))
  
  
  {% else -%}
  import copy
  import tempfile
  import unittest
  
  import timeout_decorator  # noqa
  
  from transformers import is_torch_available
  from transformers.file_utils import cached_property
  from transformers.testing_utils import require_sentencepiece, require_tokenizers, require_torch, slow, torch_device
  
  from .test_configuration_common import ConfigTester
  from .test_generation_utils import GenerationTesterMixin
  from .test_modeling_common import ModelTesterMixin, ids_tensor
  
  
  if is_torch_available():
      import torch
  
      from transformers import (
          {{cookiecutter.camelcase_modelname}}Config,
          {{cookiecutter.camelcase_modelname}}ForConditionalGeneration,
          {{cookiecutter.camelcase_modelname}}ForQuestionAnswering,
          {{cookiecutter.camelcase_modelname}}ForSequenceClassification,
          {{cookiecutter.camelcase_modelname}}Model,
          {{cookiecutter.camelcase_modelname}}Tokenizer,
      )
      from transformers.models.{{cookiecutter.lowercase_modelname}}.modeling_{{cookiecutter.lowercase_modelname}} import (
          {{cookiecutter.camelcase_modelname}}Decoder,
          {{cookiecutter.camelcase_modelname}}Encoder,
      )
  
  
  def prepare_{{cookiecutter.lowercase_modelname}}_inputs_dict(
      config,
      input_ids,
      decoder_input_ids,
      attention_mask=None,
      decoder_attention_mask=None,
  ):
      if attention_mask is None:
          attention_mask = input_ids.ne(config.pad_token_id)
      if decoder_attention_mask is None:
          decoder_attention_mask = decoder_input_ids.ne(config.pad_token_id)
      return {
          "input_ids": input_ids,
          "decoder_input_ids": decoder_input_ids,
          "attention_mask": attention_mask,
          "decoder_attention_mask": attention_mask,
      }
  
  
  @require_torch
  class {{cookiecutter.camelcase_modelname}}ModelTester:
      def __init__(
          self,
          parent,
          batch_size=13,
          seq_length=7,
          is_training=True,
          use_labels=False,
          vocab_size=99,
          hidden_size=16,
          num_hidden_layers=2,
          num_attention_heads=4,
          intermediate_size=4,
          hidden_act="gelu",
          hidden_dropout_prob=0.1,
          attention_probs_dropout_prob=0.1,
          max_position_embeddings=20,
          eos_token_id=2,
          pad_token_id=1,
          bos_token_id=0,
      ):
          self.parent = parent
          self.batch_size = batch_size
          self.seq_length = seq_length
          self.is_training = is_training
          self.use_labels = use_labels
          self.vocab_size = vocab_size
          self.hidden_size = hidden_size
          self.num_hidden_layers = num_hidden_layers
          self.num_attention_heads = num_attention_heads
          self.intermediate_size = intermediate_size
          self.hidden_act = hidden_act
          self.hidden_dropout_prob = hidden_dropout_prob
          self.attention_probs_dropout_prob = attention_probs_dropout_prob
          self.max_position_embeddings = max_position_embeddings
          self.eos_token_id = eos_token_id
          self.pad_token_id = pad_token_id
          self.bos_token_id = bos_token_id
  
      def prepare_config_and_inputs(self):
          input_ids = ids_tensor([self.batch_size, self.seq_length], self.vocab_size)
          input_ids = ids_tensor([self.batch_size, self.seq_length], self.vocab_size).clamp(
              3,
          )
          input_ids[:, -1] = self.eos_token_id  # Eos Token
  
          decoder_input_ids = ids_tensor([self.batch_size, self.seq_length], self.vocab_size)
  
          config = {{cookiecutter.camelcase_modelname}}Config(
              vocab_size=self.vocab_size,
              d_model=self.hidden_size,
              encoder_layers=self.num_hidden_layers,
              decoder_layers=self.num_hidden_layers,
              encoder_attention_heads=self.num_attention_heads,
              decoder_attention_heads=self.num_attention_heads,
              encoder_ffn_dim=self.intermediate_size,
              decoder_ffn_dim=self.intermediate_size,
              dropout=self.hidden_dropout_prob,
              attention_dropout=self.attention_probs_dropout_prob,
              max_position_embeddings=self.max_position_embeddings,
              eos_token_id=self.eos_token_id,
              bos_token_id=self.bos_token_id,
              pad_token_id=self.pad_token_id,
          )
          inputs_dict = prepare_{{cookiecutter.lowercase_modelname}}_inputs_dict(config, input_ids, decoder_input_ids)
          return config, inputs_dict
  
      def prepare_config_and_inputs_for_common(self):
          config, inputs_dict = self.prepare_config_and_inputs()
          return config, inputs_dict
  
      def create_and_check_decoder_model_past_large_inputs(self, config, inputs_dict):
          model = {{cookiecutter.camelcase_modelname}}Model(config=config).get_decoder().to(torch_device).eval()
          input_ids = inputs_dict["input_ids"]
          attention_mask = inputs_dict["attention_mask"]
  
          # first forward pass
          outputs = model(input_ids, attention_mask=attention_mask, use_cache=True)
  
          output, past_key_values = outputs.to_tuple()
  
          # create hypothetical multiple next token and extent to next_input_ids
          next_tokens = ids_tensor((self.batch_size, 3), config.vocab_size)
          next_attn_mask = ids_tensor((self.batch_size, 3), 2)
  
          # append to next input_ids and
          next_input_ids = torch.cat([input_ids, next_tokens], dim=-1)
          next_attention_mask = torch.cat([attention_mask, next_attn_mask], dim=-1)
  
          output_from_no_past = model(next_input_ids, attention_mask=next_attention_mask)["last_hidden_state"]
          output_from_past = model(next_tokens, attention_mask=next_attention_mask, past_key_values=past_key_values)["last_hidden_state"]
  
          # select random slice
          random_slice_idx = ids_tensor((1,), output_from_past.shape[-1]).item()
          output_from_no_past_slice = output_from_no_past[:, -3:, random_slice_idx].detach()
          output_from_past_slice = output_from_past[:, :, random_slice_idx].detach()
  
          self.parent.assertTrue(output_from_past_slice.shape[1] == next_tokens.shape[1])
  
          # test that outputs are equal for slice
          self.parent.assertTrue(torch.allclose(output_from_past_slice, output_from_no_past_slice, atol=1e-2))
  
      def check_encoder_decoder_model_standalone(self, config, inputs_dict):
          model = {{cookiecutter.camelcase_modelname}}Model(config=config).to(torch_device).eval()
          outputs = model(**inputs_dict)
  
          encoder_last_hidden_state = outputs.encoder_last_hidden_state
          last_hidden_state = outputs.last_hidden_state
  
          with tempfile.TemporaryDirectory() as tmpdirname:
              encoder = model.get_encoder()
              encoder.save_pretrained(tmpdirname)
              encoder = {{cookiecutter.camelcase_modelname}}Encoder.from_pretrained(tmpdirname).to(torch_device)
  
          encoder_last_hidden_state_2 = encoder(inputs_dict["input_ids"], attention_mask=inputs_dict["attention_mask"])[
              0
          ]
  
          self.parent.assertTrue((encoder_last_hidden_state_2 - encoder_last_hidden_state).abs().max().item() < 1e-3)
  
          with tempfile.TemporaryDirectory() as tmpdirname:
              decoder = model.get_decoder()
              decoder.save_pretrained(tmpdirname)
              decoder = {{cookiecutter.camelcase_modelname}}Decoder.from_pretrained(tmpdirname).to(torch_device)
  
          last_hidden_state_2 = decoder(
              input_ids=inputs_dict["decoder_input_ids"],
              attention_mask=inputs_dict["decoder_attention_mask"],
              encoder_hidden_states=encoder_last_hidden_state,
              encoder_attention_mask=inputs_dict["attention_mask"],
          )[0]
  
          self.parent.assertTrue((last_hidden_state_2 - last_hidden_state).abs().max().item() < 1e-3)
  
  
  @require_torch
  class {{cookiecutter.camelcase_modelname}}ModelTest(ModelTesterMixin, GenerationTesterMixin, unittest.TestCase):
      all_model_classes = (
          ({{cookiecutter.camelcase_modelname}}Model, {{cookiecutter.camelcase_modelname}}ForConditionalGeneration, {{cookiecutter.camelcase_modelname}}ForSequenceClassification, {{cookiecutter.camelcase_modelname}}ForQuestionAnswering)
          if is_torch_available()
          else ()
      )
      all_generative_model_classes = ({{cookiecutter.camelcase_modelname}}ForConditionalGeneration,) if is_torch_available() else ()
      is_encoder_decoder = True
      test_pruning = False
      test_head_masking = False
      test_missing_keys = False
  
      def setUp(self):
          self.model_tester = {{cookiecutter.camelcase_modelname}}ModelTester(self)
          self.config_tester = ConfigTester(self, config_class={{cookiecutter.camelcase_modelname}}Config)
  
      def test_config(self):
          self.config_tester.run_common_tests()
  
      def test_initialization_more(self):
          config, inputs_dict = self.model_tester.prepare_config_and_inputs()
          model = {{cookiecutter.camelcase_modelname}}Model(config)
          model.to(torch_device)
          model.eval()
          # test init
          self.assertTrue((model.encoder.embed_tokens.weight == model.shared.weight).all().item())
  
          def _check_var(module):
              """Check that we initialized various parameters from N(0, config.init_std)."""
              self.assertAlmostEqual(torch.std(module.weight).item(), config.init_std, 2)
  
          _check_var(model.encoder.embed_tokens)
          _check_var(model.encoder.layers[0].self_attn.k_proj)
          _check_var(model.encoder.layers[0].fc1)
          _check_var(model.encoder.embed_positions)
  
      def test_save_load_strict(self):
          config, inputs_dict = self.model_tester.prepare_config_and_inputs()
          for model_class in self.all_model_classes:
              model = model_class(config)
  
              with tempfile.TemporaryDirectory() as tmpdirname:
                  model.save_pretrained(tmpdirname)
                  model2, info = model_class.from_pretrained(tmpdirname, output_loading_info=True)
              self.assertEqual(info["missing_keys"], [])
  
      def test_decoder_model_past_with_large_inputs(self):
          config_and_inputs = self.model_tester.prepare_config_and_inputs()
          self.model_tester.create_and_check_decoder_model_past_large_inputs(*config_and_inputs)
  
      def test_encoder_decoder_model_standalone(self):
          config_and_inputs = self.model_tester.prepare_config_and_inputs_for_common()
          self.model_tester.check_encoder_decoder_model_standalone(*config_and_inputs)
  
      # {{cookiecutter.camelcase_modelname}}ForSequenceClassification does not support inputs_embeds
      def test_inputs_embeds(self):
          config, inputs_dict = self.model_tester.prepare_config_and_inputs_for_common()
  
          for model_class in ({{cookiecutter.camelcase_modelname}}Model, {{cookiecutter.camelcase_modelname}}ForConditionalGeneration, {{cookiecutter.camelcase_modelname}}ForQuestionAnswering):
              model = model_class(config)
              model.to(torch_device)
              model.eval()
  
              inputs = copy.deepcopy(self._prepare_for_class(inputs_dict, model_class))
  
              if not self.is_encoder_decoder:
                  input_ids = inputs["input_ids"]
                  del inputs["input_ids"]
              else:
                  encoder_input_ids = inputs["input_ids"]
                  decoder_input_ids = inputs.get("decoder_input_ids", encoder_input_ids)
                  del inputs["input_ids"]
                  inputs.pop("decoder_input_ids", None)
  
              wte = model.get_input_embeddings()
              if not self.is_encoder_decoder:
                  inputs["inputs_embeds"] = wte(input_ids)
              else:
                  inputs["inputs_embeds"] = wte(encoder_input_ids)
                  inputs["decoder_inputs_embeds"] = wte(decoder_input_ids)
  
              with torch.no_grad():
                  model(**inputs)[0]
  
      def test_generate_fp16(self):
          config, input_dict = self.model_tester.prepare_config_and_inputs()
          input_ids = input_dict["input_ids"]
          attention_mask = input_ids.ne(1).to(torch_device)
          model = {{cookiecutter.camelcase_modelname}}ForConditionalGeneration(config).eval().to(torch_device)
          if torch_device == "cuda":
              model.half()
          model.generate(input_ids, attention_mask=attention_mask)
          model.generate(num_beams=4, do_sample=True, early_stopping=False, num_return_sequences=3)
  
  
  def assert_tensors_close(a, b, atol=1e-12, prefix=""):
      """If tensors have different shapes, different values or a and b are not both tensors, raise a nice Assertion error."""
      if a is None and b is None:
          return True
      try:
          if torch.allclose(a, b, atol=atol):
              return True
          raise
      except Exception:
          pct_different = (torch.gt((a - b).abs(), atol)).float().mean().item()
          if a.numel() > 100:
              msg = f"tensor values are {pct_different:.1%} percent different."
          else:
              msg = f"{a} != {b}"
          if prefix:
              msg = prefix + ": " + msg
          raise AssertionError(msg)
  
  
  def _long_tensor(tok_lst):
      return torch.tensor(tok_lst, dtype=torch.long, device=torch_device)
  
  
  TOLERANCE = 1e-4
  
  
  @require_torch
  @require_sentencepiece
  @require_tokenizers
  @slow
  class {{cookiecutter.camelcase_modelname}}ModelIntegrationTests(unittest.TestCase):
      @cached_property
      def default_tokenizer(self):
          return {{cookiecutter.camelcase_modelname}}Tokenizer.from_pretrained('{{cookiecutter.checkpoint_identifier}}')
  
      def test_inference_no_head(self):
          model = {{cookiecutter.camelcase_modelname}}Model.from_pretrained('{{cookiecutter.checkpoint_identifier}}').to(torch_device)
          input_ids = _long_tensor([[0, 31414, 232, 328, 740, 1140, 12695, 69, 46078, 1588, 2]])
          decoder_input_ids = _long_tensor([[2, 0, 31414, 232, 328, 740, 1140, 12695, 69, 46078, 1588]])
          inputs_dict = prepare_{{cookiecutter.lowercase_modelname}}_inputs_dict(model.config, input_ids, decoder_input_ids)
          with torch.no_grad():
              output = model(**inputs_dict)[0]
          expected_shape = torch.Size((1, 11, 1024))
          self.assertEqual(output.shape, expected_shape)
          # change to expected output here
          expected_slice = torch.tensor(
              [[0.7144, 0.8143, -1.2813], [0.7144, 0.8143, -1.2813], [-0.0467, 2.5911, -2.1845]], device=torch_device
          )
          self.assertTrue(torch.allclose(output[:, :3, :3], expected_slice, atol=TOLERANCE))
  
      def test_inference_head(self):
          model = {{cookiecutter.camelcase_modelname}}ForConditionalGeneration.from_pretrained('{{cookiecutter.checkpoint_identifier}}').to(torch_device)
  
          # change to intended input
          input_ids = _long_tensor([[0, 31414, 232, 328, 740, 1140, 12695, 69, 46078, 1588, 2]])
          decoder_input_ids = _long_tensor([[0, 31414, 232, 328, 740, 1140, 12695, 69, 46078, 1588, 2]])
          inputs_dict = prepare_{{cookiecutter.lowercase_modelname}}_inputs_dict(model.config, input_ids, decoder_input_ids)
          with torch.no_grad():
              output = model(**inputs_dict)[0]
          expected_shape = torch.Size((1, 11, model.config.vocab_size))
          self.assertEqual(output.shape, expected_shape)
          # change to expected output here
          expected_slice = torch.tensor(
              [[0.7144, 0.8143, -1.2813], [0.7144, 0.8143, -1.2813], [-0.0467, 2.5911, -2.1845]], device=torch_device
          )
          self.assertTrue(torch.allclose(output[:, :3, :3], expected_slice, atol=TOLERANCE))
  
      def test_seq_to_seq_generation(self):
          hf = {{cookiecutter.camelcase_modelname}}ForConditionalGeneration.from_pretrained('{{cookiecutter.checkpoint_identifier}}').to(torch_device)
          tok = {{cookiecutter.camelcase_modelname}}Tokenizer.from_pretrained('{{cookiecutter.checkpoint_identifier}}')
  
          batch_input = [
              # string 1,
              # string 2,
              # string 3,
              # string 4,
          ]
  
          # The below article tests that we don't add any hypotheses outside of the top n_beams
          dct = tok.batch_encode_plus(
              batch_input,
              max_length=512,
              padding="max_length",
              truncation_strategy="only_first",
              truncation=True,
              return_tensors="pt",
          )
  
          hypotheses_batch = hf.generate(
              input_ids=dct["input_ids"].to(torch_device),
              attention_mask=dct["attention_mask"].to(torch_device),
              num_beams=2,
          )
  
          EXPECTED = [
              # here expected 1,
              # here expected 2,
              # here expected 3,
              # here expected 4,
          ]
  
          generated = tok.batch_decode(
              hypotheses_batch.tolist(), clean_up_tokenization_spaces=True, skip_special_tokens=True
          )
          assert generated == EXPECTED
  {% endif -%}
  