




"""simple docstring"""

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 						_snake_case					( )   -> Optional[Any]:






      '''simple docstring'''


      _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 						_snake_case					( _snake_case							: int							)   -> Optional[int]:






      '''simple docstring'''


      _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 						_snake_case					( _snake_case							: List[Any]    ,  _snake_case							: List[str]    ,  _snake_case							: str							)   -> List[Any]:






      '''simple docstring'''


      _A        =       dct.pop(__UpperCAmelCase							)
      _A        =       val






def 						_snake_case					( _snake_case							: List[Any]    ,  _snake_case							: str							)   -> str:






      '''simple docstring'''


      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 						_snake_case					( _snake_case							: List[str]    ,  _snake_case							: str							)   -> Union[str, Any]:






      '''simple docstring'''


      _A        =       3_64 if '''coco''' in model_name else 2_24
      _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 						_snake_case					( _snake_case							: List[Any]    ,  _snake_case							: Optional[int]=None    ,  _snake_case							: List[Any]=False							)   -> int:






      '''simple docstring'''


      _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        =       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        =       model_name_to_original[model_name]

      # load original model
      print('Loading original model...'							)
      _A        =       '''cuda''' if torch.cuda.is_available() else '''cpu'''
      _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        =       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_00							)
                  _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.58_50, -4.4440, -8.9922], [-47.43_22, -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.01_09, -9.8967, -12.62_80], [-68.65_78, -12.71_91, -10.50_65]]    ,  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=30    ,  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__":
       a     =      argparse.ArgumentParser()
       a     =      [
           '''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''',
       )

       a     =      parser.parse_args()

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







"""simple docstring"""

import inspect
import os
import unittest
from pathlib import Path

import torch

import accelerate
from accelerate.test_utils import execute_subprocess_async
from accelerate.test_utils.testing import run_command





class     lowercase_	(					unittest.TestCase							):



 '''simple docstring'''
 UpperCAmelCase   :					str				  =     inspect.getfile(accelerate.test_utils							)
 UpperCAmelCase   :					Optional[Any]				  =     os.path.sep.join(mod_file.split(os.path.sep							)[:-1] + ['''scripts''', '''test_cli.py''']							)

 UpperCAmelCase   :					List[Any]				  =     ['''accelerate''', '''launch''']
 UpperCAmelCase   :					Dict				  =     Path.home() / '''.cache/huggingface/accelerate'''
 UpperCAmelCase   :					Union[str, Any]				  =     '''default_config.yaml'''
 UpperCAmelCase   :					Union[str, Any]				  =     config_folder / config_file
 UpperCAmelCase   :					Union[str, Any]				  =     config_folder / '''_default_config.yaml'''

 UpperCAmelCase   :					List[Any]				  =     Path('''tests/test_configs'''							)

 @classmethod
 def       lowerCAmelCase_							(			cls	:	List[Any]		):
       if cls.config_path.is_file():
             cls.config_path.rename(cls.changed_path		)

 @classmethod
 def       lowerCAmelCase_							(			cls	:	Tuple		):
       if cls.changed_path.is_file():
             cls.changed_path.rename(cls.config_path		)

 def       lowerCAmelCase_							(			self	:	List[Any]		):
       _A        =       self.base_cmd
       if torch.cuda.is_available() and (torch.cuda.device_count() > 1):
             cmd += ["--multi_gpu"]
       execute_subprocess_async(cmd + [self.test_file_path]   ,							env=os.environ.copy()		)

 def       lowerCAmelCase_							(			self	:	Optional[int]		):
       for config in sorted(self.test_config_path.glob('**/*.yaml'		)		):
             with self.subTest(config_file=_UpperCAmelCase		):
                   execute_subprocess_async(
                       self.base_cmd + ['--config_file', str(_UpperCAmelCase		), self.test_file_path]   ,							env=os.environ.copy()		)



 def       lowerCAmelCase_							(			self	:	Any		):
       execute_subprocess_async(['accelerate', 'test']   ,							env=os.environ.copy()		)





class     lowercase_	(					unittest.TestCase							):



 '''simple docstring'''
 UpperCAmelCase   :					Dict				  =     '''test-tpu'''
 UpperCAmelCase   :					Optional[int]				  =     '''us-central1-a'''
 UpperCAmelCase   :					List[str]				  =     '''ls'''
 UpperCAmelCase   :					str				  =     ['''accelerate''', '''tpu-config''']
 UpperCAmelCase   :					Optional[Any]				  =     '''cd /usr/share'''
 UpperCAmelCase   :					Optional[Any]				  =     '''tests/test_samples/test_command_file.sh'''
 UpperCAmelCase   :					str				  =     '''Running gcloud compute tpus tpu-vm ssh'''

 def       lowerCAmelCase_							(			self	:	Any		):
       _A        =       run_command(
           self.cmd
           + ['--command', self.command, '--tpu_zone', self.tpu_zone, '--tpu_name', self.tpu_name, '--debug']   ,							return_stdout=_UpperCAmelCase   ,							)
       self.assertIn(
           F'''{self.gcloud} test-tpu --zone us-central1-a --command {self.base_output}; ls --worker all'''   ,							_UpperCAmelCase   ,							)

 def       lowerCAmelCase_							(			self	:	Dict		):
       _A        =       run_command(
           self.cmd
           + [
               '--config_file',
               'tests/test_configs/0_12_0.yaml',
               '--command',
               self.command,
               '--tpu_zone',
               self.tpu_zone,
               '--tpu_name',
               self.tpu_name,
               '--debug',
           ]   ,							return_stdout=_UpperCAmelCase   ,							)
       self.assertIn(
           F'''{self.gcloud} test-tpu --zone us-central1-a --command {self.base_output}; ls --worker all'''   ,							_UpperCAmelCase   ,							)

 def       lowerCAmelCase_							(			self	:	Optional[int]		):
       _A        =       run_command(
           self.cmd + ['--config_file', 'tests/test_configs/latest.yaml', '--debug']   ,							return_stdout=_UpperCAmelCase		)
       self.assertIn(
           F'''{self.gcloud} test-tpu --zone us-central1-a --command {self.base_output}; echo "hello world"; echo "this is a second command" --worker all'''   ,							_UpperCAmelCase   ,							)

 def       lowerCAmelCase_							(			self	:	str		):
       _A        =       run_command(
           self.cmd + ['--config_file', 'tests/test_configs/latest.yaml', '--command', self.command, '--debug']   ,							return_stdout=_UpperCAmelCase   ,							)
       self.assertIn(
           F'''{self.gcloud} test-tpu --zone us-central1-a --command {self.base_output}; ls --worker all'''   ,							_UpperCAmelCase   ,							)

 def       lowerCAmelCase_							(			self	:	List[str]		):
       _A        =       run_command(
           self.cmd
           + [
               '--config_file',
               'tests/test_configs/latest.yaml',
               '--command',
               self.command,
               '--command',
               'echo "Hello World"',
               '--debug',
           ]   ,							return_stdout=_UpperCAmelCase   ,							)
       self.assertIn(
           F'''{self.gcloud} test-tpu --zone us-central1-a --command {self.base_output}; ls; echo "Hello World" --worker all'''   ,							_UpperCAmelCase   ,							)

 def       lowerCAmelCase_							(			self	:	str		):
       _A        =       run_command(
           self.cmd
           + ['--config_file', 'tests/test_configs/latest.yaml', '--command_file', self.command_file, '--debug']   ,							return_stdout=_UpperCAmelCase   ,							)
       self.assertIn(
           F'''{self.gcloud} test-tpu --zone us-central1-a --command {self.base_output}; echo "hello world"; echo "this is a second command" --worker all'''   ,							_UpperCAmelCase   ,							)

 def       lowerCAmelCase_							(			self	:	List[Any]		):
       _A        =       run_command(
           self.cmd
           + [
               '--config_file',
               'tests/test_configs/0_12_0.yaml',
               '--command_file',
               self.command_file,
               '--tpu_zone',
               self.tpu_zone,
               '--tpu_name',
               self.tpu_name,
               '--debug',
           ]   ,							return_stdout=_UpperCAmelCase   ,							)
       self.assertIn(
           F'''{self.gcloud} test-tpu --zone us-central1-a --command {self.base_output}; echo "hello world"; echo "this is a second command" --worker all'''   ,							_UpperCAmelCase   ,							)

 def       lowerCAmelCase_							(			self	:	int		):
       _A        =       run_command(
           self.cmd + ['--config_file', 'tests/test_configs/latest.yaml', '--install_accelerate', '--debug']   ,							return_stdout=_UpperCAmelCase   ,							)
       self.assertIn(
           F'''{self.gcloud} test-tpu --zone us-central1-a --command {self.base_output}; pip install accelerate -U; echo "hello world"; echo "this is a second command" --worker all'''   ,							_UpperCAmelCase   ,							)



 def       lowerCAmelCase_							(			self	:	Optional[int]		):
       _A        =       run_command(
           self.cmd
           + [
               '--config_file',
               'tests/test_configs/latest.yaml',
               '--install_accelerate',
               '--accelerate_version',
               '12.0.0',
               '--debug',
           ]   ,							return_stdout=_UpperCAmelCase   ,							)
       self.assertIn(
           F'''{self.gcloud} test-tpu --zone us-central1-a --command {self.base_output}; pip install accelerate==12.0.0; echo "hello world"; echo "this is a second command" --worker all'''   ,							_UpperCAmelCase   ,							)

