
from ...processing_utils import ProcessorMixin
from ...tokenization_utils_base import BatchEncoding





class       __A(				lowerCamelCase_       ):
					SCREAMING_SNAKE_CASE			    =    ["image_processor", "tokenizer"]
					SCREAMING_SNAKE_CASE			    =    "AutoImageProcessor"
					SCREAMING_SNAKE_CASE			    =    "AutoTokenizer"

					def __init__(	self					:     Optional[int]   ,					__UpperCamelCase					:     Union[str, Any]   ,					__UpperCamelCase					:     int   ):
												super().__init__(UpperCamelCase__   ,					UpperCamelCase__   )
												lowerCamelCase_							  =					self.image_processor

					def __call__(	self					:     Optional[int]   ,					__UpperCamelCase					:     Tuple=None   ,					__UpperCamelCase					:     Union[str, Any]=None   ,					__UpperCamelCase					:     Union[str, Any]=None   ,					**__UpperCamelCase					:     Tuple   ):





												if text is None and images is None:
																			raise ValueError("""You have to specify either text or images. Both cannot be none."""   )

												if text is not None:
																			lowerCamelCase_							  =					self.tokenizer(UpperCamelCase__   ,					return_tensors=UpperCamelCase__   ,					**UpperCamelCase__   )

												if images is not None:
																			lowerCamelCase_							  =					self.image_processor(UpperCamelCase__   ,					return_tensors=UpperCamelCase__   ,					**UpperCamelCase__   )

												if text is not None and images is not None:
																			lowerCamelCase_							  =					image_features.pixel_values
																			return encoding
												elif text is not None:
																			return encoding
												else:
																			return BatchEncoding(data=dict(**UpperCamelCase__   )   ,					tensor_type=UpperCamelCase__   )

					def    lowercase__      (	self					:     List[str]   ,					*__UpperCamelCase					:     str   ,					**__UpperCamelCase					:     Union[str, Any]   ):
												return self.tokenizer.batch_decode(*UpperCamelCase__   ,					**UpperCamelCase__   )

					def    lowercase__      (	self					:     List[str]   ,					*__UpperCamelCase					:     Any   ,					**__UpperCamelCase					:     str   ):
												return self.tokenizer.decode(*UpperCamelCase__   ,					**UpperCamelCase__   )



					@property
					def    lowercase__      (	self					:     Optional[Any]   ):
												return ["input_ids", "attention_mask", "pixel_values"]







import os
import socket
from contextlib import contextmanager

import torch

from ..commands.config.default import write_basic_config  # noqa: F401
from ..state import PartialState
from .dataclasses import DistributedType
from .imports import is_deepspeed_available, is_tpu_available
from .transformer_engine import convert_model
from .versions import is_torch_version


if is_deepspeed_available():
		from deepspeed import DeepSpeedEngine

if is_tpu_available(check_device=False):
		import torch_xla.core.xla_model as xm



def      __lowerCAmelCase						(							UpperCAmelCase__				:      Any       )  ->    List[str]:
							if is_torch_version("""<"""			,				"""2.0.0"""       ) or not hasattr(UpperCAmelCase__			,				"""_dynamo"""       ):
														return False
							return isinstance(UpperCAmelCase__			,				torch._dynamo.eval_frame.OptimizedModule       )



def      __lowerCAmelCase						(							UpperCAmelCase__				:      str			,				UpperCAmelCase__				:      bool = True       )  ->    str:
							lowerCamelCase_							  =					(torch.nn.parallel.DistributedDataParallel, torch.nn.DataParallel)

							lowerCamelCase_							  =					is_compiled_module(UpperCAmelCase__       )
							if is_compiled:
														lowerCamelCase_							  =					model
														lowerCamelCase_							  =					model._orig_mod

							if is_deepspeed_available():
														options += (DeepSpeedEngine,)

							while isinstance(UpperCAmelCase__			,				UpperCAmelCase__       ):
														lowerCamelCase_							  =					model.module

							if not keep_fpaa_wrapper:
														lowerCamelCase_							  =					getattr(UpperCAmelCase__			,				"""forward"""       )
														lowerCamelCase_							  =					model.__dict__.pop("""_original_forward"""			,				UpperCAmelCase__       )
														if original_forward is not None:
																					while hasattr(UpperCAmelCase__			,				"""__wrapped__"""       ):
																												lowerCamelCase_							  =					forward.__wrapped__
																												if forward == original_forward:
																																			break
																					lowerCamelCase_							  =					forward
														if getattr(UpperCAmelCase__			,				"""_converted_to_transformer_engine"""			,				UpperCAmelCase__       ):
																					convert_model(UpperCAmelCase__			,				to_transformer_engine=UpperCAmelCase__       )

							if is_compiled:
														lowerCamelCase_							  =					model
														lowerCamelCase_							  =					compiled_model

							return model



def      __lowerCAmelCase						(							)  ->    Any:
							PartialState().wait_for_everyone()



def      __lowerCAmelCase						(							UpperCAmelCase__				:      Union[str, Any]			,				UpperCAmelCase__				:      Tuple       )  ->    Dict:
							if PartialState().distributed_type == DistributedType.TPU:
														xm.save(UpperCAmelCase__			,				UpperCAmelCase__       )
							elif PartialState().local_process_index == 0:
														torch.save(UpperCAmelCase__			,				UpperCAmelCase__       )



@contextmanager
def      __lowerCAmelCase						(							**UpperCAmelCase__				:      Any       )  ->    Dict:
							for key, value in kwargs.items():
														lowerCamelCase_							  =					str(UpperCAmelCase__       )

							yield

							for key in kwargs:
														if key.upper() in os.environ:
																					del os.environ[key.upper()]



def      __lowerCAmelCase						(							UpperCAmelCase__				:      Union[str, Any]       )  ->    str:
							if not hasattr(UpperCAmelCase__			,				"""__qualname__"""       ) and not hasattr(UpperCAmelCase__			,				"""__name__"""       ):
														lowerCamelCase_							  =					getattr(UpperCAmelCase__			,				"""__class__"""			,				UpperCAmelCase__       )
							if hasattr(UpperCAmelCase__			,				"""__qualname__"""       ):
														return obj.__qualname__
							if hasattr(UpperCAmelCase__			,				"""__name__"""       ):
														return obj.__name__
							return str(UpperCAmelCase__       )



def      __lowerCAmelCase						(							UpperCAmelCase__				:      str			,				UpperCAmelCase__				:      Union[str, Any]       )  ->    Dict:
							for key, value in source.items():
														if isinstance(UpperCAmelCase__			,				UpperCAmelCase__       ):
																					lowerCamelCase_							  =					destination.setdefault(UpperCAmelCase__			,				{}       )
																					merge_dicts(UpperCAmelCase__			,				UpperCAmelCase__       )
														else:
																					lowerCamelCase_							  =					value

							return destination



def      __lowerCAmelCase						(							UpperCAmelCase__				:      int = None       )  ->    bool:
							if port is None:
														lowerCamelCase_							  =					2_9_5_0_0
							with socket.socket(socket.AF_INET			,				socket.SOCK_STREAM       ) as s:
														return s.connect_ex(("""localhost""", port)       ) == 0





