


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_float32 (there's also the fix_lavis branch)
# also note: to convert Vicuna checkpoints, we had to include /home/niels/python_projects/checkpoints/FastChat/vicuna-7b in lavis/configs/models/blip2/blip2_instruct_vicuna7b.yaml
# same for Vicuna-13b
from lavis.models import load_model_and_preprocess
from PIL import Image

from transformers import (
    AutoTokenizer,
    BlipImageProcessor,
    InstructBlipConfig,
    InstructBlipForConditionalGeneration,
    InstructBlipProcessor,
    InstructBlipQFormerConfig,
    InstructBlipVisionConfig,
    LlamaConfig,
    LlamaTokenizerFast,
    TaConfig,
    TaTokenizerFast,
)
from transformers.utils.constants import OPENAI_CLIP_MEAN, OPENAI_CLIP_STD
def     __lowerCamelCase						(			):




      """simple docstring"""





      a						:Optional[Any]										=	'''https://raw.githubusercontent.com/salesforce/LAVIS/main/docs/_static/Confusing-Pictures.jpg'''
      a						:List[Any]										=	Image.open(requests.get(UpperCAmelCase_			,  stream=UpperCAmelCase_						).raw						).convert('''RGB'''						)

      return image
def     __lowerCamelCase						(			UpperCAmelCase_						:		List[Any]						):




      """simple docstring"""





      a						:Tuple										=	[]
      # 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.embeddings.layernorm.weight''')						)
      rename_keys.append(('''Qformer.bert.embeddings.LayerNorm.bias''', '''qformer.embeddings.layernorm.bias''')						)

      # fmt: on
      return rename_keys
def     __lowerCamelCase						(			UpperCAmelCase_						:		int			,  UpperCAmelCase_						:		Tuple			,  UpperCAmelCase_						:		Any						):




      """simple docstring"""





      a						:Optional[Any]										=	dct.pop(UpperCAmelCase_						)
      a						:List[Any]										=	val
def     __lowerCamelCase						(			UpperCAmelCase_						:		Optional[int]			,  UpperCAmelCase_						:		Optional[Any]						):




      """simple docstring"""





      for i in range(config.vision_config.num_hidden_layers						):
            # read in original q and v biases
            a						:Optional[Any]										=	state_dict.pop(F'''visual_encoder.blocks.{i}.attn.q_bias'''						)
            a						:List[str]										=	state_dict.pop(F'''visual_encoder.blocks.{i}.attn.v_bias'''						)

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




      """simple docstring"""





      a						:Optional[int]										=	364 if '''coco''' in model_name else 224
      a						:Union[str, Any]										=	InstructBlipVisionConfig(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 "t5-xl" in model_name:
            a						:Optional[int]										=	TaConfig.from_pretrained('''google/flan-t5-xl'''			,  dense_act_fn='''gelu'''			,  bos_token_id=1						).to_dict()
      elif "t5-xxl" in model_name:
            a						:Dict										=	TaConfig.from_pretrained('''google/flan-t5-xxl'''			,  dense_act_fn='''gelu'''			,  bos_token_id=1						).to_dict()
      elif "vicuna-7b" in model_name:
            a						:Tuple										=	LlamaConfig.from_pretrained('''decapoda-research/llama-7b-hf'''			,  vocab_size=3_2001						).to_dict()
      elif "vicuna-13b" in model_name:
            a						:str										=	LlamaConfig.from_pretrained('''decapoda-research/llama-13b-hf'''			,  vocab_size=3_2001						).to_dict()
      else:
            raise ValueError('''Model name not supported'''						)

      # the authors add one special "[DEC]" token to the vocab of Q-Former, hence vocab size = 30522 + 1
      a						:Union[str, Any]										=	InstructBlipQFormerConfig(vocab_size=3_0523						).to_dict()
      a						:int										=	InstructBlipConfig(vision_config=UpperCAmelCase_			,  text_config=UpperCAmelCase_			,  qformer_config=UpperCAmelCase_						)

      return config, image_size
@torch.no_grad()
def     __lowerCamelCase						(			UpperCAmelCase_						:		Optional[int]			,  UpperCAmelCase_						:		List[str]=None			,  UpperCAmelCase_						:		List[Any]=False						):




      """simple docstring"""





      a						:Optional[int]										=	AutoTokenizer.from_pretrained('''bert-base-uncased'''			,  truncation_side='''left'''						)
      qformer_tokenizer.add_special_tokens({'''bos_token''': '''[DEC]'''}						)

      if "t5" in model_name:
            a						:Union[str, Any]										=	TaTokenizerFast.from_pretrained('''google/flan-t5-xl'''			,  truncation_side='''left'''						)
      elif "vicuna" in model_name:
            # the following was used in the original implementation:
            # tokenizer = LlamaTokenizer.from_pretrained("huggyllama/llama-7b", use_fast=False, truncation_side="left")
            # tokenizer.add_special_tokens({"pad_token": "[PAD]"})
            # tokenizer.add_special_tokens({"bos_token": "</s>"})
            # tokenizer.add_special_tokens({"eos_token": "</s>"})
            # tokenizer.add_special_tokens({"unk_token": "</s>"})
            a						:str										=	LlamaTokenizerFast.from_pretrained(
                '''huggyllama/llama-7b'''			,  truncation_side='''left'''			,  bos_token='''</s>'''			,  unk_token='''</s>'''						)
            tokenizer.add_special_tokens({'''pad_token''': '''[PAD]'''}						)

      a							,    a						:List[Any]										=	get_blipa_config(UpperCAmelCase_						)
      a						:Union[str, Any]										=	InstructBlipForConditionalGeneration(UpperCAmelCase_						).eval()

      a						:int										=	{
          '''instructblip-vicuna-7b''': ('''blip2_vicuna_instruct''', '''vicuna7b'''),
          '''instructblip-vicuna-13b''': ('''blip2_vicuna_instruct''', '''vicuna13b'''),
          '''instructblip-flan-t5-xl''': ('''blip2_t5_instruct''', '''flant5xl'''),
          '''instructblip-flan-t5-xxl''': ('''blip2_t5_instruct''', '''flant5xxl'''),
      }

      a							,    a						:Dict										=	model_name_to_original[model_name]

      # load original model
      print('''Loading original model...'''						)
      a						:Tuple										=	'''cuda:1''' if torch.cuda.is_available() else '''cpu'''
      a						:Optional[int]										=	'''cuda:2''' if torch.cuda.is_available() else '''cpu'''
      a							,    a							,    a						:Dict										=	load_model_and_preprocess(
          name=UpperCAmelCase_			,  model_type=UpperCAmelCase_			,  is_eval=UpperCAmelCase_			,  device=UpperCAmelCase_						)
      original_model.eval()
      print('''Done!'''						)

      # update state dict keys
      a						:Optional[int]										=	original_model.state_dict()
      a						:List[str]										=	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						:List[Any]										=	state_dict.pop(UpperCAmelCase_						)
            if key.startswith('''Qformer.bert'''						):
                  a						:List[str]										=	key.replace('''Qformer.bert'''			,  '''qformer'''						)
            if "attention.self" in key:
                  a						:Optional[Any]										=	key.replace('''self'''			,  '''attention'''						)
            if "llm_proj" in key:
                  a						:Optional[Any]										=	key.replace('''llm_proj'''			,  '''language_projection'''						)
            if "t5_proj" in key:
                  a						:Optional[int]										=	key.replace('''t5_proj'''			,  '''language_projection'''						)
            if key.startswith('''llm_model'''						):
                  a						:Any										=	key.replace('''llm_model'''			,  '''language_model'''						)
            if key.startswith('''t5'''						):
                  a						:str										=	key.replace('''t5'''			,  '''language'''						)
            a						:Optional[Any]										=	val

      # read in qv biases
      read_in_q_v_bias(UpperCAmelCase_			,  UpperCAmelCase_						)

      # note: weights get loaded in torch.float32 by default
      hf_model.load_state_dict(UpperCAmelCase_			,  strict=UpperCAmelCase_						)

      a						:Tuple										=	load_demo_image()
      a						:List[Any]										=	'''What is unusual about this image?'''

      # create processor
      a						:Optional[Any]										=	BlipImageProcessor(
          size={'''height''': image_size, '''width''': image_size}			,  image_mean=UpperCAmelCase_			,  image_std=UpperCAmelCase_						)
      a						:Union[str, Any]										=	InstructBlipProcessor(
          image_processor=UpperCAmelCase_			,  tokenizer=UpperCAmelCase_			,  qformer_tokenizer=UpperCAmelCase_			,  )
      a						:Any										=	processor(images=UpperCAmelCase_			,  text=UpperCAmelCase_			,  return_tensors='''pt'''						).to(UpperCAmelCase_						)

      # make sure processor creates exact same pixel values
      a						:Dict										=	vis_processors['''eval'''](UpperCAmelCase_						).unsqueeze(0						).to(UpperCAmelCase_						)
      a						:List[str]										=	inputs.pixel_values
      assert torch.allclose(original_pixel_values.to(pixel_values.device						)			,  UpperCAmelCase_						)

      original_model.to(UpperCAmelCase_						)
      hf_model.to(UpperCAmelCase_						)
      with torch.no_grad():
            if "vicuna" in model_name:
                  a						:int										=	original_model({'''image''': original_pixel_values, '''text_input''': [prompt]}						).logits
                  a						:int										=	hf_model(**UpperCAmelCase_						).logits
            else:
                  a						:Any										=	original_model(
                      {'''image''': original_pixel_values, '''text_input''': [prompt], '''text_output''': ['''\n''']}						).logits
                  a						:str										=	tokenizer('''\n'''			,  return_tensors='''pt'''						).input_ids.to(UpperCAmelCase_						)
                  a						:Optional[Any]										=	label_input_ids.masked_fill(label_input_ids == tokenizer.pad_token_id			,  -100						)
                  a						:Any										=	hf_model(**UpperCAmelCase_			,  labels=UpperCAmelCase_						).logits

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

      # assert values
      assert original_logits.shape == logits.shape
      a						:Optional[int]										=	1E-4 if '''vicuna''' in model_name else 1E-5
      assert torch.allclose(original_logits.to(logits.device						)			,  UpperCAmelCase_			,  atol=UpperCAmelCase_						)
      print('''Looks ok!'''						)

      print('''Generating with original model...'''						)
      a						:Dict										=	original_model.generate({'''image''': original_pixel_values, '''prompt''': prompt}			,  num_beams=5						)

      # important: we need to cast the weights of the HF model to the appropriate type
      print('''Generating with HF model...'''						)
      a						:Any										=	hf_model.generate(
          **UpperCAmelCase_			,  do_sample=UpperCAmelCase_			,  num_beams=5			,  max_length=256			,  min_length=1			,  top_p=0.9			,  repetition_penalty=1.5			,  length_penalty=1.0			,  temperature=1			,  )
      if "vicuna" in model_name:
            # convert output id 0 to 2 (eos_token_id)
            # TODO add this in the generate method?
            a						:Optional[int]										=	2
      print('''Original generation:'''			,  UpperCAmelCase_						)
      a						:int										=	processor.batch_decode(UpperCAmelCase_			,  skip_special_tokens=UpperCAmelCase_						)
      a						:Optional[int]										=	[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'''Salesforce/{model_name}'''						)
            hf_model.push_to_hub(F'''Salesforce/{model_name}'''						)


if __name__ == "__main__":
     snake_case    :   Dict	    =					argparse.ArgumentParser()
     snake_case    :   List[str]	    =					[
         '''instructblip-vicuna-7b''',
         '''instructblip-vicuna-13b''',
         '''instructblip-flan-t5-xl''',
         '''instructblip-flan-t5-xxl''',
     ]
     parser.add_argument(
         '''--model_name''',
         default='''instructblip-flan-t5-xl''',
         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''',
     )

     snake_case    :   Optional[int]	    =					parser.parse_args()

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









import os

import pytest

from datasets import (
    get_dataset_config_info,
    get_dataset_config_names,
    get_dataset_infos,
    get_dataset_split_names,
    inspect_dataset,
    inspect_metric,
)


snake_case    :   Any	    =					pytest.mark.integration
@pytest.mark.parametrize('''path'''			,  ['''paws''', '''csv''']						)
def     __lowerCamelCase						(			UpperCAmelCase_						:		Optional[int]			,  UpperCAmelCase_						:		Optional[Any]						):




      """simple docstring"""





      inspect_dataset(UpperCAmelCase_			,  UpperCAmelCase_						)
      a						:List[Any]										=	path + '''.py'''
      assert script_name in os.listdir(UpperCAmelCase_						)
      assert "__pycache__" not in os.listdir(UpperCAmelCase_						)
@pytest.mark.filterwarnings('''ignore:inspect_metric is deprecated:FutureWarning'''						)
@pytest.mark.filterwarnings('''ignore:metric_module_factory is deprecated:FutureWarning'''						)
@pytest.mark.parametrize('''path'''			,  ['''accuracy''']						)
def     __lowerCamelCase						(			UpperCAmelCase_						:		List[Any]			,  UpperCAmelCase_						:		Any						):




      """simple docstring"""





      inspect_metric(UpperCAmelCase_			,  UpperCAmelCase_						)
      a						:Dict										=	path + '''.py'''
      assert script_name in os.listdir(UpperCAmelCase_						)
      assert "__pycache__" not in os.listdir(UpperCAmelCase_						)
@pytest.mark.parametrize(
    '''path, config_name, expected_splits'''			,  [
        ('''squad''', '''plain_text''', ['''train''', '''validation''']),
        ('''dalle-mini/wit''', '''dalle-mini--wit''', ['''train''']),
        ('''paws''', '''labeled_final''', ['''train''', '''test''', '''validation''']),
    ]			,  )
def     __lowerCamelCase						(			UpperCAmelCase_						:		Optional[int]			,  UpperCAmelCase_						:		List[Any]			,  UpperCAmelCase_						:		str						):




      """simple docstring"""





      a						:List[str]										=	get_dataset_config_info(UpperCAmelCase_			,  config_name=UpperCAmelCase_						)
      assert info.config_name == config_name
      assert list(info.splits.keys()						) == expected_splits
@pytest.mark.parametrize(
    '''path, config_name, expected_exception'''			,  [
        ('''paws''', None, ValueError),
    ]			,  )
def     __lowerCamelCase						(			UpperCAmelCase_						:		List[Any]			,  UpperCAmelCase_						:		str			,  UpperCAmelCase_						:		Tuple						):




      """simple docstring"""





      with pytest.raises(UpperCAmelCase_						):
            get_dataset_config_info(UpperCAmelCase_			,  config_name=UpperCAmelCase_						)
@pytest.mark.parametrize(
    '''path, expected'''			,  [
        ('''squad''', '''plain_text'''),
        ('''acronym_identification''', '''default'''),
        ('''lhoestq/squad''', '''plain_text'''),
        ('''lhoestq/test''', '''default'''),
        ('''lhoestq/demo1''', '''lhoestq--demo1'''),
        ('''dalle-mini/wit''', '''dalle-mini--wit'''),
    ]			,  )
def     __lowerCamelCase						(			UpperCAmelCase_						:		Tuple			,  UpperCAmelCase_						:		int						):




      """simple docstring"""





      a						:List[str]										=	get_dataset_config_names(UpperCAmelCase_						)
      assert expected in config_names
@pytest.mark.parametrize(
    '''path, expected_configs, expected_splits_in_first_config'''			,  [
        ('''squad''', ['''plain_text'''], ['''train''', '''validation''']),
        ('''dalle-mini/wit''', ['''dalle-mini--wit'''], ['''train''']),
        ('''paws''', ['''labeled_final''', '''labeled_swap''', '''unlabeled_final'''], ['''train''', '''test''', '''validation''']),
    ]			,  )
def     __lowerCamelCase						(			UpperCAmelCase_						:		Tuple			,  UpperCAmelCase_						:		Tuple			,  UpperCAmelCase_						:		Optional[int]						):




      """simple docstring"""





      a						:Optional[int]										=	get_dataset_infos(UpperCAmelCase_						)
      assert list(infos.keys()						) == expected_configs
      a						:Union[str, Any]										=	expected_configs[0]
      assert expected_config in infos
      a						:List[Any]										=	infos[expected_config]
      assert info.config_name == expected_config
      assert list(info.splits.keys()						) == expected_splits_in_first_config
@pytest.mark.parametrize(
    '''path, expected_config, expected_splits'''			,  [
        ('''squad''', '''plain_text''', ['''train''', '''validation''']),
        ('''dalle-mini/wit''', '''dalle-mini--wit''', ['''train''']),
        ('''paws''', '''labeled_final''', ['''train''', '''test''', '''validation''']),
    ]			,  )
def     __lowerCamelCase						(			UpperCAmelCase_						:		Optional[int]			,  UpperCAmelCase_						:		Any			,  UpperCAmelCase_						:		Optional[int]						):




      """simple docstring"""





      a						:Union[str, Any]										=	get_dataset_infos(UpperCAmelCase_						)
      assert expected_config in infos
      a						:int										=	infos[expected_config]
      assert info.config_name == expected_config
      assert list(info.splits.keys()						) == expected_splits






@pytest.mark.parametrize(
    '''path, config_name, expected_exception'''			,  [
        ('''paws''', None, ValueError),
    ]			,  )
def     __lowerCamelCase						(			UpperCAmelCase_						:		Union[str, Any]			,  UpperCAmelCase_						:		Optional[int]			,  UpperCAmelCase_						:		str						):




      """simple docstring"""





      with pytest.raises(UpperCAmelCase_						):
            get_dataset_split_names(UpperCAmelCase_			,  config_name=UpperCAmelCase_						)





