from collections import OrderedDict
from typing import TYPE_CHECKING, Any, Mapping, Optional, Union

from ...configuration_utils import PretrainedConfig
from ...onnx import OnnxConfig, OnnxSeqaSeqConfigWithPast
from ...utils import logging


if TYPE_CHECKING:
     from ...feature_extraction_utils import FeatureExtractionMixin
     from ...tokenization_utils_base import PreTrainedTokenizerBase
     from ...utils import TensorType

_SCREAMING_SNAKE_CASE      						=	logging.get_logger(__name__)

_SCREAMING_SNAKE_CASE      						=	{
    """openai/whisper-base""": """https://huggingface.co/openai/whisper-base/resolve/main/config.json""",
}

# fmt: off
_SCREAMING_SNAKE_CASE      						=	[
    1, 2, 7, 8, 9, 1_0, 1_4, 2_5,
    2_6, 2_7, 2_8, 2_9, 3_1, 5_8, 5_9, 6_0, 6_1, 6_2,
    6_3, 9_0, 9_1, 9_2, 9_3, 3_5_7, 3_6_6, 4_3_8, 5_3_2, 6_8_5,
    7_0_5, 7_9_6, 9_3_0, 1_0_5_8, 1_2_2_0, 1_2_6_7, 1_2_7_9, 1_3_0_3, 1_3_4_3, 1_3_7_7,
    1_3_9_1, 1_6_3_5, 1_7_8_2, 1_8_7_5, 2_1_6_2, 2_3_6_1, 2_4_8_8, 3_4_6_7, 4_0_0_8, 4_2_1_1,
    4_6_0_0, 4_8_0_8, 5_2_9_9, 5_8_5_5, 6_3_2_9, 7_2_0_3, 9_6_0_9, 9_9_5_9, 1_0_5_6_3, 1_0_7_8_6,
    1_1_4_2_0, 1_1_7_0_9, 1_1_9_0_7, 1_3_1_6_3, 1_3_6_9_7, 1_3_7_0_0, 1_4_8_0_8, 1_5_3_0_6, 1_6_4_1_0, 1_6_7_9_1,
    1_7_9_9_2, 1_9_2_0_3, 1_9_5_1_0, 2_0_7_2_4, 2_2_3_0_5, 2_2_9_3_5, 2_7_0_0_7, 3_0_1_0_9, 3_0_4_2_0, 3_3_4_0_9,
    3_4_9_4_9, 4_0_2_8_3, 4_0_4_9_3, 4_0_5_4_9, 4_7_2_8_2, 4_9_1_4_6, 5_0_2_5_7, 5_0_3_5_9, 5_0_3_6_0, 5_0_3_6_1
]
_SCREAMING_SNAKE_CASE      						=	[
    1, 2, 7, 8, 9, 1_0, 1_4, 2_5,
    2_6, 2_7, 2_8, 2_9, 3_1, 5_8, 5_9, 6_0, 6_1, 6_2,
    6_3, 9_0, 9_1, 9_2, 9_3, 3_5_9, 5_0_3, 5_2_2, 5_4_2, 8_7_3,
    8_9_3, 9_0_2, 9_1_8, 9_2_2, 9_3_1, 1_3_5_0, 1_8_5_3, 1_9_8_2, 2_4_6_0, 2_6_2_7,
    3_2_4_6, 3_2_5_3, 3_2_6_8, 3_5_3_6, 3_8_4_6, 3_9_6_1, 4_1_8_3, 4_6_6_7, 6_5_8_5, 6_6_4_7,
    7_2_7_3, 9_0_6_1, 9_3_8_3, 1_0_4_2_8, 1_0_9_2_9, 1_1_9_3_8, 1_2_0_3_3, 1_2_3_3_1, 1_2_5_6_2, 1_3_7_9_3,
    1_4_1_5_7, 1_4_6_3_5, 1_5_2_6_5, 1_5_6_1_8, 1_6_5_5_3, 1_6_6_0_4, 1_8_3_6_2, 1_8_9_5_6, 2_0_0_7_5, 2_1_6_7_5,
    2_2_5_2_0, 2_6_1_3_0, 2_6_1_6_1, 2_6_4_3_5, 2_8_2_7_9, 2_9_4_6_4, 3_1_6_5_0, 3_2_3_0_2, 3_2_4_7_0, 3_6_8_6_5,
    4_2_8_6_3, 4_7_4_2_5, 4_9_8_7_0, 5_0_2_5_4, 5_0_2_5_8, 5_0_3_6_0, 5_0_3_6_1, 5_0_3_6_2
]
class SCREAMING_SNAKE_CASE_						(	lowercase_						):
   __lowerCAmelCase      =							"""whisper"""
   __lowerCAmelCase      =							["""past_key_values"""]
   __lowerCAmelCase      =							{"""num_attention_heads""": """encoder_attention_heads""", """hidden_size""": """d_model"""}







   def __init__(			self		:		int					,					lowerCamelCase_		:		List[Any]=5_1865					,					lowerCamelCase_		:		str=80					,					lowerCamelCase_		:		Optional[Any]=6					,					lowerCamelCase_		:		Dict=4					,					lowerCamelCase_		:		Optional[int]=6					,					lowerCamelCase_		:		str=4					,					lowerCamelCase_		:		Optional[int]=1536					,					lowerCamelCase_		:		Optional[int]=1536					,					lowerCamelCase_		:		Any=0.0					,					lowerCamelCase_		:		List[str]=0.0					,					lowerCamelCase_		:		Optional[int]=5_0257					,					lowerCamelCase_		:		Dict=True					,					lowerCamelCase_		:		Optional[int]=True					,					lowerCamelCase_		:		str="gelu"					,					lowerCamelCase_		:		str=256					,					lowerCamelCase_		:		Tuple=0.0					,					lowerCamelCase_		:		Optional[Any]=0.0					,					lowerCamelCase_		:		Any=0.0					,					lowerCamelCase_		:		int=0.0_2					,					lowerCamelCase_		:		Optional[Any]=False					,					lowerCamelCase_		:		Union[str, Any]=1500					,					lowerCamelCase_		:		Optional[int]=448					,					lowerCamelCase_		:		Tuple=5_0256					,					lowerCamelCase_		:		Any=5_0256					,					lowerCamelCase_		:		Optional[int]=5_0256					,					lowerCamelCase_		:		Optional[Any]=None					,					lowerCamelCase_		:		str=[220, 5_0256]					,					lowerCamelCase_		:		List[Any]=False					,					lowerCamelCase_		:		Dict=256					,					lowerCamelCase_		:		str=False					,					lowerCamelCase_		:		str=0.0_5					,					lowerCamelCase_		:		Tuple=10					,					lowerCamelCase_		:		Tuple=2					,					lowerCamelCase_		:		Optional[int]=0.0					,					lowerCamelCase_		:		Optional[int]=10					,					lowerCamelCase_		:		Any=0					,					lowerCamelCase_		:		Dict=7					,					**lowerCamelCase_		:		List[Any]					,					):





    """simple docstring"""


    UpperCamelCase          =	vocab_size
    UpperCamelCase          =	num_mel_bins
    UpperCamelCase          =	d_model
    UpperCamelCase          =	encoder_layers
    UpperCamelCase          =	encoder_attention_heads
    UpperCamelCase          =	decoder_layers
    UpperCamelCase          =	decoder_attention_heads
    UpperCamelCase          =	decoder_ffn_dim
    UpperCamelCase          =	encoder_ffn_dim
    UpperCamelCase          =	dropout
    UpperCamelCase          =	attention_dropout
    UpperCamelCase          =	activation_dropout
    UpperCamelCase          =	activation_function
    UpperCamelCase          =	init_std
    UpperCamelCase          =	encoder_layerdrop
    UpperCamelCase          =	decoder_layerdrop
    UpperCamelCase          =	use_cache
    UpperCamelCase          =	encoder_layers
    UpperCamelCase          =	scale_embedding  # scale factor will be sqrt(d_model) if True
    UpperCamelCase          =	max_source_positions
    UpperCamelCase          =	max_target_positions

    # Audio Classification-specific parameters. Feel free to ignore for other classes.
    UpperCamelCase          =	classifier_proj_size
    UpperCamelCase          =	use_weighted_layer_sum

    # fine-tuning config parameters for SpecAugment: https://arxiv.org/abs/1904.08779
    UpperCamelCase          =	apply_spec_augment
    UpperCamelCase          =	mask_time_prob
    UpperCamelCase          =	mask_time_length
    UpperCamelCase          =	mask_time_min_masks
    UpperCamelCase          =	mask_feature_prob
    UpperCamelCase          =	mask_feature_length
    UpperCamelCase          =	mask_feature_min_masks

    UpperCamelCase          =	median_filter_width

    super().__init__(
        pad_token_id=SCREAMING_SNAKE_CASE_					,					bos_token_id=SCREAMING_SNAKE_CASE_					,					eos_token_id=SCREAMING_SNAKE_CASE_					,					is_encoder_decoder=SCREAMING_SNAKE_CASE_					,					decoder_start_token_id=SCREAMING_SNAKE_CASE_					,					suppress_tokens=SCREAMING_SNAKE_CASE_					,					begin_suppress_tokens=SCREAMING_SNAKE_CASE_					,					**SCREAMING_SNAKE_CASE_					,					)





class SCREAMING_SNAKE_CASE_						(	lowercase_						):







   @property
   def 		lowerCamelCase_     (			self		:		Any							):





    """simple docstring"""


    UpperCamelCase          =	OrderedDict(
        [
            ("""input_features""", {0: """batch""", 1: """feature_size""", 2: """encoder_sequence"""}),
        ]							)
    if self.use_past:
     UpperCamelCase          =	{0: 'batch'}
    else:
     UpperCamelCase          =	{0: 'batch', 1: 'decoder_sequence'}

    if self.use_past:
     self.fill_with_past_key_values_(SCREAMING_SNAKE_CASE_					,					direction="""inputs"""							)

    return common_inputs







   def 		lowerCamelCase_     (			self		:		Optional[int]					,					lowerCamelCase_		:		Union["PreTrainedTokenizerBase", "FeatureExtractionMixin"]					,					lowerCamelCase_		:		int = -1					,					lowerCamelCase_		:		int = -1					,					lowerCamelCase_		:		bool = False					,					lowerCamelCase_		:		Optional["TensorType"] = None					,					lowerCamelCase_		:		int = 2_2050					,					lowerCamelCase_		:		float = 5.0					,					lowerCamelCase_		:		int = 220					,					):





    """simple docstring"""


    UpperCamelCase          =	OrderedDict()
    UpperCamelCase          =	OnnxConfig.generate_dummy_inputs(
        self					,					preprocessor=preprocessor.feature_extractor					,					batch_size=SCREAMING_SNAKE_CASE_					,					framework=SCREAMING_SNAKE_CASE_					,					sampling_rate=SCREAMING_SNAKE_CASE_					,					time_duration=SCREAMING_SNAKE_CASE_					,					frequency=SCREAMING_SNAKE_CASE_					,					)
    UpperCamelCase          =	encoder_inputs['input_features'].shape[2]
    UpperCamelCase          =	encoder_sequence_length // 2 if self.use_past else seq_length

    UpperCamelCase          =	super().generate_dummy_inputs(
        preprocessor.tokenizer					,					SCREAMING_SNAKE_CASE_					,					SCREAMING_SNAKE_CASE_					,					SCREAMING_SNAKE_CASE_					,					SCREAMING_SNAKE_CASE_							)

    UpperCamelCase          =	encoder_inputs.pop("""input_features"""							)
    UpperCamelCase          =	decoder_inputs.pop("""decoder_input_ids"""							)

    if "past_key_values" in decoder_inputs:
     UpperCamelCase          =	decoder_inputs.pop("""past_key_values"""							)

    return dummy_inputs







   @property
   def 		lowerCamelCase_     (			self		:		Dict							):





    """simple docstring"""


    return 1E-3





"""simple docstring"""







import inspect
import os
import unittest

import torch

import accelerate
from accelerate import Accelerator
from accelerate.test_utils import execute_subprocess_async, require_multi_gpu
from accelerate.utils import patch_environment







class       UpperCamelCase__   (	unittest.TestCase  ):




      """simple docstring"""




      def      SCREAMING_SNAKE_CASE__ (      self				:      Optional[int]       ):
        lowerCAmelCase_   :				Union[str, Any]								= inspect.getfile(accelerate.test_utils       )
        lowerCAmelCase_   :				Dict								= os.path.sep.join(mod_file.split(os.path.sep       )[:-1] + ['scripts', 'test_script.py']       )
        lowerCAmelCase_   :				int								= os.path.sep.join(
            mod_file.split(os.path.sep       )[:-1] + ['scripts', 'test_distributed_data_loop.py']       )
        lowerCAmelCase_   :				Union[str, Any]								= os.path.sep.join(mod_file.split(os.path.sep       )[:-1] + ['scripts', 'test_ops.py']       )



      @require_multi_gpu
      def      SCREAMING_SNAKE_CASE__ (      self				:      Any       ):
        print(F"Found {torch.cuda.device_count()} devices."       )
        lowerCAmelCase_   :				Optional[int]								= ['torchrun', F"--nproc_per_node={torch.cuda.device_count()}", self.test_file_path]
        with patch_environment(omp_num_threads=1       ):
          execute_subprocess_async(SCREAMING_SNAKE_CASE_    ,			env=os.environ.copy()       )



      @require_multi_gpu
      def      SCREAMING_SNAKE_CASE__ (      self				:      Optional[Any]       ):
        print(F"Found {torch.cuda.device_count()} devices."       )
        lowerCAmelCase_   :				int								= ['torchrun', F"--nproc_per_node={torch.cuda.device_count()}", self.operation_file_path]
        print(F"Command: {cmd}"       )
        with patch_environment(omp_num_threads=1       ):
          execute_subprocess_async(SCREAMING_SNAKE_CASE_    ,			env=os.environ.copy()       )



      @require_multi_gpu
      def      SCREAMING_SNAKE_CASE__ (      self				:      Optional[int]       ):
        lowerCAmelCase_   :				List[Any]								= ['torchrun', F"--nproc_per_node={torch.cuda.device_count()}", inspect.getfile(self.__class__       )]
        with patch_environment(omp_num_threads=1       ):
          execute_subprocess_async(SCREAMING_SNAKE_CASE_    ,			env=os.environ.copy()       )





      @require_multi_gpu
      def      SCREAMING_SNAKE_CASE__ (      self				:      Union[str, Any]       ):
        print(F"Found {torch.cuda.device_count()} devices, using 2 devices only"       )
        lowerCAmelCase_   :				Any								= ['torchrun', F"--nproc_per_node={torch.cuda.device_count()}", self.data_loop_file_path]
        with patch_environment(omp_num_threads=1    ,			cuda_visible_devices='0,1'       ):
          execute_subprocess_async(SCREAMING_SNAKE_CASE_    ,			env=os.environ.copy()       )


if __name__ == "__main__":
     lowercase__		:				Dict          =	Accelerator()
     lowercase__		:				List[Any]          =	(accelerator.state.process_index + 2, 1_0)
     lowercase__		:				Any          =	torch.randint(0, 1_0, shape).to(accelerator.device)

     lowercase__		:				List[Any]          =	""""""

     lowercase__		:				Union[str, Any]          =	accelerator.pad_across_processes(tensor)
     if tensora.shape[0] != accelerator.state.num_processes + 1:
          error_msg += f"Found shape {tensora.shape} but should have {accelerator.state.num_processes + 1} at dim 0."
     if not torch.equal(tensora[: accelerator.state.process_index + 2], tensor):
          error_msg += "Tensors have different values."
     if not torch.all(tensora[accelerator.state.process_index + 2 :] == 0):
          error_msg += "Padding was not done with the right value (0)."

     lowercase__		:				Optional[Any]          =	accelerator.pad_across_processes(tensor, pad_first=True)
     if tensora.shape[0] != accelerator.state.num_processes + 1:
          error_msg += f"Found shape {tensora.shape} but should have {accelerator.state.num_processes + 1} at dim 0."
     lowercase__		:				Any          =	accelerator.state.num_processes - accelerator.state.process_index - 1
     if not torch.equal(tensora[index:], tensor):
          error_msg += "Tensors have different values."
     if not torch.all(tensora[:index] == 0):
          error_msg += "Padding was not done with the right value (0)."

     # Raise error at the end to make sure we don't stop at the first failure.
     if len(error_msg) > 0:
          raise ValueError(error_msg)





