





'''simple docstring'''

import unittest

from transformers import MobileBertConfig, is_torch_available
from transformers.models.auto import get_values
from transformers.testing_utils import require_sentencepiece, require_tokenizers, require_torch, slow, torch_device

from ...test_configuration_common import ConfigTester
from ...test_modeling_common import ModelTesterMixin, ids_tensor, random_attention_mask
from ...test_pipeline_mixin import PipelineTesterMixin


if is_torch_available():
      import torch

      from transformers import (
          MODEL_FOR_PRETRAINING_MAPPING,
          MobileBertForMaskedLM,
          MobileBertForMultipleChoice,
          MobileBertForNextSentencePrediction,
          MobileBertForPreTraining,
          MobileBertForQuestionAnswering,
          MobileBertForSequenceClassification,
          MobileBertForTokenClassification,
          MobileBertModel,
      )


class    a_	:

    '''simple docstring'''


    def __init__(						self					,						A					,						A=13					,						A=7					,						A=True					,						A=True					,						A=True					,						A=True					,						A=99					,						A=64					,						A=32					,						A=5					,						A=4					,						A=37					,						A="gelu"					,						A=0.1					,						A=0.1					,						A=512					,						A=16					,						A=2					,						A=0.02					,						A=3					,						A=4					,						A=None					,						)						->  Tuple:
        _SCREAMING_SNAKE_CASE   							=     parent
        _SCREAMING_SNAKE_CASE   							=     batch_size
        _SCREAMING_SNAKE_CASE   							=     seq_length
        _SCREAMING_SNAKE_CASE   							=     is_training
        _SCREAMING_SNAKE_CASE   							=     use_input_mask
        _SCREAMING_SNAKE_CASE   							=     use_token_type_ids
        _SCREAMING_SNAKE_CASE   							=     use_labels
        _SCREAMING_SNAKE_CASE   							=     vocab_size
        _SCREAMING_SNAKE_CASE   							=     hidden_size
        _SCREAMING_SNAKE_CASE   							=     embedding_size
        _SCREAMING_SNAKE_CASE   							=     num_hidden_layers
        _SCREAMING_SNAKE_CASE   							=     num_attention_heads
        _SCREAMING_SNAKE_CASE   							=     intermediate_size
        _SCREAMING_SNAKE_CASE   							=     hidden_act
        _SCREAMING_SNAKE_CASE   							=     hidden_dropout_prob
        _SCREAMING_SNAKE_CASE   							=     attention_probs_dropout_prob
        _SCREAMING_SNAKE_CASE   							=     max_position_embeddings
        _SCREAMING_SNAKE_CASE   							=     type_vocab_size
        _SCREAMING_SNAKE_CASE   							=     type_sequence_label_size
        _SCREAMING_SNAKE_CASE   							=     initializer_range
        _SCREAMING_SNAKE_CASE   							=     num_labels
        _SCREAMING_SNAKE_CASE   							=     num_choices
        _SCREAMING_SNAKE_CASE   							=     scope


    def      snake_case_(						self			)						->  Any:
        _SCREAMING_SNAKE_CASE   							=     ids_tensor([self.batch_size, self.seq_length]					,						self.vocab_size			)

        _SCREAMING_SNAKE_CASE   							=     None
        if self.use_input_mask:
            _SCREAMING_SNAKE_CASE   							=     random_attention_mask([self.batch_size, self.seq_length]			)

        _SCREAMING_SNAKE_CASE   							=     None
        if self.use_token_type_ids:
            _SCREAMING_SNAKE_CASE   							=     ids_tensor([self.batch_size, self.seq_length]					,						self.type_vocab_size			)

        _SCREAMING_SNAKE_CASE   							=     None
        _SCREAMING_SNAKE_CASE   							=     None
        _SCREAMING_SNAKE_CASE   							=     None
        if self.use_labels:
            _SCREAMING_SNAKE_CASE   							=     ids_tensor([self.batch_size]					,						self.type_sequence_label_size			)
            _SCREAMING_SNAKE_CASE   							=     ids_tensor([self.batch_size, self.seq_length]					,						self.num_labels			)
            _SCREAMING_SNAKE_CASE   							=     ids_tensor([self.batch_size]					,						self.num_choices			)

        _SCREAMING_SNAKE_CASE   							=     self.get_config()

        return config, input_ids, token_type_ids, input_mask, sequence_labels, token_labels, choice_labels


    def      snake_case_(						self			)						->  int:
        return MobileBertConfig(
            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					,						embedding_size=self.embedding_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=a__					,						initializer_range=self.initializer_range					,						)


    def      snake_case_(						self					,						A					,						A					,						A					,						A					,						A					,						A					,						A			)						->  int:
        _SCREAMING_SNAKE_CASE   							=     MobileBertModel(config=a__			)
        model.to(a__			)
        model.eval()
        _SCREAMING_SNAKE_CASE   							=     model(a__					,						attention_mask=a__					,						token_type_ids=a__			)
        _SCREAMING_SNAKE_CASE   							=     model(a__					,						token_type_ids=a__			)
        _SCREAMING_SNAKE_CASE   							=     model(a__			)

        self.parent.assertEqual(result.last_hidden_state.shape					,						(self.batch_size, self.seq_length, self.hidden_size)			)
        self.parent.assertEqual(result.pooler_output.shape					,						(self.batch_size, self.hidden_size)			)


    def      snake_case_(						self					,						A					,						A					,						A					,						A					,						A					,						A					,						A			)						->  int:
        _SCREAMING_SNAKE_CASE   							=     MobileBertForMaskedLM(config=a__			)
        model.to(a__			)
        model.eval()
        _SCREAMING_SNAKE_CASE   							=     model(a__					,						attention_mask=a__					,						token_type_ids=a__					,						labels=a__			)
        self.parent.assertEqual(result.logits.shape					,						(self.batch_size, self.seq_length, self.vocab_size)			)


    def      snake_case_(						self					,						A					,						A					,						A					,						A					,						A					,						A					,						A			)						->  Dict:
        _SCREAMING_SNAKE_CASE   							=     MobileBertForNextSentencePrediction(config=a__			)
        model.to(a__			)
        model.eval()
        _SCREAMING_SNAKE_CASE   							=     model(
            a__					,						attention_mask=a__					,						token_type_ids=a__					,						labels=a__					,						)
        self.parent.assertEqual(result.logits.shape					,						(self.batch_size, 2)			)


    def      snake_case_(						self					,						A					,						A					,						A					,						A					,						A					,						A					,						A			)						->  str:
        _SCREAMING_SNAKE_CASE   							=     MobileBertForPreTraining(config=a__			)
        model.to(a__			)
        model.eval()
        _SCREAMING_SNAKE_CASE   							=     model(
            a__					,						attention_mask=a__					,						token_type_ids=a__					,						labels=a__					,						next_sentence_label=a__					,						)
        self.parent.assertEqual(result.prediction_logits.shape					,						(self.batch_size, self.seq_length, self.vocab_size)			)
        self.parent.assertEqual(result.seq_relationship_logits.shape					,						(self.batch_size, 2)			)


    def      snake_case_(						self					,						A					,						A					,						A					,						A					,						A					,						A					,						A			)						->  Any:
        _SCREAMING_SNAKE_CASE   							=     MobileBertForQuestionAnswering(config=a__			)
        model.to(a__			)
        model.eval()
        _SCREAMING_SNAKE_CASE   							=     model(
            a__					,						attention_mask=a__					,						token_type_ids=a__					,						start_positions=a__					,						end_positions=a__					,						)
        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      snake_case_(						self					,						A					,						A					,						A					,						A					,						A					,						A					,						A			)						->  Optional[int]:
        _SCREAMING_SNAKE_CASE   							=     self.num_labels
        _SCREAMING_SNAKE_CASE   							=     MobileBertForSequenceClassification(a__			)
        model.to(a__			)
        model.eval()
        _SCREAMING_SNAKE_CASE   							=     model(a__					,						attention_mask=a__					,						token_type_ids=a__					,						labels=a__			)
        self.parent.assertEqual(result.logits.shape					,						(self.batch_size, self.num_labels)			)


    def      snake_case_(						self					,						A					,						A					,						A					,						A					,						A					,						A					,						A			)						->  str:
        _SCREAMING_SNAKE_CASE   							=     self.num_labels
        _SCREAMING_SNAKE_CASE   							=     MobileBertForTokenClassification(config=a__			)
        model.to(a__			)
        model.eval()
        _SCREAMING_SNAKE_CASE   							=     model(a__					,						attention_mask=a__					,						token_type_ids=a__					,						labels=a__			)
        self.parent.assertEqual(result.logits.shape					,						(self.batch_size, self.seq_length, self.num_labels)			)


    def      snake_case_(						self					,						A					,						A					,						A					,						A					,						A					,						A					,						A			)						->  Union[str, Any]:
        _SCREAMING_SNAKE_CASE   							=     self.num_choices
        _SCREAMING_SNAKE_CASE   							=     MobileBertForMultipleChoice(config=a__			)
        model.to(a__			)
        model.eval()
        _SCREAMING_SNAKE_CASE   							=     input_ids.unsqueeze(1			).expand(-1					,						self.num_choices					,						-1			).contiguous()
        _SCREAMING_SNAKE_CASE   							=     token_type_ids.unsqueeze(1			).expand(-1					,						self.num_choices					,						-1			).contiguous()
        _SCREAMING_SNAKE_CASE   							=     input_mask.unsqueeze(1			).expand(-1					,						self.num_choices					,						-1			).contiguous()
        _SCREAMING_SNAKE_CASE   							=     model(
            a__					,						attention_mask=a__					,						token_type_ids=a__					,						labels=a__					,						)
        self.parent.assertEqual(result.logits.shape					,						(self.batch_size, self.num_choices)			)





    def      snake_case_(						self			)						->  Optional[int]:
        _SCREAMING_SNAKE_CASE   							=     self.prepare_config_and_inputs()
        (
            (
            _SCREAMING_SNAKE_CASE						
        )							,			(
            _SCREAMING_SNAKE_CASE						
        )							,			(
            _SCREAMING_SNAKE_CASE						
        )							,			(
            _SCREAMING_SNAKE_CASE						
        )							,			(
            _SCREAMING_SNAKE_CASE						
        )							,			(
            _SCREAMING_SNAKE_CASE						
        )							,			(
            _SCREAMING_SNAKE_CASE						
        )							,									
        )   							=     config_and_inputs
        _SCREAMING_SNAKE_CASE   							=     {"""input_ids""": input_ids, """token_type_ids""": token_type_ids, """attention_mask""": input_mask}
        return config, inputs_dict




@require_torch
class    a_	(							A__ ,       A__ ,       unittest.TestCase			):

    '''simple docstring'''
    UpperCamelCase					       =					(
        (
            MobileBertModel,
            MobileBertForMaskedLM,
            MobileBertForMultipleChoice,
            MobileBertForNextSentencePrediction,
            MobileBertForPreTraining,
            MobileBertForQuestionAnswering,
            MobileBertForSequenceClassification,
            MobileBertForTokenClassification,
        )
        if is_torch_available()
        else ()
    )
    UpperCamelCase					       =					(
        {
            '''feature-extraction''': MobileBertModel,
            '''fill-mask''': MobileBertForMaskedLM,
            '''question-answering''': MobileBertForQuestionAnswering,
            '''text-classification''': MobileBertForSequenceClassification,
            '''token-classification''': MobileBertForTokenClassification,
            '''zero-shot''': MobileBertForSequenceClassification,
        }
        if is_torch_available()
        else {}
    )
    UpperCamelCase					       =					True


    def      snake_case_(						self					,						A					,						A					,						A=False			)						->  List[str]:
        _SCREAMING_SNAKE_CASE   							=     super()._prepare_for_class(a__					,						a__					,						return_labels=a__			)

        if return_labels:
            if model_class in get_values(a__			):
                _SCREAMING_SNAKE_CASE   							=     torch.zeros(
                    (self.model_tester.batch_size, self.model_tester.seq_length)					,						dtype=torch.long					,						device=a__			)
                _SCREAMING_SNAKE_CASE   							=     torch.zeros(
                    self.model_tester.batch_size					,						dtype=torch.long					,						device=a__			)
        return inputs_dict


    def      snake_case_(						self			)						->  Tuple:
        _SCREAMING_SNAKE_CASE   							=     MobileBertModelTester(self			)
        _SCREAMING_SNAKE_CASE   							=     ConfigTester(self					,						config_class=a__					,						hidden_size=37			)


    def      snake_case_(						self			)						->  List[str]:
        self.config_tester.run_common_tests()


    def      snake_case_(						self			)						->  List[str]:
        _SCREAMING_SNAKE_CASE   							=     self.model_tester.prepare_config_and_inputs()
        self.model_tester.create_and_check_mobilebert_model(*a__			)


    def      snake_case_(						self			)						->  Union[str, Any]:
        _SCREAMING_SNAKE_CASE   							=     self.model_tester.prepare_config_and_inputs()
        self.model_tester.create_and_check_mobilebert_for_masked_lm(*a__			)


    def      snake_case_(						self			)						->  Tuple:
        _SCREAMING_SNAKE_CASE   							=     self.model_tester.prepare_config_and_inputs()
        self.model_tester.create_and_check_mobilebert_for_multiple_choice(*a__			)


    def      snake_case_(						self			)						->  List[Any]:
        _SCREAMING_SNAKE_CASE   							=     self.model_tester.prepare_config_and_inputs()
        self.model_tester.create_and_check_mobilebert_for_next_sequence_prediction(*a__			)


    def      snake_case_(						self			)						->  str:
        _SCREAMING_SNAKE_CASE   							=     self.model_tester.prepare_config_and_inputs()
        self.model_tester.create_and_check_mobilebert_for_pretraining(*a__			)


    def      snake_case_(						self			)						->  List[Any]:
        _SCREAMING_SNAKE_CASE   							=     self.model_tester.prepare_config_and_inputs()
        self.model_tester.create_and_check_mobilebert_for_question_answering(*a__			)


    def      snake_case_(						self			)						->  Dict:
        _SCREAMING_SNAKE_CASE   							=     self.model_tester.prepare_config_and_inputs()
        self.model_tester.create_and_check_mobilebert_for_sequence_classification(*a__			)





    def      snake_case_(						self			)						->  int:
        _SCREAMING_SNAKE_CASE   							=     self.model_tester.prepare_config_and_inputs()
        self.model_tester.create_and_check_mobilebert_for_token_classification(*a__			)





def lowerCamelCase		(	__lowerCamelCase					:       Optional[int]       )		->Any:
    return torch.tensor(
        UpperCamelCase_   ,			dtype=torch.long   ,			device=UpperCamelCase_   ,			)


lowercase_      							=					1e-3






@require_torch
@require_sentencepiece
@require_tokenizers
class    a_	(							unittest.TestCase			):

    '''simple docstring'''


    @slow
    def      snake_case_(						self			)						->  str:
        _SCREAMING_SNAKE_CASE   							=     MobileBertModel.from_pretrained("""google/mobilebert-uncased"""			).to(a__			)
        _SCREAMING_SNAKE_CASE   							=     _long_tensor([[101, 7110, 1005, 1056, 2023, 1_1333, 1_7413, 1029, 102]]			)
        with torch.no_grad():
            _SCREAMING_SNAKE_CASE   							=     model(a__			)[0]
        _SCREAMING_SNAKE_CASE   							=     torch.Size((1, 9, 512)			)
        self.assertEqual(output.shape					,						a__			)
        _SCREAMING_SNAKE_CASE   							=     torch.tensor(
            [
                [
                    [-2.4_73_65_26e07, 8.2_69_16_56e04, 1.6_52_18_38e05],
                    [-5.7_54_17_04e-01, 3.9_05_60_22e00, 4.4_01_15_07e00],
                    [2.6_04_73_59e00, 1.5_67_76_52e00, -1.7_32_41_88e-01],
                ]
            ]					,						device=a__					,						)

        # MobileBERT results range from 10e0 to 10e8. Even a 0.0000001% difference with a value of 10e8 results in a
        # ~1 difference, it's therefore not a good idea to measure using addition.
        # Here, we instead divide the expected result with the result in order to obtain ~1. We then check that the
        # result is held between bounds: 1 - TOLERANCE < expected_result / result < 1 + TOLERANCE
        _SCREAMING_SNAKE_CASE   							=     torch.all((expected_slice / output[..., :3, :3]) >= 1 - TOLERANCE			)
        _SCREAMING_SNAKE_CASE   							=     torch.all((expected_slice / output[..., :3, :3]) <= 1 + TOLERANCE			)

        self.assertTrue(lower_bound and upper_bound			)








import argparse

import requests
import torch

# pip3 install salesforce-lavis
# I'm actually installing a slightly modified version: pip3 install git+https://github.com/nielsrogge/LAVIS.git@fix_lavis
from lavis.models import load_model_and_preprocess
from PIL import Image

from transformers import (
    AutoTokenizer,
    BlipaConfig,
    BlipaForConditionalGeneration,
    BlipaProcessor,
    BlipaVisionConfig,
    BlipImageProcessor,
    OPTConfig,
    TaConfig,
)
from transformers.utils.constants import OPENAI_CLIP_MEAN, OPENAI_CLIP_STD



def 		lowerCAmelCase__     (       )->	List[str]:
    A__					=       '''https://storage.googleapis.com/sfr-vision-language-research/LAVIS/assets/merlion.png'''
    A__					=       Image.open(requests.get(UpperCamelCase_			,							stream=UpperCamelCase_						).raw						).convert('''RGB'''						)

    return image



def 		lowerCAmelCase__     (       UpperCamelCase_					:							Dict						)->	Any:
    A__					=       []
    # fmt: off

    # vision encoder
    rename_keys.append(('''visual_encoder.cls_token''', '''vision_model.embeddings.class_embedding''')						)
    rename_keys.append(('''visual_encoder.pos_embed''', '''vision_model.embeddings.position_embedding''')						)
    rename_keys.append(('''visual_encoder.patch_embed.proj.weight''', '''vision_model.embeddings.patch_embedding.weight''')						)
    rename_keys.append(('''visual_encoder.patch_embed.proj.bias''', '''vision_model.embeddings.patch_embedding.bias''')						)
    rename_keys.append(('''ln_vision.weight''', '''vision_model.post_layernorm.weight''')						)
    rename_keys.append(('''ln_vision.bias''', '''vision_model.post_layernorm.bias''')						)

    for i in range(config.vision_config.num_hidden_layers						):
        rename_keys.append((f"visual_encoder.blocks.{i}.norm1.weight", f"vision_model.encoder.layers.{i}.layer_norm1.weight")						)
        rename_keys.append((f"visual_encoder.blocks.{i}.norm1.bias", f"vision_model.encoder.layers.{i}.layer_norm1.bias")						)
        rename_keys.append((f"visual_encoder.blocks.{i}.norm2.weight", f"vision_model.encoder.layers.{i}.layer_norm2.weight")						)
        rename_keys.append((f"visual_encoder.blocks.{i}.norm2.bias", f"vision_model.encoder.layers.{i}.layer_norm2.bias")						)
        rename_keys.append((f"visual_encoder.blocks.{i}.attn.qkv.weight", f"vision_model.encoder.layers.{i}.self_attn.qkv.weight")						)
        rename_keys.append((f"visual_encoder.blocks.{i}.attn.proj.weight", f"vision_model.encoder.layers.{i}.self_attn.projection.weight",)						)
        rename_keys.append((f"visual_encoder.blocks.{i}.attn.proj.bias", f"vision_model.encoder.layers.{i}.self_attn.projection.bias")						)
        rename_keys.append((f"visual_encoder.blocks.{i}.mlp.fc1.weight", f"vision_model.encoder.layers.{i}.mlp.fc1.weight")						)
        rename_keys.append((f"visual_encoder.blocks.{i}.mlp.fc1.bias", f"vision_model.encoder.layers.{i}.mlp.fc1.bias")						)
        rename_keys.append((f"visual_encoder.blocks.{i}.mlp.fc2.weight", f"vision_model.encoder.layers.{i}.mlp.fc2.weight")						)
        rename_keys.append((f"visual_encoder.blocks.{i}.mlp.fc2.bias", f"vision_model.encoder.layers.{i}.mlp.fc2.bias")						)

    # QFormer
    rename_keys.append(('''Qformer.bert.embeddings.LayerNorm.weight''', '''qformer.layernorm.weight''')						)
    rename_keys.append(('''Qformer.bert.embeddings.LayerNorm.bias''', '''qformer.layernorm.bias''')						)

    # fmt: on
    return rename_keys



def 		lowerCAmelCase__     (       UpperCamelCase_					:							int			,							UpperCamelCase_					:							Optional[int]			,							UpperCamelCase_					:							int						)->	List[Any]:
    A__					=       dct.pop(UpperCamelCase_						)
    A__					=       val



def 		lowerCAmelCase__     (       UpperCamelCase_					:							Union[str, Any]			,							UpperCamelCase_					:							Optional[int]						)->	Optional[int]:
    for i in range(config.vision_config.num_hidden_layers						):
        # read in original q and v biases
        A__					=       state_dict.pop(f"visual_encoder.blocks.{i}.attn.q_bias"						)
        A__					=       state_dict.pop(f"visual_encoder.blocks.{i}.attn.v_bias"						)

        # next, set bias in the state dict
        A__					=       torch.cat((q_bias, torch.zeros_like(UpperCamelCase_			,							requires_grad=UpperCamelCase_						), v_bias)						)
        A__					=       qkv_bias



def 		lowerCAmelCase__     (       UpperCamelCase_					:							List[Any]			,							UpperCamelCase_					:							List[Any]						)->	int:
    A__					=       3_6_4 if '''coco''' in model_name else 2_2_4
    A__					=       BlipaVisionConfig(image_size=UpperCamelCase_						).to_dict()

    # make sure the models have proper bos_token_id and eos_token_id set (important for generation)
    # seems like flan-T5 models don't have bos_token_id properly set?
    if "opt-2.7b" in model_name:
        A__					=       OPTConfig.from_pretrained('''facebook/opt-2.7b'''			,							eos_token_id=UpperCamelCase_						).to_dict()
    elif "opt-6.7b" in model_name:
        A__					=       OPTConfig.from_pretrained('''facebook/opt-6.7b'''			,							eos_token_id=UpperCamelCase_						).to_dict()
    elif "t5-xl" in model_name:
        A__					=       TaConfig.from_pretrained('''google/flan-t5-xl'''			,							dense_act_fn='''gelu'''			,							bos_token_id=1						).to_dict()
    elif "t5-xxl" in model_name:
        A__					=       TaConfig.from_pretrained('''google/flan-t5-xxl'''			,							dense_act_fn='''gelu'''			,							bos_token_id=1						).to_dict()

    A__					=       BlipaConfig(vision_config=UpperCamelCase_			,							text_config=UpperCamelCase_						)

    return config, image_size



@torch.no_grad()
def 		lowerCAmelCase__     (       UpperCamelCase_					:							Tuple			,							UpperCamelCase_					:							Optional[Any]=None			,							UpperCamelCase_					:							Any=False						)->	Optional[Any]:
    A__					=       (
        AutoTokenizer.from_pretrained('''facebook/opt-2.7b'''						)
        if '''opt''' in model_name
        else AutoTokenizer.from_pretrained('''google/flan-t5-xl'''						)
    )
    A__					=       tokenizer('''\n'''			,							add_special_tokens=UpperCamelCase_						).input_ids[0]
    A__			,						A__					=       get_blipa_config(UpperCamelCase_			,							eos_token_id=UpperCamelCase_						)

    A__					=       BlipaForConditionalGeneration(UpperCamelCase_						).eval()

    A__					=       {
        '''blip2-opt-2.7b''': ('''blip2_opt''', '''pretrain_opt2.7b'''),
        '''blip2-opt-6.7b''': ('''blip2_opt''', '''pretrain_opt6.7b'''),
        '''blip2-opt-2.7b-coco''': ('''blip2_opt''', '''caption_coco_opt2.7b'''),
        '''blip2-opt-6.7b-coco''': ('''blip2_opt''', '''caption_coco_opt6.7b'''),
        '''blip2-flan-t5-xl''': ('''blip2_t5''', '''pretrain_flant5xl'''),
        '''blip2-flan-t5-xl-coco''': ('''blip2_t5''', '''caption_coco_flant5xl'''),
        '''blip2-flan-t5-xxl''': ('''blip2_t5''', '''pretrain_flant5xxl'''),
    }

    A__			,						A__					=       model_name_to_original[model_name]

    # load original model
    print('''Loading original model...'''						)
    A__					=       '''cuda''' if torch.cuda.is_available() else '''cpu'''
    A__			,						A__			,						A__					=       load_model_and_preprocess(
        name=UpperCamelCase_			,							model_type=UpperCamelCase_			,							is_eval=UpperCamelCase_			,							device=UpperCamelCase_						)
    original_model.eval()
    print('''Done!'''						)

    # update state dict keys
    A__					=       original_model.state_dict()
    A__					=       create_rename_keys(UpperCamelCase_						)
    for src, dest in rename_keys:
        rename_key(UpperCamelCase_			,							UpperCamelCase_			,							UpperCamelCase_						)

    # some keys can be renamed efficiently
    for key, val in state_dict.copy().items():
        A__					=       state_dict.pop(UpperCamelCase_						)
        if key.startswith('''Qformer.bert'''						):
            A__					=       key.replace('''Qformer.bert'''			,							'''qformer'''						)
        if "attention.self" in key:
            A__					=       key.replace('''self'''			,							'''attention'''						)
        if "opt_proj" in key:
            A__					=       key.replace('''opt_proj'''			,							'''language_projection'''						)
        if "t5_proj" in key:
            A__					=       key.replace('''t5_proj'''			,							'''language_projection'''						)
        if key.startswith('''opt'''						):
            A__					=       key.replace('''opt'''			,							'''language'''						)
        if key.startswith('''t5'''						):
            A__					=       key.replace('''t5'''			,							'''language'''						)
        A__					=       val

    # read in qv biases
    read_in_q_v_bias(UpperCamelCase_			,							UpperCamelCase_						)

    A__			,						A__					=       hf_model.load_state_dict(UpperCamelCase_			,							strict=UpperCamelCase_						)
    assert len(UpperCamelCase_						) == 0
    assert unexpected_keys == ["qformer.embeddings.position_ids"]

    A__					=       load_demo_image()
    A__					=       vis_processors['''eval'''](UpperCamelCase_						).unsqueeze(0						).to(UpperCamelCase_						)
    A__					=       tokenizer(['''\n''']			,							return_tensors='''pt'''						).input_ids.to(UpperCamelCase_						)

    # create processor
    A__					=       BlipImageProcessor(
        size={'''height''': image_size, '''width''': image_size}			,							image_mean=UpperCamelCase_			,							image_std=UpperCamelCase_						)
    A__					=       BlipaProcessor(image_processor=UpperCamelCase_			,							tokenizer=UpperCamelCase_						)
    A__					=       processor(images=UpperCamelCase_			,							return_tensors='''pt'''						).pixel_values.to(UpperCamelCase_						)

    # make sure processor creates exact same pixel values
    assert torch.allclose(UpperCamelCase_			,							UpperCamelCase_						)

    original_model.to(UpperCamelCase_						)
    hf_model.to(UpperCamelCase_						)
    with torch.no_grad():
        if "opt" in model_name:
            A__					=       original_model({'''image''': original_pixel_values, '''text_input''': ['''''']}						).logits
            A__					=       hf_model(UpperCamelCase_			,							UpperCamelCase_						).logits
        else:
            A__					=       original_model(
                {'''image''': original_pixel_values, '''text_input''': ['''\n'''], '''text_output''': ['''\n''']}						).logits
            A__					=       input_ids.masked_fill(input_ids == tokenizer.pad_token_id			,							-1_0_0						)
            A__					=       hf_model(UpperCamelCase_			,							UpperCamelCase_			,							labels=UpperCamelCase_						).logits

    assert original_logits.shape == logits.shape
    print('''First values of original logits:'''			,							original_logits[0, :3, :3]						)
    print('''First values of HF logits:'''			,							logits[0, :3, :3]						)

    # assert values
    if model_name == "blip2-flan-t5-xl":
        A__					=       torch.tensor(
            [[-41.5850, -4.4440, -8.9922], [-47.4322, -5.9143, -1.7340]]			,							device=UpperCamelCase_						)
        assert torch.allclose(logits[0, :3, :3]			,							UpperCamelCase_			,							atol=1E-4						)
    elif model_name == "blip2-flan-t5-xl-coco":
        A__					=       torch.tensor(
            [[-57.0109, -9.8967, -12.6280], [-68.6578, -12.7191, -10.5065]]			,							device=UpperCamelCase_						)
    else:
        # cast to same type
        A__					=       logits.dtype
        assert torch.allclose(original_logits.to(UpperCamelCase_						)			,							UpperCamelCase_			,							atol=1E-2						)
    print('''Looks ok!'''						)

    print('''Generating a caption...'''						)
    A__					=       ''''''
    A__					=       tokenizer(UpperCamelCase_			,							return_tensors='''pt'''						).input_ids.to(UpperCamelCase_						)

    A__					=       original_model.generate({'''image''': original_pixel_values}						)
    A__					=       hf_model.generate(
        UpperCamelCase_			,							UpperCamelCase_			,							do_sample=UpperCamelCase_			,							num_beams=5			,							max_length=3_0			,							min_length=1			,							top_p=0.9			,							repetition_penalty=1.0			,							length_penalty=1.0			,							temperature=1			,							)
    print('''Original generation:'''			,							UpperCamelCase_						)
    A__					=       input_ids.shape[1]
    A__					=       processor.batch_decode(outputs[:, prompt_length:]			,							skip_special_tokens=UpperCamelCase_						)
    A__					=       [text.strip() for text in output_text]
    print('''HF generation:'''			,							UpperCamelCase_						)

    if pytorch_dump_folder_path is not None:
        processor.save_pretrained(UpperCamelCase_						)
        hf_model.save_pretrained(UpperCamelCase_						)

    if push_to_hub:
        processor.push_to_hub(f"nielsr/{model_name}"						)
        hf_model.push_to_hub(f"nielsr/{model_name}"						)


if __name__ == "__main__":
   _lowercase    	=		argparse.ArgumentParser()
   _lowercase    	=		[
       "blip2-opt-2.7b",
       "blip2-opt-6.7b",
       "blip2-opt-2.7b-coco",
       "blip2-opt-6.7b-coco",
       "blip2-flan-t5-xl",
       "blip2-flan-t5-xl-coco",
       "blip2-flan-t5-xxl",
   ]
   parser.add_argument(
       "--model_name",
       default="blip2-opt-2.7b",
       choices=choices,
       type=str,
       help="Path to hf config.json of model to convert",
   )
   parser.add_argument("--pytorch_dump_folder_path", default=None, type=str, help="Path to the output PyTorch model.")
   parser.add_argument(
       "--push_to_hub",
       action="store_true",
       help="Whether to push the model and processor to the hub after converting",
   )

   _lowercase    	=		parser.parse_args()

   convert_blipa_checkpoint(args.model_name, args.pytorch_dump_folder_path, args.push_to_hub)
