





import argparse

import gdown
import numpy as np
import torch
from huggingface_hub import hf_hub_download

from transformers import (
    CLIPTokenizer,
    CLIPTokenizerFast,
    VideoMAEImageProcessor,
    XCLIPConfig,
    XCLIPModel,
    XCLIPProcessor,
    XCLIPTextConfig,
    XCLIPVisionConfig,
)


def 							SCREAMING_SNAKE_CASE__  (			__a      ,       __a      ):
	snake_case_						:	List[Any]      =		XCLIPTextConfig()

	# derive patch size from model name
	snake_case_						:	Optional[int]      =		model_name.find('patch'      )
	snake_case_						:	Dict      =		int(model_name[start_idx + len('patch'      ) : start_idx + len('patch'      ) + 2]      )
	snake_case_						:	Union[str, Any]      =		XCLIPVisionConfig(patch_size=lowercase__      ,       num_frames=lowercase__      )

	if "large" in model_name:
		snake_case_						:	int      =		7_68
		snake_case_						:	Dict      =		30_72
		snake_case_						:	List[Any]      =		12

		snake_case_						:	Any      =		10_24
		snake_case_						:	Union[str, Any]      =		40_96
		snake_case_						:	Union[str, Any]      =		16
		snake_case_						:	List[Any]      =		24
		snake_case_						:	Union[str, Any]      =		7_68
		snake_case_						:	str      =		30_72

	if model_name == "xclip-large-patch14-16-frames":
		snake_case_						:	Any      =		3_36

	snake_case_						:	int      =		XCLIPConfig.from_text_vision_configs(lowercase__      ,       lowercase__      )

	if "large" in model_name:
		snake_case_						:	Optional[int]      =		7_68

	return config


def 							SCREAMING_SNAKE_CASE__  (			__a      ):
	# text encoder
	if name == "token_embedding.weight":
		snake_case_						:	Dict      =		name.replace('token_embedding.weight'      ,       'text_model.embeddings.token_embedding.weight'      )
	if name == "positional_embedding":
		snake_case_						:	Optional[Any]      =		name.replace('positional_embedding'      ,       'text_model.embeddings.position_embedding.weight'      )
	if "ln_1" in name:
		snake_case_						:	Dict      =		name.replace('ln_1'      ,       'layer_norm1'      )
	if "ln_2" in name:
		snake_case_						:	Optional[int]      =		name.replace('ln_2'      ,       'layer_norm2'      )
	if "c_fc" in name:
		snake_case_						:	Tuple      =		name.replace('c_fc'      ,       'fc1'      )
	if "c_proj" in name:
		snake_case_						:	Tuple      =		name.replace('c_proj'      ,       'fc2'      )
	if name.startswith('transformer.resblocks'      ):
		snake_case_						:	int      =		name.replace('transformer.resblocks'      ,       'text_model.encoder.layers'      )
	if "attn.out_proj" in name and "message" not in name:
		snake_case_						:	List[Any]      =		name.replace('attn.out_proj'      ,       'self_attn.out_proj'      )
	if "ln_final" in name:
		snake_case_						:	List[Any]      =		name.replace('ln_final'      ,       'text_model.final_layer_norm'      )
	# visual encoder
	if name == "visual.class_embedding":
		snake_case_						:	List[str]      =		name.replace('visual.class_embedding'      ,       'vision_model.embeddings.class_embedding'      )
	if name == "visual.positional_embedding":
		snake_case_						:	str      =		name.replace('visual.positional_embedding'      ,       'vision_model.embeddings.position_embedding.weight'      )
	if name.startswith('visual.transformer.resblocks'      ):
		snake_case_						:	List[str]      =		name.replace('visual.transformer.resblocks'      ,       'vision_model.encoder.layers'      )
	if "visual.conv1" in name:
		snake_case_						:	List[Any]      =		name.replace('visual.conv1'      ,       'vision_model.embeddings.patch_embedding'      )
	if "visual.ln_pre" in name:
		snake_case_						:	Dict      =		name.replace('visual.ln_pre'      ,       'vision_model.pre_layernorm'      )
	if "visual.ln_post" in name:
		snake_case_						:	Optional[Any]      =		name.replace('visual.ln_post'      ,       'vision_model.post_layernorm'      )
	if "visual.proj" in name:
		snake_case_						:	str      =		name.replace('visual.proj'      ,       'visual_projection.weight'      )
	if "text_projection" in name:
		snake_case_						:	List[str]      =		name.replace('text_projection'      ,       'text_projection.weight'      )
	# things on top
	if "prompts_visual_proj" in name:
		snake_case_						:	Tuple      =		name.replace('prompts_visual_proj'      ,       'prompts_visual_projection'      )
	if "prompts_visual_ln" in name:
		snake_case_						:	Any      =		name.replace('prompts_visual_ln'      ,       'prompts_visual_layernorm'      )
	# mit
	if name == "mit.positional_embedding":
		snake_case_						:	Dict      =		name.replace('positional'      ,       'position'      )
	if name.startswith('mit.resblocks'      ):
		snake_case_						:	Optional[int]      =		name.replace('mit.resblocks'      ,       'mit.encoder.layers'      )
	# prompts generator
	if name.startswith('prompts_generator.norm'      ):
		snake_case_						:	List[Any]      =		name.replace('prompts_generator.norm'      ,       'prompts_generator.layernorm'      )

	return name


def 							SCREAMING_SNAKE_CASE__  (			__a      ,       __a      ):
	for key in orig_state_dict.copy().keys():
		snake_case_						:	List[str]      =		orig_state_dict.pop(lowercase__      )

		if "attn.in_proj" in key:
			snake_case_						:	str      =		key.split('.'      )
			if key.startswith('visual'      ):
				snake_case_						:	str      =		key_split[3]
				snake_case_						:	Union[str, Any]      =		config.vision_config.hidden_size
				if "message_attn" in key:
					if "weight" in key:
						snake_case_						:	int      =		val[
						    :dim, :
						]
						snake_case_						:	str      =		val[
						    dim : dim * 2, :
						]
						snake_case_						:	str      =		val[
						    -dim:, :
						]
					else:
						snake_case_						:	str      =		val[
						    :dim
						]
						snake_case_						:	Union[str, Any]      =		val[
						    dim : dim * 2
						]
						snake_case_						:	Optional[int]      =		val[
						    -dim:
						]
				else:
					if "weight" in key:
						snake_case_						:	Any      =		val[
						    :dim, :
						]
						snake_case_						:	Optional[int]      =		val[
						    dim : dim * 2, :
						]
						snake_case_						:	Optional[int]      =		val[
						    -dim:, :
						]
					else:
						snake_case_						:	Optional[int]      =		val[:dim]
						snake_case_						:	Optional[int]      =		val[
						    dim : dim * 2
						]
						snake_case_						:	Tuple      =		val[-dim:]
			elif key.startswith('mit'      ):
				snake_case_						:	Dict      =		key_split[2]
				snake_case_						:	Any      =		config.vision_config.mit_hidden_size
				if "weight" in key:
					snake_case_						:	Dict      =		val[:dim, :]
					snake_case_						:	Union[str, Any]      =		val[dim : dim * 2, :]
					snake_case_						:	List[Any]      =		val[-dim:, :]
				else:
					snake_case_						:	Dict      =		val[:dim]
					snake_case_						:	Optional[Any]      =		val[dim : dim * 2]
					snake_case_						:	List[str]      =		val[-dim:]
			else:
				snake_case_						:	Optional[Any]      =		key_split[2]
				snake_case_						:	Optional[int]      =		config.text_config.hidden_size
				if "weight" in key:
					snake_case_						:	Dict      =		val[:dim, :]
					snake_case_						:	Optional[Any]      =		val[
					    dim : dim * 2, :
					]
					snake_case_						:	Optional[Any]      =		val[-dim:, :]
				else:
					snake_case_						:	Tuple      =		val[:dim]
					snake_case_						:	Any      =		val[
					    dim : dim * 2
					]
					snake_case_						:	Any      =		val[-dim:]
		else:
			snake_case_						:	List[str]      =		rename_key(lowercase__      )
			if new_key_name in ["visual_projection.weight", "text_projection.weight"]:
				snake_case_						:	Any      =		val.T
			snake_case_						:	Dict      =		val

	return orig_state_dict


def 							SCREAMING_SNAKE_CASE__  (			__a      ):
	if num_frames == 8:
		snake_case_						:	List[str]      =		'''eating_spaghetti_8_frames.npy'''
	elif num_frames == 16:
		snake_case_						:	str      =		'''eating_spaghetti.npy'''
	elif num_frames == 32:
		snake_case_						:	Dict      =		'''eating_spaghetti_32_frames.npy'''
	snake_case_						:	str      =		hf_hub_download(
	    repo_id='hf-internal-testing/spaghetti-video'      ,       filename=lowercase__      ,       repo_type='dataset'      ,       )
	snake_case_						:	Union[str, Any]      =		np.load(lowercase__      )
	return list(lowercase__      )


def 							SCREAMING_SNAKE_CASE__  (			__a      ,       __a=None      ,       __a=False      ):
	snake_case_						:	Union[str, Any]      =		{
	    # fully supervised kinetics-400 checkpoints
	    '''xclip-base-patch32''': '''https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/k400_32_8.pth''',
	    '''xclip-base-patch32-16-frames''': (
	        '''https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/k400_32_16.pth'''
	    ),
	    '''xclip-base-patch16''': '''https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/k400_16_8.pth''',
	    '''xclip-base-patch16-16-frames''': (
	        '''https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/k400_16_16.pth'''
	    ),
	    '''xclip-large-patch14''': '''https://drive.google.com/u/0/uc?id=1NUOImq0o5DlQTST17iIP3vG7DgmHQuCx&amp;export=download&amp;confirm=t&amp;uuid=b26caedc-88e2-473e-830a-9d158b653cdb''',
	    '''xclip-large-patch14-16-frames''': '''https://drive.google.com/u/0/uc?id=1FOYgnJc097OJ4lGwtRCCydQyVPJEOH7d&amp;export=download&amp;confirm=t&amp;uuid=538fa810-e671-4050-b385-9a623f89804f''',
	    # fully supervised kinetics-600 checkpoints
	    '''xclip-base-patch16-kinetics-600''': (
	        '''https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/k600_16_8.pth'''
	    ),
	    '''xclip-base-patch16-kinetics-600-16-frames''': (
	        '''https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/k600_16_16.pth'''
	    ),
	    '''xclip-large-patch14-kinetics-600''': '''https://drive.google.com/u/0/uc?id=1FV8C1INuM91sLAN4ImjzePLIlpMSihwV&amp;export=download&amp;confirm=t&amp;uuid=141d4977-4a65-44ae-864f-4b0c19f838be''',
	    # few shot
	    '''xclip-base-patch16-hmdb-2-shot''': (
	        '''https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/few_hmdb_2.pth'''
	    ),
	    '''xclip-base-patch16-hmdb-4-shot''': (
	        '''https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/few_hmdb_4.pth'''
	    ),
	    '''xclip-base-patch16-hmdb-8-shot''': (
	        '''https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/few_hmdb_8.pth'''
	    ),
	    '''xclip-base-patch16-hmdb-16-shot''': (
	        '''https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/few_hmdb_16.pth'''
	    ),
	    '''xclip-base-patch16-ucf-2-shot''': (
	        '''https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/few_ucf_2.pth'''
	    ),
	    '''xclip-base-patch16-ucf-4-shot''': (
	        '''https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/few_ucf_4.pth'''
	    ),
	    '''xclip-base-patch16-ucf-8-shot''': (
	        '''https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/few_ucf_8.pth'''
	    ),
	    '''xclip-base-patch16-ucf-16-shot''': (
	        '''https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/few_ucf_16.pth'''
	    ),
	    # zero shot
	    '''xclip-base-patch16-zero-shot''': '''https://github.com/nbl97/X-CLIP_Model_Zoo/releases/download/v1.0/zero.pth''',
	}

	snake_case_						:	Optional[Any]      =		model_to_url[model_name]
	snake_case_						:	int      =		8
	if "16-frames" in model_name:
		snake_case_						:	Tuple      =		16
	elif "shot" in model_name:
		snake_case_						:	List[Any]      =		32

	snake_case_						:	Any      =		get_xclip_config(lowercase__      ,       lowercase__      )
	snake_case_						:	str      =		XCLIPModel(lowercase__      )
	model.eval()

	if "drive" in checkpoint_url:
		snake_case_						:	Optional[int]      =		'''pytorch_model.bin'''
		gdown.cached_download(lowercase__      ,       lowercase__      ,       quiet=lowercase__      )
		snake_case_						:	Optional[int]      =		torch.load(lowercase__      ,       map_location='cpu'      )['''model''']
	else:
		snake_case_						:	List[str]      =		torch.hub.load_state_dict_from_url(lowercase__      )['''model''']

	snake_case_						:	str      =		convert_state_dict(lowercase__      ,       lowercase__      )

	snake_case_						:	Dict      =		XCLIPModel(lowercase__      )
	snake_case_						:	Any      =		model.load_state_dict(lowercase__      ,       strict=lowercase__      )
	assert missing_keys == ["text_model.embeddings.position_ids", "vision_model.embeddings.position_ids"]
	model.eval()

	snake_case_						:	Tuple      =		3_36 if model_name == '''xclip-large-patch14-16-frames''' else 2_24
	snake_case_						:	Dict      =		VideoMAEImageProcessor(size=lowercase__      )
	snake_case_						:	List[Any]      =		CLIPTokenizer.from_pretrained('openai/clip-vit-base-patch32'      )
	snake_case_						:	int      =		CLIPTokenizerFast.from_pretrained('openai/clip-vit-base-patch32'      )
	snake_case_						:	Optional[Any]      =		XCLIPProcessor(image_processor=lowercase__      ,       tokenizer=lowercase__      )

	snake_case_						:	Dict      =		prepare_video(lowercase__      )
	snake_case_						:	int      =		processor(
	    text=['playing sports', 'eating spaghetti', 'go shopping']      ,       videos=lowercase__      ,       return_tensors='pt'      ,       padding=lowercase__      )

	print('Shape of pixel values:'      ,       inputs.pixel_values.shape      )

	with torch.no_grad():
		snake_case_						:	Optional[Any]      =		model(**lowercase__      )

	# Verify outputs
	snake_case_						:	Tuple      =		outputs.logits_per_video
	snake_case_						:	Optional[int]      =		logits_per_video.softmax(dim=1      )
	print('Probs:'      ,       lowercase__      )
	# kinetics-400
	if model_name == "xclip-base-patch32":
		snake_case_						:	Union[str, Any]      =		torch.tensor([[0.0019, 0.9951, 0.0030]]      )
	elif model_name == "xclip-base-patch32-16-frames":
		snake_case_						:	Dict      =		torch.tensor([[7.0_999E-04, 9.9_883E-01, 4.5_580E-04]]      )
	elif model_name == "xclip-base-patch16":
		snake_case_						:	Optional[Any]      =		torch.tensor([[0.0083, 0.9681, 0.0236]]      )
	elif model_name == "xclip-base-patch16-16-frames":
		snake_case_						:	Optional[int]      =		torch.tensor([[7.6_937E-04, 9.9_728E-01, 1.9_473E-03]]      )
	elif model_name == "xclip-large-patch14":
		snake_case_						:	Any      =		torch.tensor([[0.0062, 0.9864, 0.0075]]      )
	elif model_name == "xclip-large-patch14-16-frames":
		snake_case_						:	Union[str, Any]      =		torch.tensor([[3.3_877E-04, 9.9_937E-01, 2.8_888E-04]]      )
	# kinetics-600
	elif model_name == "xclip-base-patch16-kinetics-600":
		snake_case_						:	Any      =		torch.tensor([[0.0555, 0.8914, 0.0531]]      )
	elif model_name == "xclip-base-patch16-kinetics-600-16-frames":
		snake_case_						:	Union[str, Any]      =		torch.tensor([[3.8_554E-04, 9.9_929E-01, 3.2_754E-04]]      )
	elif model_name == "xclip-large-patch14-kinetics-600":
		snake_case_						:	List[Any]      =		torch.tensor([[0.0036, 0.9920, 0.0045]]      )
	# few shot
	elif model_name == "xclip-base-patch16-hmdb-2-shot":
		snake_case_						:	str      =		torch.tensor([[7.1_890E-06, 9.9_994E-01, 5.6_559E-05]]      )
	elif model_name == "xclip-base-patch16-hmdb-4-shot":
		snake_case_						:	Dict      =		torch.tensor([[1.0_320E-05, 9.9_993E-01, 6.2_435E-05]]      )
	elif model_name == "xclip-base-patch16-hmdb-8-shot":
		snake_case_						:	Union[str, Any]      =		torch.tensor([[4.1_377E-06, 9.9_990E-01, 9.8_386E-05]]      )
	elif model_name == "xclip-base-patch16-hmdb-16-shot":
		snake_case_						:	Any      =		torch.tensor([[4.1_347E-05, 9.9_962E-01, 3.3_411E-04]]      )
	elif model_name == "xclip-base-patch16-ucf-2-shot":
		snake_case_						:	Dict      =		torch.tensor([[8.5_857E-05, 9.9_928E-01, 6.3_291E-04]]      )
	elif model_name == "xclip-base-patch16-ucf-4-shot":
		snake_case_						:	Optional[Any]      =		torch.tensor([[8.5_857E-05, 9.9_928E-01, 6.3_291E-04]]      )
	elif model_name == "xclip-base-patch16-ucf-8-shot":
		snake_case_						:	List[Any]      =		torch.tensor([[0.0027, 0.9904, 0.0070]]      )
	elif model_name == "xclip-base-patch16-ucf-16-shot":
		snake_case_						:	str      =		torch.tensor([[9.8_219E-04, 9.9_593E-01, 3.0_863E-03]]      )
	# zero shot
	elif model_name == "xclip-base-patch16-zero-shot":
		snake_case_						:	List[Any]      =		torch.tensor([[3.5_082E-04, 9.9_785E-01, 1.7_966E-03]]      )
	else:
		raise ValueError(f"""Model name {model_name} not supported"""      )
	assert torch.allclose(lowercase__      ,       lowercase__      ,       atol=1E-3      )
	print('Looks ok!'      )

	if pytorch_dump_folder_path is not None:
		print(f"""Saving model {model_name} to {pytorch_dump_folder_path}"""      )
		model.save_pretrained(lowercase__      )

	if push_to_hub:
		print('Pushing model, processor and slow tokenizer files to the hub...'      )
		model.push_to_hub(lowercase__      ,       organization='nielsr'      )
		processor.push_to_hub(lowercase__      ,       organization='nielsr'      )
		slow_tokenizer.push_to_hub(lowercase__      ,       organization='nielsr'      )


if __name__ == "__main__":
						_SCREAMING_SNAKE_CASE							=						argparse.ArgumentParser()
						# Required parameters
						parser.add_argument(
						    """--model_name""",
						    default="""xclip-base-patch32""",
						    type=str,
						    help="""Name of the model.""",
						)
						parser.add_argument(
						    """--pytorch_dump_folder_path""", default=None, type=str, help="""Path to the output PyTorch model directory."""
						)
						parser.add_argument(
						    """--push_to_hub""", action="""store_true""", help="""Whether or not to push the converted model to the 🤗 hub."""
						)

						_SCREAMING_SNAKE_CASE							=						parser.parse_args()
						convert_xclip_checkpoint(args.model_name, args.pytorch_dump_folder_path, args.push_to_hub)





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)
