






'''simple docstring'''







import inspect
import unittest

from transformers import MobileViTVaConfig
from transformers.testing_utils import require_torch, require_torch_multi_gpu, require_vision, slow, torch_device
from transformers.utils import cached_property, is_torch_available, is_vision_available

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


if is_torch_available():
							import torch

							from transformers import MobileViTVaForImageClassification, MobileViTVaForSemanticSegmentation, MobileViTVaModel
							from transformers.models.mobilevitva.modeling_mobilevitva import (
							    MOBILEVITV2_PRETRAINED_MODEL_ARCHIVE_LIST,
							    make_divisible,
							)


if is_vision_available():
							from PIL import Image

							from transformers import MobileViTImageProcessor




class 		UpperCamelCase__     (a      ):




		'''simple docstring'''





		def       UpperCamelCase_       (   self							):
								lowerCamelCase__								=	self.config_class(**self.inputs_dict							)
								self.parent.assertTrue(hasattr(_lowerCAmelCase ,"""width_multiplier"""							)							)




class 		UpperCamelCase__     :




		'''simple docstring'''





		def __init__(   self ,_lowerCAmelCase ,_lowerCAmelCase=13 ,_lowerCAmelCase=64 ,_lowerCAmelCase=2 ,_lowerCAmelCase=3 ,_lowerCAmelCase="swish" ,_lowerCAmelCase=3 ,_lowerCAmelCase=32 ,_lowerCAmelCase=0.1 ,_lowerCAmelCase=0.02 ,_lowerCAmelCase=True ,_lowerCAmelCase=True ,_lowerCAmelCase=10 ,_lowerCAmelCase=None ,_lowerCAmelCase=0.25 ,_lowerCAmelCase=0.0 ,_lowerCAmelCase=0.0 ,):
								lowerCamelCase__								=	parent
								lowerCamelCase__								=	batch_size
								lowerCamelCase__								=	image_size
								lowerCamelCase__								=	patch_size
								lowerCamelCase__								=	num_channels
								lowerCamelCase__								=	make_divisible(5_12 * width_multiplier ,divisor=8							)
								lowerCamelCase__								=	hidden_act
								lowerCamelCase__								=	conv_kernel_size
								lowerCamelCase__								=	output_stride
								lowerCamelCase__								=	classifier_dropout_prob
								lowerCamelCase__								=	use_labels
								lowerCamelCase__								=	is_training
								lowerCamelCase__								=	num_labels
								lowerCamelCase__								=	initializer_range
								lowerCamelCase__								=	scope
								lowerCamelCase__								=	width_multiplier
								lowerCamelCase__								=	ffn_dropout
								lowerCamelCase__								=	attn_dropout






		def       UpperCamelCase_       (   self							):
								lowerCamelCase__								=	floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size]							)

								lowerCamelCase__								=	None
								lowerCamelCase__								=	None
								if self.use_labels:
														lowerCamelCase__								=	ids_tensor([self.batch_size] ,self.num_labels							)
														lowerCamelCase__								=	ids_tensor([self.batch_size, self.image_size, self.image_size] ,self.num_labels							)

								lowerCamelCase__								=	self.get_config()

								return config, pixel_values, labels, pixel_labels






		def       UpperCamelCase_       (   self							):
								return MobileViTVaConfig(
								    image_size=self.image_size ,patch_size=self.patch_size ,num_channels=self.num_channels ,hidden_act=self.hidden_act ,conv_kernel_size=self.conv_kernel_size ,output_stride=self.output_stride ,classifier_dropout_prob=self.classifier_dropout_prob ,initializer_range=self.initializer_range ,width_multiplier=self.width_multiplier ,ffn_dropout=self.ffn_dropout_prob ,attn_dropout=self.attn_dropout_prob ,)






		def       UpperCamelCase_       (   self ,_lowerCAmelCase ,_lowerCAmelCase ,_lowerCAmelCase ,_lowerCAmelCase							):
								lowerCamelCase__								=	MobileViTVaModel(config=_lowerCAmelCase							)
								model.to(_lowerCAmelCase							)
								model.eval()
								lowerCamelCase__								=	model(_lowerCAmelCase							)
								self.parent.assertEqual(
								    result.last_hidden_state.shape ,(
								        self.batch_size,
								        self.last_hidden_size,
								        self.image_size // self.output_stride,
								        self.image_size // self.output_stride,
								    ) ,)






		def       UpperCamelCase_       (   self ,_lowerCAmelCase ,_lowerCAmelCase ,_lowerCAmelCase ,_lowerCAmelCase							):
								lowerCamelCase__								=	self.num_labels
								lowerCamelCase__								=	MobileViTVaForImageClassification(_lowerCAmelCase							)
								model.to(_lowerCAmelCase							)
								model.eval()
								lowerCamelCase__								=	model(_lowerCAmelCase ,labels=_lowerCAmelCase							)
								self.parent.assertEqual(result.logits.shape ,(self.batch_size, self.num_labels)							)






		def       UpperCamelCase_       (   self ,_lowerCAmelCase ,_lowerCAmelCase ,_lowerCAmelCase ,_lowerCAmelCase							):
								lowerCamelCase__								=	self.num_labels
								lowerCamelCase__								=	MobileViTVaForSemanticSegmentation(_lowerCAmelCase							)
								model.to(_lowerCAmelCase							)
								model.eval()
								lowerCamelCase__								=	model(_lowerCAmelCase							)
								self.parent.assertEqual(
								    result.logits.shape ,(
								        self.batch_size,
								        self.num_labels,
								        self.image_size // self.output_stride,
								        self.image_size // self.output_stride,
								    ) ,)
								lowerCamelCase__								=	model(_lowerCAmelCase ,labels=_lowerCAmelCase							)
								self.parent.assertEqual(
								    result.logits.shape ,(
								        self.batch_size,
								        self.num_labels,
								        self.image_size // self.output_stride,
								        self.image_size // self.output_stride,
								    ) ,)






		def       UpperCamelCase_       (   self							):
								lowerCamelCase__								=	self.prepare_config_and_inputs()
								lowerCamelCase__							,      lowerCamelCase__							,      lowerCamelCase__							,      lowerCamelCase__								=	config_and_inputs
								lowerCamelCase__								=	{"""pixel_values""": pixel_values}
								return config, inputs_dict




@require_torch
class 		UpperCamelCase__     (a ,a ,unittest.TestCase      ):




		'''simple docstring'''





		_UpperCamelCase						=       (
		    (MobileViTVaModel, MobileViTVaForImageClassification, MobileViTVaForSemanticSegmentation)
		    if is_torch_available()
		    else ()
		)

		_UpperCamelCase						=       (
		    {
		        'feature-extraction': MobileViTVaModel,
		        'image-classification': MobileViTVaForImageClassification,
		        'image-segmentation': MobileViTVaForSemanticSegmentation,
		    }
		    if is_torch_available()
		    else {}
		)

		_UpperCamelCase						=       False
		_UpperCamelCase						=       False
		_UpperCamelCase						=       False
		_UpperCamelCase						=       False






		def       UpperCamelCase_       (   self							):
								lowerCamelCase__								=	MobileViTVaModelTester(self							)
								lowerCamelCase__								=	MobileViTVaConfigTester(self ,config_class=_lowerCAmelCase ,has_text_modality=_lowerCAmelCase							)






		def       UpperCamelCase_       (   self							):
								self.config_tester.run_common_tests()






		@unittest.skip(reason="""MobileViTV2 does not use inputs_embeds"""							)
		def       UpperCamelCase_       (   self							):
								pass






		@unittest.skip(reason="""MobileViTV2 does not support input and output embeddings"""							)
		def       UpperCamelCase_       (   self							):
								pass






		@unittest.skip(reason="""MobileViTV2 does not output attentions"""							)
		def       UpperCamelCase_       (   self							):
								pass






		@require_torch_multi_gpu
		@unittest.skip(reason="""Got `CUDA error: misaligned address` for tests after this one being run."""							)
		def       UpperCamelCase_       (   self							):
								pass






		@unittest.skip("""Will be fixed soon by reducing the size of the model used for common tests."""							)
		def       UpperCamelCase_       (   self							):
								pass






		def       UpperCamelCase_       (   self							):
								lowerCamelCase__							,      lowerCamelCase__								=	self.model_tester.prepare_config_and_inputs_for_common()

								for model_class in self.all_model_classes:
														lowerCamelCase__								=	model_class(_lowerCAmelCase							)
														lowerCamelCase__								=	inspect.signature(model.forward							)
														# signature.parameters is an OrderedDict => so arg_names order is deterministic
														lowerCamelCase__								=	[*signature.parameters.keys()]

														lowerCamelCase__								=	["""pixel_values"""]
														self.assertListEqual(arg_names[:1] ,_lowerCAmelCase							)






		def       UpperCamelCase_       (   self							):
								lowerCamelCase__								=	self.model_tester.prepare_config_and_inputs()
								self.model_tester.create_and_check_model(*_lowerCAmelCase							)






		def       UpperCamelCase_       (   self							):
								def check_hidden_states_output(_lowerCAmelCase ,_lowerCAmelCase ,_lowerCAmelCase							):
														lowerCamelCase__								=	model_class(_lowerCAmelCase							)
														model.to(_lowerCAmelCase							)
														model.eval()

														with torch.no_grad():
																				lowerCamelCase__								=	model(**self._prepare_for_class(_lowerCAmelCase ,_lowerCAmelCase							)							)

														lowerCamelCase__								=	outputs.hidden_states

														lowerCamelCase__								=	5
														self.assertEqual(len(_lowerCAmelCase							) ,_lowerCAmelCase							)

														# MobileViTV2's feature maps are of shape (batch_size, num_channels, height, width)
														# with the width and height being successively divided by 2.
														lowerCamelCase__								=	2
														for i in range(len(_lowerCAmelCase							)							):
																				self.assertListEqual(
																				    list(hidden_states[i].shape[-2:]							) ,[self.model_tester.image_size // divisor, self.model_tester.image_size // divisor] ,)
																				divisor *= 2

														self.assertEqual(self.model_tester.output_stride ,divisor // 2							)

								lowerCamelCase__							,      lowerCamelCase__								=	self.model_tester.prepare_config_and_inputs_for_common()

								for model_class in self.all_model_classes:
														lowerCamelCase__								=	True
														check_hidden_states_output(_lowerCAmelCase ,_lowerCAmelCase ,_lowerCAmelCase							)

														# check that output_hidden_states also work using config
														del inputs_dict["output_hidden_states"]
														lowerCamelCase__								=	True

														check_hidden_states_output(_lowerCAmelCase ,_lowerCAmelCase ,_lowerCAmelCase							)






		def       UpperCamelCase_       (   self							):
								lowerCamelCase__								=	self.model_tester.prepare_config_and_inputs()
								self.model_tester.create_and_check_for_image_classification(*_lowerCAmelCase							)






		def       UpperCamelCase_       (   self							):
								lowerCamelCase__								=	self.model_tester.prepare_config_and_inputs()
								self.model_tester.create_and_check_for_semantic_segmentation(*_lowerCAmelCase							)






		@slow
		def       UpperCamelCase_       (   self							):
								for model_name in MOBILEVITV2_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
														lowerCamelCase__								=	MobileViTVaModel.from_pretrained(_lowerCAmelCase							)
														self.assertIsNotNone(_lowerCAmelCase							)



def     A__      (					):
						lowerCamelCase__								=	Image.open("""./tests/fixtures/tests_samples/COCO/000000039769.png"""    )
						return image





@require_torch
@require_vision
class 		UpperCamelCase__     (unittest.TestCase      ):




		'''simple docstring'''





		@cached_property
		def       UpperCamelCase_       (   self							):
								return (
								    MobileViTImageProcessor.from_pretrained("""apple/mobilevitv2-1.0-imagenet1k-256"""							)
								    if is_vision_available()
								    else None
								)






		@slow
		def       UpperCamelCase_       (   self							):
								lowerCamelCase__								=	MobileViTVaForImageClassification.from_pretrained("""apple/mobilevitv2-1.0-imagenet1k-256"""							).to(
								    _lowerCAmelCase							)

								lowerCamelCase__								=	self.default_image_processor
								lowerCamelCase__								=	prepare_img()
								lowerCamelCase__								=	image_processor(images=_lowerCAmelCase ,return_tensors="""pt"""							).to(_lowerCAmelCase							)

								# forward pass
								with torch.no_grad():
														lowerCamelCase__								=	model(**_lowerCAmelCase							)

								# verify the logits
								lowerCamelCase__								=	torch.Size((1, 10_00)							)
								self.assertEqual(outputs.logits.shape ,_lowerCAmelCase							)

								lowerCamelCase__								=	torch.tensor([-1.6336E00, -7.3204E-02, -5.1883E-01]							).to(_lowerCAmelCase							)

								self.assertTrue(torch.allclose(outputs.logits[0, :3] ,_lowerCAmelCase ,atol=1E-4							)							)






		@slow
		def       UpperCamelCase_       (   self							):
								lowerCamelCase__								=	MobileViTVaForSemanticSegmentation.from_pretrained("""shehan97/mobilevitv2-1.0-voc-deeplabv3"""							)
								lowerCamelCase__								=	model.to(_lowerCAmelCase							)

								lowerCamelCase__								=	MobileViTImageProcessor.from_pretrained("""shehan97/mobilevitv2-1.0-voc-deeplabv3"""							)

								lowerCamelCase__								=	prepare_img()
								lowerCamelCase__								=	image_processor(images=_lowerCAmelCase ,return_tensors="""pt"""							).to(_lowerCAmelCase							)

								# forward pass
								with torch.no_grad():
														lowerCamelCase__								=	model(**_lowerCAmelCase							)
								lowerCamelCase__								=	outputs.logits

								# verify the logits
								lowerCamelCase__								=	torch.Size((1, 21, 32, 32)							)
								self.assertEqual(logits.shape ,_lowerCAmelCase							)

								lowerCamelCase__								=	torch.tensor(
								    [
								        [[7.0863, 7.1525, 6.8201], [6.6931, 6.8770, 6.8933], [6.2978, 7.0366, 6.9636]],
								        [[-3.7134, -3.6712, -3.6675], [-3.5825, -3.3549, -3.4777], [-3.3435, -3.3979, -3.2857]],
								        [[-2.9329, -2.8003, -2.7369], [-3.0564, -2.4780, -2.0207], [-2.6889, -1.9298, -1.7640]],
								    ] ,device=_lowerCAmelCase ,)

								self.assertTrue(torch.allclose(logits[0, :3, :3, :3] ,_lowerCAmelCase ,atol=1E-4							)							)






		@slow
		def       UpperCamelCase_       (   self							):
								lowerCamelCase__								=	MobileViTVaForSemanticSegmentation.from_pretrained("""shehan97/mobilevitv2-1.0-voc-deeplabv3"""							)
								lowerCamelCase__								=	model.to(_lowerCAmelCase							)

								lowerCamelCase__								=	MobileViTImageProcessor.from_pretrained("""shehan97/mobilevitv2-1.0-voc-deeplabv3"""							)

								lowerCamelCase__								=	prepare_img()
								lowerCamelCase__								=	image_processor(images=_lowerCAmelCase ,return_tensors="""pt"""							).to(_lowerCAmelCase							)

								# forward pass
								with torch.no_grad():
														lowerCamelCase__								=	model(**_lowerCAmelCase							)

								lowerCamelCase__								=	outputs.logits.detach().cpu()

								lowerCamelCase__								=	image_processor.post_process_semantic_segmentation(outputs=_lowerCAmelCase ,target_sizes=[(50, 60)]							)
								lowerCamelCase__								=	torch.Size((50, 60)							)
								self.assertEqual(segmentation[0].shape ,_lowerCAmelCase							)

								lowerCamelCase__								=	image_processor.post_process_semantic_segmentation(outputs=_lowerCAmelCase							)
								lowerCamelCase__								=	torch.Size((32, 32)							)
								self.assertEqual(segmentation[0].shape ,_lowerCAmelCase							)






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)
