


import itertools
import random
import unittest

import numpy as np

from transformers import is_speech_available
from transformers.testing_utils import require_torch, require_torchaudio

from ...test_sequence_feature_extraction_common import SequenceFeatureExtractionTestMixin


if is_speech_available():
    from transformers import SpeechaTextFeatureExtractor

lowerCAmelCase__      		= random.Random()
def 							_UpperCAmelCase				(UpperCamelCase__     :  Union[str, Any]				,							UpperCamelCase__     :  Optional[int]=1.0				,							UpperCamelCase__     :  Optional[Any]=None				,							UpperCamelCase__     :  Optional[Any]=None						):
       if rng is None:
              _A      :       Dict				    = global_rng

       _A      :       Tuple				    = []
       for batch_idx in range(shape[0]						):
              values.append([]						)
              for _ in range(shape[1]						):
                     values[-1].append(rng.random() * scale						)

       return values







@require_torch
@require_torchaudio
class      lowerCAmelCase__       (				unittest.TestCase):




     '''simple docstring'''


     def __init__(						self ,						__lowerCamelCase ,						__lowerCamelCase=7 ,						__lowerCamelCase=4_0_0 ,						__lowerCamelCase=2_0_0_0 ,						__lowerCamelCase=2_4 ,						__lowerCamelCase=2_4 ,						__lowerCamelCase=0.0 ,						__lowerCamelCase=1_6_0_0_0 ,						__lowerCamelCase=True ,						__lowerCamelCase=True ,						)			->				Tuple:
            _A      :       Tuple				    = parent
            _A      :       Any				    = batch_size
            _A      :       List[Any]				    = min_seq_length
            _A      :       List[Any]				    = max_seq_length
            _A      :       int				    = (self.max_seq_length - self.min_seq_length) // (self.batch_size - 1)
            _A      :       Optional[Any]				    = feature_size
            _A      :       List[Any]				    = num_mel_bins
            _A      :       Optional[int]				    = padding_value
            _A      :       List[Any]				    = sampling_rate
            _A      :       List[Any]				    = return_attention_mask
            _A      :       List[str]				    = do_normalize


     def  _lowerCamelCase (						self)			->				List[Any]:
            return {
                "feature_size": self.feature_size,
                "num_mel_bins": self.num_mel_bins,
                "padding_value": self.padding_value,
                "sampling_rate": self.sampling_rate,
                "return_attention_mask": self.return_attention_mask,
                "do_normalize": self.do_normalize,
            }


     def  _lowerCamelCase (						self ,						__lowerCamelCase=False ,						__lowerCamelCase=False)			->				Union[str, Any]:
            def _flatten(__lowerCamelCase):
                   return list(itertools.chain(*__lowerCamelCase))

            if equal_length:
                   _A      :       List[Any]				    = [floats_list((self.max_seq_length, self.feature_size)) for _ in range(self.batch_size)]
            else:
                   # make sure that inputs increase in size
                   _A      :       List[Any]				    = [
                       floats_list((x, self.feature_size))
                       for x in range(self.min_seq_length ,						self.max_seq_length ,						self.seq_length_diff)
                   ]
            if numpify:
                   _A      :       str				    = [np.asarray(__lowerCamelCase) for x in speech_inputs]
            return speech_inputs







@require_torch
@require_torchaudio
class      lowerCAmelCase__       (				a     ,    unittest.TestCase):




     '''simple docstring'''
     __SCREAMING_SNAKE_CASE  			= SpeechaTextFeatureExtractor if is_speech_available() else None


     def  _lowerCamelCase (						self)			->				Any:
            _A      :       Dict				    = SpeechaTextFeatureExtractionTester(self)


     def  _lowerCamelCase (						self ,						__lowerCamelCase)			->				Any:
            self.assertTrue(np.all(np.mean(__lowerCamelCase ,						axis=0) < 1e-3))
            self.assertTrue(np.all(np.abs(np.var(__lowerCamelCase ,						axis=0) - 1) < 1e-3))


     def  _lowerCamelCase (						self)			->				Dict:
            # Tests that all call wrap to encode_plus and batch_encode_plus
            _A      :       List[str]				    = self.feature_extraction_class(**self.feat_extract_tester.prepare_feat_extract_dict())
            # create three inputs of length 800, 1000, and 1200
            _A      :       List[str]				    = [floats_list((1, x))[0] for x in range(8_0_0 ,						1_4_0_0 ,						2_0_0)]
            _A      :       Any				    = [np.asarray(__lowerCamelCase) for speech_input in speech_inputs]

            # Test feature size
            _A      :       List[Any]				    = feature_extractor(__lowerCamelCase ,						padding=__lowerCamelCase ,						return_tensors="np").input_features
            self.assertTrue(input_features.ndim == 3)
            self.assertTrue(input_features.shape[-1] == feature_extractor.feature_size)

            # Test not batched input
            _A      :       Optional[int]				    = feature_extractor(speech_inputs[0] ,						return_tensors="np").input_features
            _A      :       List[Any]				    = feature_extractor(np_speech_inputs[0] ,						return_tensors="np").input_features
            self.assertTrue(np.allclose(__lowerCamelCase ,						__lowerCamelCase ,						atol=1e-3))

            # Test batched
            _A      :       Optional[int]				    = feature_extractor(__lowerCamelCase ,						return_tensors="np").input_features
            _A      :       Optional[int]				    = feature_extractor(__lowerCamelCase ,						return_tensors="np").input_features
            for enc_seq_a, enc_seq_a in zip(__lowerCamelCase ,						__lowerCamelCase):
                   self.assertTrue(np.allclose(__lowerCamelCase ,						__lowerCamelCase ,						atol=1e-3))

            # Test 2-D numpy arrays are batched.
            _A      :       int				    = [floats_list((1, x))[0] for x in (8_0_0, 8_0_0, 8_0_0)]
            _A      :       Optional[Any]				    = np.asarray(__lowerCamelCase)
            _A      :       Dict				    = feature_extractor(__lowerCamelCase ,						return_tensors="np").input_features
            _A      :       Union[str, Any]				    = feature_extractor(__lowerCamelCase ,						return_tensors="np").input_features
            for enc_seq_a, enc_seq_a in zip(__lowerCamelCase ,						__lowerCamelCase):
                   self.assertTrue(np.allclose(__lowerCamelCase ,						__lowerCamelCase ,						atol=1e-3))


     def  _lowerCamelCase (						self)			->				Dict:
            _A      :       Optional[int]				    = self.feature_extraction_class(**self.feat_extract_tester.prepare_feat_extract_dict())
            _A      :       int				    = [floats_list((1, x))[0] for x in range(8_0_0 ,						1_4_0_0 ,						2_0_0)]

            _A      :       int				    = ["longest", "max_length", "do_not_pad"]
            _A      :       int				    = [None, 1_6, None]
            for max_length, padding in zip(__lowerCamelCase ,						__lowerCamelCase):
                   _A      :       Optional[Any]				    = feature_extractor(
                       __lowerCamelCase ,						padding=__lowerCamelCase ,						max_length=__lowerCamelCase ,						return_attention_mask=__lowerCamelCase)
                   _A      :       Union[str, Any]				    = inputs.input_features
                   _A      :       int				    = inputs.attention_mask
                   _A      :       List[str]				    = [np.sum(__lowerCamelCase) for x in attention_mask]

                   self._check_zero_mean_unit_variance(input_features[0][: fbank_feat_lengths[0]])
                   self._check_zero_mean_unit_variance(input_features[1][: fbank_feat_lengths[1]])
                   self._check_zero_mean_unit_variance(input_features[2][: fbank_feat_lengths[2]])


     def  _lowerCamelCase (						self)			->				Optional[int]:
            _A      :       Tuple				    = self.feature_extraction_class(**self.feat_extract_tester.prepare_feat_extract_dict())
            _A      :       int				    = [floats_list((1, x))[0] for x in range(8_0_0 ,						1_4_0_0 ,						2_0_0)]

            _A      :       Any				    = ["longest", "max_length", "do_not_pad"]
            _A      :       str				    = [None, 1_6, None]
            for max_length, padding in zip(__lowerCamelCase ,						__lowerCamelCase):
                   _A      :       Any				    = feature_extractor(
                       __lowerCamelCase ,						max_length=__lowerCamelCase ,						padding=__lowerCamelCase ,						return_tensors="np" ,						return_attention_mask=__lowerCamelCase)
                   _A      :       Dict				    = inputs.input_features
                   _A      :       str				    = inputs.attention_mask
                   _A      :       int				    = [np.sum(__lowerCamelCase) for x in attention_mask]

                   self._check_zero_mean_unit_variance(input_features[0][: fbank_feat_lengths[0]])
                   self.assertTrue(input_features[0][fbank_feat_lengths[0] :].sum() < 1e-6)
                   self._check_zero_mean_unit_variance(input_features[1][: fbank_feat_lengths[1]])
                   self.assertTrue(input_features[0][fbank_feat_lengths[1] :].sum() < 1e-6)
                   self._check_zero_mean_unit_variance(input_features[2][: fbank_feat_lengths[2]])


     def  _lowerCamelCase (						self)			->				Dict:
            _A      :       Tuple				    = self.feature_extraction_class(**self.feat_extract_tester.prepare_feat_extract_dict())
            _A      :       Optional[int]				    = [floats_list((1, x))[0] for x in range(8_0_0 ,						1_4_0_0 ,						2_0_0)]
            _A      :       Tuple				    = feature_extractor(
                __lowerCamelCase ,						padding="max_length" ,						max_length=4 ,						truncation=__lowerCamelCase ,						return_tensors="np" ,						return_attention_mask=__lowerCamelCase ,						)
            _A      :       Tuple				    = inputs.input_features
            _A      :       Optional[int]				    = inputs.attention_mask
            _A      :       Optional[Any]				    = np.sum(attention_mask == 1 ,						axis=1)

            self._check_zero_mean_unit_variance(input_features[0, : fbank_feat_lengths[0]])
            self._check_zero_mean_unit_variance(input_features[1])
            self._check_zero_mean_unit_variance(input_features[2])


     def  _lowerCamelCase (						self)			->				Dict:
            _A      :       Tuple				    = self.feature_extraction_class(**self.feat_extract_tester.prepare_feat_extract_dict())
            _A      :       Union[str, Any]				    = [floats_list((1, x))[0] for x in range(8_0_0 ,						1_4_0_0 ,						2_0_0)]
            _A      :       Optional[int]				    = feature_extractor(
                __lowerCamelCase ,						padding="longest" ,						max_length=4 ,						truncation=__lowerCamelCase ,						return_tensors="np" ,						return_attention_mask=__lowerCamelCase ,						)
            _A      :       List[Any]				    = inputs.input_features
            _A      :       int				    = inputs.attention_mask
            _A      :       Tuple				    = np.sum(attention_mask == 1 ,						axis=1)

            self._check_zero_mean_unit_variance(input_features[0, : fbank_feat_lengths[0]])
            self._check_zero_mean_unit_variance(input_features[1, : fbank_feat_lengths[1]])
            self._check_zero_mean_unit_variance(input_features[2])

            # make sure that if max_length < longest -> then pad to max_length
            self.assertEqual(input_features.shape ,						(3, 4, 2_4))

            _A      :       List[str]				    = [floats_list((1, x))[0] for x in range(8_0_0 ,						1_4_0_0 ,						2_0_0)]
            _A      :       List[Any]				    = feature_extractor(
                __lowerCamelCase ,						padding="longest" ,						max_length=1_6 ,						truncation=__lowerCamelCase ,						return_tensors="np" ,						return_attention_mask=__lowerCamelCase ,						)
            _A      :       Optional[int]				    = inputs.input_features
            _A      :       Tuple				    = inputs.attention_mask
            _A      :       List[str]				    = np.sum(attention_mask == 1 ,						axis=1)

            self._check_zero_mean_unit_variance(input_features[0, : fbank_feat_lengths[0]])
            self._check_zero_mean_unit_variance(input_features[1, : fbank_feat_lengths[1]])
            self._check_zero_mean_unit_variance(input_features[2])

            # make sure that if max_length < longest -> then pad to max_length
            self.assertEqual(input_features.shape ,						(3, 6, 2_4))


     def  _lowerCamelCase (						self)			->				str:
            import torch

            _A      :       Tuple				    = self.feature_extraction_class(**self.feat_extract_tester.prepare_feat_extract_dict())
            _A      :       str				    = np.random.rand(1_0_0 ,						3_2).astype(np.floataa)
            _A      :       Tuple				    = np_speech_inputs.tolist()

            for inputs in [py_speech_inputs, np_speech_inputs]:
                   _A      :       Dict				    = feature_extractor.pad([{"input_features": inputs}] ,						return_tensors="np")
                   self.assertTrue(np_processed.input_features.dtype == np.floataa)
                   _A      :       Dict				    = feature_extractor.pad([{"input_features": inputs}] ,						return_tensors="pt")
                   self.assertTrue(pt_processed.input_features.dtype == torch.floataa)


     def  _lowerCamelCase (						self ,						__lowerCamelCase)			->				str:
            from datasets import load_dataset

            _A      :       Union[str, Any]				    = load_dataset("hf-internal-testing/librispeech_asr_dummy" ,						"clean" ,						split="validation")
            # automatic decoding with librispeech
            _A      :       Dict				    = ds.sort("id").select(range(__lowerCamelCase))[:num_samples]["audio"]

            return [x["array"] for x in speech_samples]


     def  _lowerCamelCase (						self)			->				Any:
            # fmt: off
            _A      :       Dict				    = np.array([
                -1.5_7_4_5, -1.7_7_1_3, -1.7_0_2_0, -1.6_0_6_9, -1.2_2_5_0, -1.1_1_0_5, -0.9_0_7_2, -0.8_2_4_1,
                -1.2_3_1_0, -0.8_0_9_8, -0.3_3_2_0, -0.4_1_0_1, -0.7_9_8_5, -0.4_9_9_6, -0.8_2_1_3, -0.9_1_2_8,
                -1.0_4_2_0, -1.1_2_8_6, -1.0_4_4_0, -0.7_9_9_9, -0.8_4_0_5, -1.2_2_7_5, -1.5_4_4_3, -1.4_6_2_5,
            ])
            # fmt: on

            _A      :       Union[str, Any]				    = self._load_datasamples(1)
            _A      :       Any				    = self.feature_extraction_class(**self.feat_extract_tester.prepare_feat_extract_dict())
            _A      :       Tuple				    = feature_extractor(__lowerCamelCase ,						return_tensors="pt").input_features
            self.assertEquals(input_features.shape ,						(1, 5_8_4, 2_4))
            self.assertTrue(np.allclose(input_features[0, 0, :3_0] ,						__lowerCamelCase ,						atol=1e-4))




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        _UpperCamelCase							(      ):
						__SCREAMING_SNAKE_CASE						:     Dict					=		'''https://storage.googleapis.com/sfr-vision-language-research/LAVIS/assets/merlion.png'''
						__SCREAMING_SNAKE_CASE						:     List[str]					=		Image.open(requests.get(lowercase__    ,       stream=lowercase__      ).raw      ).convert('''RGB'''      )

						return image


def        _UpperCamelCase							(      lowercase__      ):
						__SCREAMING_SNAKE_CASE						:     List[Any]					=		[]
						# 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        _UpperCamelCase							(      lowercase__    ,       lowercase__    ,       lowercase__      ):
						__SCREAMING_SNAKE_CASE						:     List[Any]					=		dct.pop(lowercase__      )
						__SCREAMING_SNAKE_CASE						:     List[Any]					=		val


def        _UpperCamelCase							(      lowercase__    ,       lowercase__      ):
						for i in range(config.vision_config.num_hidden_layers      ):
												# read in original q and v biases
												__SCREAMING_SNAKE_CASE						:     Optional[int]					=		state_dict.pop(F'''visual_encoder.blocks.{i}.attn.q_bias'''      )
												__SCREAMING_SNAKE_CASE						:     int					=		state_dict.pop(F'''visual_encoder.blocks.{i}.attn.v_bias'''      )

												# next, set bias in the state dict
												__SCREAMING_SNAKE_CASE						:     Optional[int]					=		torch.cat((q_bias, torch.zeros_like(lowercase__    ,       requires_grad=lowercase__      ), v_bias)      )
												__SCREAMING_SNAKE_CASE						:     Optional[Any]					=		qkv_bias


def        _UpperCamelCase							(      lowercase__    ,       lowercase__      ):
						__SCREAMING_SNAKE_CASE						:     Any					=		364 if '''coco''' in model_name else 224
						__SCREAMING_SNAKE_CASE						:     List[str]					=		BlipaVisionConfig(image_size=lowercase__      ).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:
												__SCREAMING_SNAKE_CASE						:     Union[str, Any]					=		OPTConfig.from_pretrained('''facebook/opt-2.7b'''    ,       eos_token_id=lowercase__      ).to_dict()
						elif "opt-6.7b" in model_name:
												__SCREAMING_SNAKE_CASE						:     List[Any]					=		OPTConfig.from_pretrained('''facebook/opt-6.7b'''    ,       eos_token_id=lowercase__      ).to_dict()
						elif "t5-xl" in model_name:
												__SCREAMING_SNAKE_CASE						:     Optional[Any]					=		TaConfig.from_pretrained('''google/flan-t5-xl'''    ,       dense_act_fn='''gelu'''    ,       bos_token_id=1      ).to_dict()
						elif "t5-xxl" in model_name:
												__SCREAMING_SNAKE_CASE						:     Union[str, Any]					=		TaConfig.from_pretrained('''google/flan-t5-xxl'''    ,       dense_act_fn='''gelu'''    ,       bos_token_id=1      ).to_dict()

						__SCREAMING_SNAKE_CASE						:     Optional[int]					=		BlipaConfig(vision_config=lowercase__    ,       text_config=lowercase__      )

						return config, image_size


@torch.no_grad()
def        _UpperCamelCase							(      lowercase__    ,       lowercase__=None    ,       lowercase__=False      ):
						__SCREAMING_SNAKE_CASE						:     Any					=		(
						    AutoTokenizer.from_pretrained('''facebook/opt-2.7b'''      )
						    if '''opt''' in model_name
						    else AutoTokenizer.from_pretrained('''google/flan-t5-xl'''      )
						)
						__SCREAMING_SNAKE_CASE						:     str					=		tokenizer('''\n'''    ,       add_special_tokens=lowercase__      ).input_ids[0]
						__SCREAMING_SNAKE_CASE			,			__SCREAMING_SNAKE_CASE						:     Union[str, Any]					=		get_blipa_config(lowercase__    ,       eos_token_id=lowercase__      )

						__SCREAMING_SNAKE_CASE						:     int					=		BlipaForConditionalGeneration(lowercase__      ).eval()

						__SCREAMING_SNAKE_CASE						:     int					=		{
						    '''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'''),
						}

						__SCREAMING_SNAKE_CASE			,			__SCREAMING_SNAKE_CASE						:     Any					=		model_name_to_original[model_name]

						# load original model
						print('''Loading original model...'''      )
						__SCREAMING_SNAKE_CASE						:     List[str]					=		'''cuda''' if torch.cuda.is_available() else '''cpu'''
						__SCREAMING_SNAKE_CASE			,			__SCREAMING_SNAKE_CASE			,			__SCREAMING_SNAKE_CASE						:     Dict					=		load_model_and_preprocess(
						    name=lowercase__    ,       model_type=lowercase__    ,       is_eval=lowercase__    ,       device=lowercase__      )
						original_model.eval()
						print('''Done!'''      )

						# update state dict keys
						__SCREAMING_SNAKE_CASE						:     List[str]					=		original_model.state_dict()
						__SCREAMING_SNAKE_CASE						:     Optional[int]					=		create_rename_keys(lowercase__      )
						for src, dest in rename_keys:
												rename_key(lowercase__    ,       lowercase__    ,       lowercase__      )

						# some keys can be renamed efficiently
						for key, val in state_dict.copy().items():
												__SCREAMING_SNAKE_CASE						:     Tuple					=		state_dict.pop(lowercase__      )
												if key.startswith('''Qformer.bert'''      ):
																		__SCREAMING_SNAKE_CASE						:     List[str]					=		key.replace('''Qformer.bert'''    ,       '''qformer'''      )
												if "attention.self" in key:
																		__SCREAMING_SNAKE_CASE						:     Union[str, Any]					=		key.replace('''self'''    ,       '''attention'''      )
												if "opt_proj" in key:
																		__SCREAMING_SNAKE_CASE						:     Dict					=		key.replace('''opt_proj'''    ,       '''language_projection'''      )
												if "t5_proj" in key:
																		__SCREAMING_SNAKE_CASE						:     Tuple					=		key.replace('''t5_proj'''    ,       '''language_projection'''      )
												if key.startswith('''opt'''      ):
																		__SCREAMING_SNAKE_CASE						:     List[str]					=		key.replace('''opt'''    ,       '''language'''      )
												if key.startswith('''t5'''      ):
																		__SCREAMING_SNAKE_CASE						:     Tuple					=		key.replace('''t5'''    ,       '''language'''      )
												__SCREAMING_SNAKE_CASE						:     Tuple					=		val

						# read in qv biases
						read_in_q_v_bias(lowercase__    ,       lowercase__      )

						__SCREAMING_SNAKE_CASE			,			__SCREAMING_SNAKE_CASE						:     List[str]					=		hf_model.load_state_dict(lowercase__    ,       strict=lowercase__      )
						assert len(lowercase__      ) == 0
						assert unexpected_keys == ["qformer.embeddings.position_ids"]

						__SCREAMING_SNAKE_CASE						:     List[str]					=		load_demo_image()
						__SCREAMING_SNAKE_CASE						:     Any					=		vis_processors['''eval'''](lowercase__      ).unsqueeze(0      ).to(lowercase__      )
						__SCREAMING_SNAKE_CASE						:     str					=		tokenizer(['''\n''']    ,       return_tensors='''pt'''      ).input_ids.to(lowercase__      )

						# create processor
						__SCREAMING_SNAKE_CASE						:     List[Any]					=		BlipImageProcessor(
						    size={'''height''': image_size, '''width''': image_size}    ,       image_mean=lowercase__    ,       image_std=lowercase__      )
						__SCREAMING_SNAKE_CASE						:     int					=		BlipaProcessor(image_processor=lowercase__    ,       tokenizer=lowercase__      )
						__SCREAMING_SNAKE_CASE						:     Any					=		processor(images=lowercase__    ,       return_tensors='''pt'''      ).pixel_values.to(lowercase__      )

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

						original_model.to(lowercase__      )
						hf_model.to(lowercase__      )
						with torch.no_grad():
												if "opt" in model_name:
																		__SCREAMING_SNAKE_CASE						:     Dict					=		original_model({'''image''': original_pixel_values, '''text_input''': ['''''']}      ).logits
																		__SCREAMING_SNAKE_CASE						:     Dict					=		hf_model(lowercase__    ,       lowercase__      ).logits
												else:
																		__SCREAMING_SNAKE_CASE						:     int					=		original_model(
																		    {'''image''': original_pixel_values, '''text_input''': ['''\n'''], '''text_output''': ['''\n''']}      ).logits
																		__SCREAMING_SNAKE_CASE						:     List[Any]					=		input_ids.masked_fill(input_ids == tokenizer.pad_token_id    ,       -100      )
																		__SCREAMING_SNAKE_CASE						:     Optional[int]					=		hf_model(lowercase__    ,       lowercase__    ,       labels=lowercase__      ).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":
												__SCREAMING_SNAKE_CASE						:     Dict					=		torch.tensor(
												    [[-41.5850, -4.4440, -8.9922], [-47.4322, -5.9143, -1.7340]]    ,       device=lowercase__      )
												assert torch.allclose(logits[0, :3, :3]    ,       lowercase__    ,       atol=1e-4      )
						elif model_name == "blip2-flan-t5-xl-coco":
												__SCREAMING_SNAKE_CASE						:     Any					=		torch.tensor(
												    [[-57.0109, -9.8967, -12.6280], [-68.6578, -12.7191, -10.5065]]    ,       device=lowercase__      )
						else:
												# cast to same type
												__SCREAMING_SNAKE_CASE						:     Optional[Any]					=		logits.dtype
												assert torch.allclose(original_logits.to(lowercase__      )    ,       lowercase__    ,       atol=1e-2      )
						print('''Looks ok!'''      )

						print('''Generating a caption...'''      )
						__SCREAMING_SNAKE_CASE						:     Any					=		''''''
						__SCREAMING_SNAKE_CASE						:     Optional[int]					=		tokenizer(lowercase__    ,       return_tensors='''pt'''      ).input_ids.to(lowercase__      )

						__SCREAMING_SNAKE_CASE						:     Optional[int]					=		original_model.generate({'''image''': original_pixel_values}      )
						__SCREAMING_SNAKE_CASE						:     Union[str, Any]					=		hf_model.generate(
						    lowercase__    ,       lowercase__    ,       do_sample=lowercase__    ,       num_beams=5    ,       max_length=30    ,       min_length=1    ,       top_p=0.9    ,       repetition_penalty=1.0    ,       length_penalty=1.0    ,       temperature=1    ,       )
						print('''Original generation:'''    ,       lowercase__      )
						__SCREAMING_SNAKE_CASE						:     Optional[Any]					=		input_ids.shape[1]
						__SCREAMING_SNAKE_CASE						:     Any					=		processor.batch_decode(outputs[:, prompt_length:]    ,       skip_special_tokens=lowercase__      )
						__SCREAMING_SNAKE_CASE						:     Optional[Any]					=		[text.strip() for text in output_text]
						print('''HF generation:'''    ,       lowercase__      )

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

						if push_to_hub:
												processor.push_to_hub(F'''nielsr/{model_name}'''      )
												hf_model.push_to_hub(F'''nielsr/{model_name}'''      )


if __name__ == "__main__":
						__lowerCAmelCase	: List[str]  				=argparse.ArgumentParser()
						__lowerCAmelCase	: Tuple  				=[
						    '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',
						)

						__lowerCAmelCase	: List[Any]  				=parser.parse_args()

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