from typing import TYPE_CHECKING

from ...utils import OptionalDependencyNotAvailable, _LazyModule, is_torch_available, is_vision_available


UpperCAmelCase							= {
    '''configuration_flava''': [
        '''FLAVA_PRETRAINED_CONFIG_ARCHIVE_MAP''',
        '''FlavaConfig''',
        '''FlavaImageCodebookConfig''',
        '''FlavaImageConfig''',
        '''FlavaMultimodalConfig''',
        '''FlavaTextConfig''',
    ],
}

try:
 if not is_vision_available():
  raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
 pass
else:
 UpperCAmelCase							= ['''FlavaFeatureExtractor''']
 UpperCAmelCase							= ['''FlavaImageProcessor''']
 UpperCAmelCase							= ['''FlavaProcessor''']

try:
 if not is_torch_available():
  raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
 pass
else:
 UpperCAmelCase							= [
     '''FLAVA_PRETRAINED_MODEL_ARCHIVE_LIST''',
     '''FlavaForPreTraining''',
     '''FlavaImageCodebook''',
     '''FlavaImageModel''',
     '''FlavaModel''',
     '''FlavaMultimodalModel''',
     '''FlavaPreTrainedModel''',
     '''FlavaTextModel''',
 ]

if TYPE_CHECKING:
 from .configuration_flava import (
     FLAVA_PRETRAINED_CONFIG_ARCHIVE_MAP,
     FlavaConfig,
     FlavaImageCodebookConfig,
     FlavaImageConfig,
     FlavaMultimodalConfig,
     FlavaTextConfig,
 )

 try:
  if not is_vision_available():
   raise OptionalDependencyNotAvailable()
 except OptionalDependencyNotAvailable:
  pass
 else:
  from .feature_extraction_flava import FlavaFeatureExtractor
  from .image_processing_flava import FlavaImageProcessor
  from .processing_flava import FlavaProcessor

 try:
  if not is_torch_available():
   raise OptionalDependencyNotAvailable()
 except OptionalDependencyNotAvailable:
  pass
 else:
  from .modeling_flava import (
      FLAVA_PRETRAINED_MODEL_ARCHIVE_LIST,
      FlavaForPreTraining,
      FlavaImageCodebook,
      FlavaImageModel,
      FlavaModel,
      FlavaMultimodalModel,
      FlavaPreTrainedModel,
      FlavaTextModel,
  )

else:
 import sys

 UpperCAmelCase							= _LazyModule(__name__, globals()['''__file__'''], _import_structure, module_spec=__spec__)




import os
from pathlib import Path
from typing import Dict, List

import fire
import torch

from transformers import AutoModelForSeqaSeqLM, AutoTokenizer
from transformers.utils.logging import get_logger


UpperCAmelCase							= get_logger(__name__)


def SCREAMING_SNAKE_CASE (   lowercase_:		str						,  lowercase_:		str ):
       if text.startswith(lowercase_ ):
              return text[len(lowercase_ ) :]
       return text  # or whatever


def SCREAMING_SNAKE_CASE (   lowercase_:		Union[str, Any] ):
       return {remove_prefix(lowercase_						,  'model.' ): v for k, v in sd.items()}


def SCREAMING_SNAKE_CASE (   lowercase_:		List[Dict[str, torch.Tensor]] ):
       _UpperCamelCase   :				Union[str, Any]       =     {}
       for k in state_dicts[0].keys():
              _UpperCamelCase   :				Tuple       =     [sd[k] for sd in state_dicts]
              _UpperCamelCase   :				str       =     sum(lowercase_ ) / len(lowercase_ )
              assert isinstance(lowercase_						,  torch.Tensor )
              _UpperCamelCase   :				Dict       =     new_t
       return new_sd


def SCREAMING_SNAKE_CASE (   lowercase_:		str						,  lowercase_:		str						,  lowercase_:		str ):
       _UpperCamelCase   :				Optional[Any]       =     AutoModelForSeqaSeqLM.from_pretrained(lowercase_ )
       if os.path.isfile(lowercase_ ):
              _UpperCamelCase   :				Any       =     [pl_ckpt_path]
       else:
              assert os.path.isdir(lowercase_ )
              _UpperCamelCase   :				str       =     list(Path(lowercase_ ).glob('*.ckpt' ) )
              assert ckpt_files, F"could not find any ckpt files inside the {pl_ckpt_path} directory"

       if len(lowercase_ ) > 1:
              logger.info(F"averaging the weights of {ckpt_files}" )

       _UpperCamelCase   :				Tuple       =     [sanitize(torch.load(lowercase_						,  map_location='cpu' )['state_dict'] ) for x in ckpt_files]
       _UpperCamelCase   :				Optional[Any]       =     average_state_dicts(lowercase_ )

       _UpperCamelCase  ,					_UpperCamelCase   :				Tuple       =     hf_model.load_state_dict(lowercase_						,  strict=lowercase_ )
       assert not missing, F"missing keys: {missing}"
       hf_model.save_pretrained(lowercase_ )
       try:
              _UpperCamelCase   :				str       =     AutoTokenizer.from_pretrained(lowercase_ )
              tok.save_pretrained(lowercase_ )
       except Exception:
              pass
              # dont copy tokenizer if cant


if __name__ == "__main__":
 fire.Fire(convert_pl_to_hf)



