


from collections import UserDict
from typing import Union

import numpy as np
import requests

from ..utils import (
    add_end_docstrings,
    logging,
)
from .audio_classification import ffmpeg_read
from .base import PIPELINE_INIT_ARGS, Pipeline


__UpperCamelCase    		=       logging.get_logger(__name__)







@add_end_docstrings(UpperCAmelCase      )
class        lowerCamelCase__	(							UpperCAmelCase      ):






			"""simple docstring"""






			def __init__(							self      ,						**snake_case     ):

						'''simple docstring'''


						super().__init__(**snake_case     )

						if self.framework != "pt":
									raise ValueError(F'''The {self.__class__} is only available in PyTorch.'''     )
						# No specific FOR_XXX available yet




			def __call__(							self      ,						snake_case      ,						**snake_case     ):

						'''simple docstring'''


						return super().__call__(snake_case      ,						**snake_case     )




			def 				snake_case__				(							self      ,						**snake_case     ):

						'''simple docstring'''


						UpperCamelCase__					=       {}
						if "candidate_labels" in kwargs:
									UpperCamelCase__					=       kwargs["candidate_labels"]
						if "hypothesis_template" in kwargs:
									UpperCamelCase__					=       kwargs["hypothesis_template"]

						return preprocess_params, {}, {}




			def 				snake_case__				(							self      ,						snake_case      ,						snake_case=None      ,						snake_case="This is a sound of {}."     ):

						'''simple docstring'''


						if isinstance(snake_case      ,						snake_case     ):
									if audio.startswith("http://"     ) or audio.startswith("https://"     ):
												# We need to actually check for a real protocol, otherwise it's impossible to use a local file
												# like http_huggingface_co.png
												UpperCamelCase__					=       requests.get(snake_case     ).content
									else:
												with open(snake_case      ,						"rb"     ) as f:
															UpperCamelCase__					=       f.read()

						if isinstance(snake_case      ,						snake_case     ):
									UpperCamelCase__					=       ffmpeg_read(snake_case      ,						self.feature_extractor.sampling_rate     )

						if not isinstance(snake_case      ,						np.ndarray     ):
									raise ValueError("We expect a numpy ndarray as input"     )
						if len(audio.shape     ) != 1:
									raise ValueError("We expect a single channel audio input for ZeroShotAudioClassificationPipeline"     )

						UpperCamelCase__					=       self.feature_extractor(
						    [audio]      ,						sampling_rate=self.feature_extractor.sampling_rate      ,						return_tensors="pt"     )
						UpperCamelCase__					=       candidate_labels
						UpperCamelCase__					=       [hypothesis_template.format(snake_case     ) for x in candidate_labels]
						UpperCamelCase__					=       self.tokenizer(snake_case      ,						return_tensors=self.framework      ,						padding=snake_case     )
						UpperCamelCase__					=       [text_inputs]
						return inputs




			def 				snake_case__				(							self      ,						snake_case     ):

						'''simple docstring'''


						UpperCamelCase__					=       model_inputs.pop("candidate_labels"     )
						UpperCamelCase__					=       model_inputs.pop("text_inputs"     )
						if isinstance(text_inputs[0]      ,						snake_case     ):
									UpperCamelCase__					=       text_inputs[0]
						else:
									# Batching case.
									UpperCamelCase__					=       text_inputs[0][0]

						UpperCamelCase__					=       self.model(**snake_case      ,						**snake_case     )

						UpperCamelCase__					=       {
						    "candidate_labels": candidate_labels,
						    "logits": outputs.logits_per_audio,
						}
						return model_outputs







			def 				snake_case__				(							self      ,						snake_case     ):

						'''simple docstring'''


						UpperCamelCase__					=       model_outputs.pop("candidate_labels"     )
						UpperCamelCase__					=       model_outputs["logits"][0]

						if self.framework == "pt":
									UpperCamelCase__					=       logits.softmax(dim=0     )
									UpperCamelCase__					=       probs.tolist()
						else:
									raise ValueError("`tf` framework not supported."     )

						UpperCamelCase__					=       [
						    {"score": score, "label": candidate_label}
						    for score, candidate_label in sorted(zip(snake_case      ,						snake_case     )      ,						key=lambda snake_case     : -x[0]     )
						]
						return result






import importlib.util
import json
import os
import warnings
from dataclasses import dataclass, field

import torch

from ..training_args import TrainingArguments
from ..utils import cached_property, is_sagemaker_dp_enabled, logging


__UpperCamelCase    		=       logging.get_logger(__name__)
def        UpperCamelCase_(				)->		Any:
			# Get the sagemaker specific mp parameters from smp_options variable.
			UpperCamelCase__					=       os.getenv("SM_HP_MP_PARAMETERS"				,     "{}"  )
			try:
						# Parse it and check the field "partitions" is included, it is required for model parallel.
						UpperCamelCase__					=       json.loads(_A  )
						if "partitions" not in smp_options:
									return False
			except json.JSONDecodeError:
						return False

			# Get the sagemaker specific framework parameters from mpi_options variable.
			UpperCamelCase__					=       os.getenv("SM_FRAMEWORK_PARAMS"				,     "{}"  )
			try:
						# Parse it and check the field "sagemaker_distributed_dataparallel_enabled".
						UpperCamelCase__					=       json.loads(_A  )
						if not mpi_options.get("sagemaker_mpi_enabled"				,     _A  ):
									return False
			except json.JSONDecodeError:
						return False
			# Lastly, check if the `smdistributed` module is present.
			return importlib.util.find_spec("smdistributed"  ) is not None


if is_sagemaker_model_parallel_available():
						import smdistributed.modelparallel.torch as smp

						smp.init()







@dataclass
class        lowerCamelCase__	(							UpperCAmelCase      ):






			"""simple docstring"""






			_UpperCamelCase		:					str    =		field(
			    default=''					,	metadata={'help': 'Used by the SageMaker launcher to send mp-specific args. Ignored in SageMakerTrainer'}					,	)




			def 				snake_case__				(							self     ):

						'''simple docstring'''


						super().__post_init__()
						warnings.warn(
						    "`SageMakerTrainingArguments` is deprecated and will be removed in v5 of Transformers. You can use "
						    "`TrainingArguments` instead."      ,						snake_case      ,						)




			@cached_property
			def 				snake_case__				(							self     ):

						'''simple docstring'''


						logger.info("PyTorch: setting up devices"     )
						if torch.distributed.is_available() and torch.distributed.is_initialized() and self.local_rank == -1:
									logger.warning(
									    "torch.distributed process group is initialized, but local_rank == -1. "
									    "In order to use Torch DDP, launch your script with `python -m torch.distributed.launch"     )
						if self.no_cuda:
									UpperCamelCase__					=       torch.device("cpu"     )
									UpperCamelCase__					=       0
						elif is_sagemaker_model_parallel_available():
									UpperCamelCase__					=       smp.local_rank()
									UpperCamelCase__					=       torch.device("cuda"      ,						snake_case     )
									UpperCamelCase__					=       1
						elif is_sagemaker_dp_enabled():
									import smdistributed.dataparallel.torch.torch_smddp  # noqa: F401

									torch.distributed.init_process_group(backend="smddp"      ,						timeout=self.ddp_timeout_delta     )
									UpperCamelCase__					=       int(os.getenv("SMDATAPARALLEL_LOCAL_RANK"     )     )
									UpperCamelCase__					=       torch.device("cuda"      ,						self.local_rank     )
									UpperCamelCase__					=       1
						elif self.local_rank == -1:
									# if n_gpu is > 1 we'll use nn.DataParallel.
									# If you only want to use a specific subset of GPUs use `CUDA_VISIBLE_DEVICES=0`
									# Explicitly set CUDA to the first (index 0) CUDA device, otherwise `set_device` will
									# trigger an error that a device index is missing. Index 0 takes into account the
									# GPUs available in the environment, so `CUDA_VISIBLE_DEVICES=1,2` with `cuda:0`
									# will use the first GPU in that env, i.e. GPU#1
									UpperCamelCase__					=       torch.device("cuda:0" if torch.cuda.is_available() else "cpu"     )
									# Sometimes the line in the postinit has not been run before we end up here, so just checking we're not at
									# the default value.
									UpperCamelCase__					=       torch.cuda.device_count()
						else:
									# Here, we'll use torch.distributed.
									# Initializes the distributed backend which will take care of synchronizing nodes/GPUs
									if not torch.distributed.is_initialized():
												torch.distributed.init_process_group(backend="nccl"      ,						timeout=self.ddp_timeout_delta     )
									UpperCamelCase__					=       torch.device("cuda"      ,						self.local_rank     )
									UpperCamelCase__					=       1

						if device.type == "cuda":
									torch.cuda.set_device(snake_case     )

						return device




			@property
			def 				snake_case__				(							self     ):

						'''simple docstring'''


						if is_sagemaker_model_parallel_available():
									return smp.dp_size()

						return super().world_size




			@property
			def 				snake_case__				(							self     ):

						'''simple docstring'''


						return not is_sagemaker_model_parallel_available()







			@property
			def 				snake_case__				(							self     ):

						'''simple docstring'''


						return False


