



import logging
import os
import sys
from dataclasses import dataclass, field
from typing import Optional

import transformers
from transformers import (
    AutoConfig,
    AutoModelForQuestionAnswering,
    AutoTokenizer,
    DataCollatorWithPadding,
    HfArgumentParser,
    SquadDataset,
    Trainer,
    TrainingArguments,
)
from transformers import SquadDataTrainingArguments as DataTrainingArguments
from transformers.trainer_utils import is_main_process


lowerCamelCase__     =	logging.getLogger(__name__)






@dataclass
class 				SCREAMING_SNAKE_CASE     :
       __lowerCamelCase		:		Optional[int]      =field(
           metadata={'help': 'Path to pretrained model or model identifier from huggingface.co/models'}   )
       __lowerCamelCase		:		str      =field(
           default=UpperCAmelCase_     , metadata={'help': 'Pretrained config name or path if not the same as model_name'}   )
       __lowerCamelCase		:		int      =field(
           default=UpperCAmelCase_     , metadata={'help': 'Pretrained tokenizer name or path if not the same as model_name'}   )
       __lowerCamelCase		:		List[str]      =field(default=UpperCAmelCase_     , metadata={'help': 'Set this flag to use fast tokenization.'}   )
       # If you want to tweak more attributes on your tokenizer, you should do it in a distinct script,
       # or just modify its tokenizer_config.json.
       __lowerCamelCase		:		Optional[int]      =field(
           default=UpperCAmelCase_     , metadata={'help': 'Where do you want to store the pretrained models downloaded from huggingface.co'}     , )



def 					lowerCAmelCase__  (							):
    """simple docstring"""







    __a					       =						HfArgumentParser((ModelArguments, DataTrainingArguments, TrainingArguments)      )

    if len(sys.argv      ) == 2 and sys.argv[1].endswith(""".json"""      ):
        # If we pass only one argument to the script and it's the path to a json file,
        # let's parse it to get our arguments.
        __a       ,   __a       ,   __a					       =						parser.parse_json_file(json_file=os.path.abspath(sys.argv[1]      )      )
    else:
        __a       ,   __a       ,   __a					       =						parser.parse_args_into_dataclasses()

    if (
        os.path.exists(training_args.output_dir      )
        and os.listdir(training_args.output_dir      )
        and training_args.do_train
        and not training_args.overwrite_output_dir
    ):
        raise ValueError(
            f"Output directory ({training_args.output_dir}) already exists and is not empty. Use"
            """ --overwrite_output_dir to overcome."""      )

    # Setup logging
    logging.basicConfig(
        format="""%(asctime)s - %(levelname)s - %(name)s - %(message)s"""			,       datefmt="""%m/%d/%Y %H:%M:%S"""			,       level=logging.INFO if training_args.local_rank in [-1, 0] else logging.WARN			,       )
    logger.warning(
        """Process rank: %s, device: %s, n_gpu: %s, distributed training: %s, 16-bits training: %s"""			,       training_args.local_rank			,       training_args.device			,       training_args.n_gpu			,       bool(training_args.local_rank != -1      )			,       training_args.fpaa			,       )
    # Set the verbosity to info of the Transformers logger (on main process only):
    if is_main_process(training_args.local_rank      ):
        transformers.utils.logging.set_verbosity_info()
        transformers.utils.logging.enable_default_handler()
        transformers.utils.logging.enable_explicit_format()
    logger.info("""Training/evaluation parameters %s"""			,       lowercase_      )

    # Prepare Question-Answering task
    # Load pretrained model and tokenizer
    #
    # Distributed training:
    # The .from_pretrained methods guarantee that only one local process can concurrently
    # download model & vocab.

    __a					       =						AutoConfig.from_pretrained(
        model_args.config_name if model_args.config_name else model_args.model_name_or_path			,       cache_dir=model_args.cache_dir			,       )
    __a					       =						AutoTokenizer.from_pretrained(
        model_args.tokenizer_name if model_args.tokenizer_name else model_args.model_name_or_path			,       cache_dir=model_args.cache_dir			,       use_fast=lowercase_			,       )
    __a					       =						AutoModelForQuestionAnswering.from_pretrained(
        model_args.model_name_or_path			,       from_tf=bool(""".ckpt""" in model_args.model_name_or_path      )			,       config=lowercase_			,       cache_dir=model_args.cache_dir			,       )

    # Get datasets
    __a					       =						hasattr(model.config			,       """lang2id"""      )
    __a					       =						(
        SquadDataset(
            lowercase_			,       tokenizer=lowercase_			,       is_language_sensitive=lowercase_			,       cache_dir=model_args.cache_dir      )
        if training_args.do_train
        else None
    )
    __a					       =						(
        SquadDataset(
            lowercase_			,       tokenizer=lowercase_			,       mode="""dev"""			,       is_language_sensitive=lowercase_			,       cache_dir=model_args.cache_dir			,       )
        if training_args.do_eval
        else None
    )

    # Data collator
    __a					       =						DataCollatorWithPadding(lowercase_			,       pad_to_multiple_of=8      ) if training_args.fpaa else None

    # Initialize our Trainer
    __a					       =						Trainer(
        model=lowercase_			,       args=lowercase_			,       train_dataset=lowercase_			,       eval_dataset=lowercase_			,       data_collator=lowercase_			,       )

    # Training
    if training_args.do_train:
        trainer.train(
            model_path=model_args.model_name_or_path if os.path.isdir(model_args.model_name_or_path      ) else None      )
        trainer.save_model()
        # For convenience, we also re-save the tokenizer to the same directory,
        # so that you can share your model easily on huggingface.co/models =)
        if trainer.is_world_master():
            tokenizer.save_pretrained(training_args.output_dir      )

def 					lowerCAmelCase__  (							_SCREAMING_SNAKE_CASE    :     Optional[int]      ):
    """simple docstring"""







    main()


if __name__ == "__main__":
      main()





import copy

from ...configuration_utils import PretrainedConfig
from ...utils import logging


lowerCamelCase__     =	logging.get_logger(__name__)

lowerCamelCase__     =	{
    """facebook/sam-vit-huge""": """https://huggingface.co/facebook/sam-vit-huge/resolve/main/config.json""",
    """facebook/sam-vit-large""": """https://huggingface.co/facebook/sam-vit-large/resolve/main/config.json""",
    """facebook/sam-vit-base""": """https://huggingface.co/facebook/sam-vit-base/resolve/main/config.json""",
}






class 				SCREAMING_SNAKE_CASE     (							lowerCamelCase__   ):





							def __init__(				self						:						List[Any] ,			__lowercase						:						Optional[Any]=256 ,			__lowercase						:						Optional[int]=1024 ,			__lowercase						:						Any=16 ,			__lowercase						:						Optional[Any]=16 ,			__lowercase						:						Optional[Any]=4 ,			__lowercase						:						Optional[int]="gelu" ,			__lowercase						:						List[Any]=1E-6 ,			**__lowercase						:						str ,			):

											'''simple docstring'''
											super().__init__(**__lowercase		)
											__a					       =						hidden_size
											__a					       =						image_size
											__a					       =						patch_size
											__a					       =						image_size // patch_size
											__a					       =						mask_input_channels
											__a					       =						num_point_embeddings
											__a					       =						hidden_act
											__a					       =						layer_norm_eps






class 				SCREAMING_SNAKE_CASE     (							lowerCamelCase__   ):





							def __init__(				self						:						int ,			__lowercase						:						Tuple=256 ,			__lowercase						:						List[Any]="relu" ,			__lowercase						:						Any=2048 ,			__lowercase						:						List[Any]=2 ,			__lowercase						:						List[str]=8 ,			__lowercase						:						Any=2 ,			__lowercase						:						List[Any]=3 ,			__lowercase						:						str=3 ,			__lowercase						:						str=256 ,			__lowercase						:						Optional[Any]=1E-6 ,			**__lowercase						:						Tuple ,			):

											'''simple docstring'''
											super().__init__(**__lowercase		)
											__a					       =						hidden_size
											__a					       =						hidden_act
											__a					       =						mlp_dim
											__a					       =						num_hidden_layers
											__a					       =						num_attention_heads
											__a					       =						attention_downsample_rate
											__a					       =						num_multimask_outputs
											__a					       =						iou_head_depth
											__a					       =						iou_head_hidden_dim
											__a					       =						layer_norm_eps






class 				SCREAMING_SNAKE_CASE     (							lowerCamelCase__   ):





							def __init__(				self						:						List[Any] ,			__lowercase						:						List[Any]=768 ,			__lowercase						:						List[Any]=256 ,			__lowercase						:						Any=12 ,			__lowercase						:						Tuple=12 ,			__lowercase						:						Union[str, Any]=3 ,			__lowercase						:						Tuple=1024 ,			__lowercase						:						Any=16 ,			__lowercase						:						Dict="gelu" ,			__lowercase						:						List[Any]=1E-06 ,			__lowercase						:						List[str]=0.0 ,			__lowercase						:						Optional[Any]=1E-10 ,			__lowercase						:						Optional[Any]=True ,			__lowercase						:						str=4.0 ,			__lowercase						:						List[Any]=True ,			__lowercase						:						Dict=True ,			__lowercase						:						Optional[Any]=14 ,			__lowercase						:						Optional[int]=[2, 5, 8, 11] ,			__lowercase						:						List[str]=128 ,			__lowercase						:						Optional[int]=None ,			**__lowercase						:						List[Any] ,			):

											'''simple docstring'''
											super().__init__(**__lowercase		)

											__a					       =						hidden_size
											__a					       =						output_channels
											__a					       =						num_hidden_layers
											__a					       =						num_attention_heads
											__a					       =						num_channels
											__a					       =						image_size
											__a					       =						patch_size
											__a					       =						hidden_act
											__a					       =						layer_norm_eps
											__a					       =						attention_dropout
											__a					       =						initializer_range
											__a					       =						qkv_bias
											__a					       =						mlp_ratio
											__a					       =						use_abs_pos
											__a					       =						use_rel_pos
											__a					       =						window_size
											__a					       =						global_attn_indexes
											__a					       =						num_pos_feats
											__a					       =						int(hidden_size * mlp_ratio		) if mlp_dim is None else mlp_dim






class 				SCREAMING_SNAKE_CASE     (							lowerCamelCase__   ):
							__lowerCamelCase		:		Dict      ='sam'
							__lowerCamelCase		:		Any      =True





							def __init__(				self						:						List[str] ,			__lowercase						:						List[str]=None ,			__lowercase						:						Optional[int]=None ,			__lowercase						:						Dict=None ,			__lowercase						:						Optional[int]=0.02 ,			**__lowercase						:						List[str] ,			):

											'''simple docstring'''
											super().__init__(**__lowercase		)
											__a					       =						vision_config if vision_config is not None else {}
											__a					       =						prompt_encoder_config if prompt_encoder_config is not None else {}
											__a					       =						mask_decoder_config if mask_decoder_config is not None else {}

											if isinstance(__lowercase ,			__lowercase		):
															__a					       =						vision_config.to_dict()
											if isinstance(__lowercase ,			__lowercase		):
															__a					       =						prompt_encoder_config.to_dict()
											if isinstance(__lowercase ,			__lowercase		):
															__a					       =						mask_decoder_config.to_dict()

											__a					       =						SamVisionConfig(**__lowercase		)
											__a					       =						SamPromptEncoderConfig(**__lowercase		)
											__a					       =						SamMaskDecoderConfig(**__lowercase		)
											__a					       =						initializer_range







							def   UpperCamelCase_   (				self						:						Union[str, Any]		):

											'''simple docstring'''
											__a					       =						copy.deepcopy(self.__dict__		)
											__a					       =						self.vision_config.to_dict()
											__a					       =						self.prompt_encoder_config.to_dict()
											__a					       =						self.mask_decoder_config.to_dict()
											__a					       =						self.__class__.model_type
											return output
