



"""simple docstring"""


# Copyright 2021 The HuggingFace Team. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import json
import os

from ...utils.constants import SAGEMAKER_PARALLEL_EC2_INSTANCES, TORCH_DYNAMO_MODES
from ...utils.dataclasses import ComputeEnvironment, SageMakerDistributedType
from ...utils.imports import is_botoa_available
from .config_args import SageMakerConfig
from .config_utils import (
    DYNAMO_BACKENDS,
    _ask_field,
    _ask_options,
    _convert_dynamo_backend,
    _convert_mixed_precision,
    _convert_sagemaker_distributed_mode,
    _convert_yes_no_to_bool,
)


if is_botoa_available():
				import botoa  # noqa: F401

def  _lowerCAmelCase      (   lowercase_						):
						UpperCAmelCase             = botoa.client('iam'						)

						UpperCAmelCase             = {
						    """Version""": """2012-10-17""",
						    """Statement""": [
						        {"""Effect""": """Allow""", """Principal""": {"""Service""": """sagemaker.amazonaws.com"""}, """Action""": """sts:AssumeRole"""}
						    ],
						}
						try:
												# create the role, associated with the chosen trust policy
												iam_client.create_role(
												    RoleName=lowercase_		,	AssumeRolePolicyDocument=json.dumps(lowercase_		,	indent=2						)						)
												UpperCAmelCase             = {
												    """Version""": """2012-10-17""",
												    """Statement""": [
												        {
												            """Effect""": """Allow""",
												            """Action""": [
												                """sagemaker:*""",
												                """ecr:GetDownloadUrlForLayer""",
												                """ecr:BatchGetImage""",
												                """ecr:BatchCheckLayerAvailability""",
												                """ecr:GetAuthorizationToken""",
												                """cloudwatch:PutMetricData""",
												                """cloudwatch:GetMetricData""",
												                """cloudwatch:GetMetricStatistics""",
												                """cloudwatch:ListMetrics""",
												                """logs:CreateLogGroup""",
												                """logs:CreateLogStream""",
												                """logs:DescribeLogStreams""",
												                """logs:PutLogEvents""",
												                """logs:GetLogEvents""",
												                """s3:CreateBucket""",
												                """s3:ListBucket""",
												                """s3:GetBucketLocation""",
												                """s3:GetObject""",
												                """s3:PutObject""",
												            ],
												            """Resource""": """*""",
												        }
												    ],
												}
												# attach policy to role
												iam_client.put_role_policy(
												    RoleName=lowercase_		,	PolicyName=F"""{role_name}_policy_permission"""		,	PolicyDocument=json.dumps(lowercase_		,	indent=2						)		,	)
						except iam_client.exceptions.EntityAlreadyExistsException:
												print(F"""role {role_name} already exists. Using existing one"""						)

def  _lowerCAmelCase      (   lowercase_						):
						UpperCAmelCase             = botoa.client('iam'						)
						return iam_client.get_role(RoleName=lowercase_						)["Role"]["Arn"]






def  _lowerCAmelCase      (   ):
						UpperCAmelCase             = _ask_options(
						    'How do you want to authorize?'		,	['AWS Profile', 'Credentials (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) ']		,	lowercase_		,	)
						UpperCAmelCase             = None
						if credentials_configuration == 0:
												UpperCAmelCase             = _ask_field('Enter your AWS Profile name: [default] '		,	default='default'						)
												UpperCAmelCase             = aws_profile
						else:
												print(
												    'Note you will need to provide AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY when you launch you training script with,'
												    '`accelerate launch --aws_access_key_id XXX --aws_secret_access_key YYY`'						)
												UpperCAmelCase             = _ask_field('AWS Access Key ID: '						)
												UpperCAmelCase             = aws_access_key_id

												UpperCAmelCase             = _ask_field('AWS Secret Access Key: '						)
												UpperCAmelCase             = aws_secret_access_key

						UpperCAmelCase             = _ask_field('Enter your AWS Region: [us-east-1]'		,	default='us-east-1'						)
						UpperCAmelCase             = aws_region

						UpperCAmelCase             = _ask_options(
						    'Do you already have an IAM Role for executing Amazon SageMaker Training Jobs?'		,	['Provide IAM Role name', 'Create new IAM role using credentials']		,	lowercase_		,	)
						if role_management == 0:
												UpperCAmelCase             = _ask_field('Enter your IAM role name: '						)
						else:
												UpperCAmelCase             = """accelerate_sagemaker_execution_role"""
												print(F"""Accelerate will create an iam role \"{iam_role_name}\" using the provided credentials"""						)
												_create_iam_role_for_sagemaker(lowercase_						)

						UpperCAmelCase             = _ask_field(
						    'Do you want to use custom Docker image? [yes/NO]: '		,	_convert_yes_no_to_bool		,	default=lowercase_		,	error_message='Please enter yes or no.'		,	)
						UpperCAmelCase             = None
						if is_custom_docker_image:
												UpperCAmelCase             = _ask_field('Enter your Docker image: '		,	lambda lowercase_						: str(lowercase_						).lower()						)

						UpperCAmelCase             = _ask_field(
						    'Do you want to provide SageMaker input channels with data locations? [yes/NO]: '		,	_convert_yes_no_to_bool		,	default=lowercase_		,	error_message='Please enter yes or no.'		,	)
						UpperCAmelCase             = None
						if is_sagemaker_inputs_enabled:
												UpperCAmelCase             = _ask_field(
												    'Enter the path to the SageMaker inputs TSV file with columns (channel_name, data_location): '		,	lambda lowercase_						: str(lowercase_						).lower()		,	)

						UpperCAmelCase             = _ask_field(
						    'Do you want to enable SageMaker metrics? [yes/NO]: '		,	_convert_yes_no_to_bool		,	default=lowercase_		,	error_message='Please enter yes or no.'		,	)
						UpperCAmelCase             = None
						if is_sagemaker_metrics_enabled:
												UpperCAmelCase             = _ask_field(
												    'Enter the path to the SageMaker metrics TSV file with columns (metric_name, metric_regex): '		,	lambda lowercase_						: str(lowercase_						).lower()		,	)

						UpperCAmelCase             = _ask_options(
						    'What is the distributed mode?'		,	['No distributed training', 'Data parallelism']		,	_convert_sagemaker_distributed_mode		,	)
						UpperCAmelCase             = {}
						UpperCAmelCase             = _ask_field(
						    'Do you wish to optimize your script with torch dynamo?[yes/NO]:'		,	_convert_yes_no_to_bool		,	default=lowercase_		,	error_message='Please enter yes or no.'		,	)
						if use_dynamo:
												UpperCAmelCase             = """dynamo_"""
												UpperCAmelCase             = _ask_options(
												    'Which dynamo backend would you like to use?'		,	[x.lower() for x in DYNAMO_BACKENDS]		,	_convert_dynamo_backend		,	default=2		,	)
												UpperCAmelCase             = _ask_field(
												    'Do you want to customize the defaults sent to torch.compile? [yes/NO]: '		,	_convert_yes_no_to_bool		,	default=lowercase_		,	error_message='Please enter yes or no.'		,	)

												if use_custom_options:
																		UpperCAmelCase             = _ask_options(
																		    'Which mode do you want to use?'		,	lowercase_		,	lambda lowercase_						: TORCH_DYNAMO_MODES[int(lowercase_						)]		,	default='default'		,	)
																		UpperCAmelCase             = _ask_field(
																		    'Do you want the fullgraph mode or it is ok to break model into several subgraphs? [yes/NO]: '		,	_convert_yes_no_to_bool		,	default=lowercase_		,	error_message='Please enter yes or no.'		,	)
																		UpperCAmelCase             = _ask_field(
																		    'Do you want to enable dynamic shape tracing? [yes/NO]: '		,	_convert_yes_no_to_bool		,	default=lowercase_		,	error_message='Please enter yes or no.'		,	)
						UpperCAmelCase             = """Which EC2 instance type you want to use for your training?"""
						if distributed_type != SageMakerDistributedType.NO:
												UpperCAmelCase             = _ask_options(
												    lowercase_		,	lowercase_		,	lambda lowercase_						: SAGEMAKER_PARALLEL_EC2_INSTANCES[int(lowercase_						)]						)
						else:
												eca_instance_query += "? [ml.p3.2xlarge]:"
												UpperCAmelCase             = _ask_field(lowercase_		,	lambda lowercase_						: str(lowercase_						).lower()		,	default='ml.p3.2xlarge'						)

						UpperCAmelCase             = 1
						if distributed_type in (SageMakerDistributedType.DATA_PARALLEL, SageMakerDistributedType.MODEL_PARALLEL):
												UpperCAmelCase             = _ask_field(
												    'How many machines do you want use? [1]: '		,	lowercase_		,	default=1		,	)

						UpperCAmelCase             = _ask_options(
						    'Do you wish to use FP16 or BF16 (mixed precision)?'		,	['no', 'fp16', 'bf16', 'fp8']		,	_convert_mixed_precision		,	)

						if use_dynamo and mixed_precision == "no":
												print(
												    'Torch dynamo used without mixed precision requires TF32 to be efficient. Accelerate will enable it by default when launching your scripts.'						)

						return SageMakerConfig(
						    image_uri=lowercase_		,	compute_environment=ComputeEnvironment.AMAZON_SAGEMAKER		,	distributed_type=lowercase_		,	use_cpu=lowercase_		,	dynamo_config=lowercase_		,	eca_instance_type=lowercase_		,	profile=lowercase_		,	region=lowercase_		,	iam_role_name=lowercase_		,	mixed_precision=lowercase_		,	num_machines=lowercase_		,	sagemaker_inputs_file=lowercase_		,	sagemaker_metrics_file=lowercase_		,	)







import copy
from dataclasses import dataclass, field
from typing import ClassVar, Dict

from ..features import Audio, Features, Value
from .base import TaskTemplate





@dataclass(frozen=__SCREAMING_SNAKE_CASE)
class 							A__		(	__SCREAMING_SNAKE_CASE):
      _UpperCAmelCase				:    str           =			field(default="""automatic-speech-recognition"""  ,   metadata={"""include_in_asdict_even_if_is_default""": True})
      _UpperCAmelCase				:    ClassVar[Features]           =			Features({"""audio""": Audio()})
      _UpperCAmelCase				:    ClassVar[Features]           =			Features({"""transcription""": Value("""string""")})
      _UpperCAmelCase				:    str           =			"audio"
      _UpperCAmelCase				:    str           =			"transcription"
      def 						UpperCamelCase__							(      self    ,  __magic_name__      ):
       if self.audio_column not in features:
        raise ValueError(F'''Column {self.audio_column} is not present in features.'''      )
       if not isinstance(features[self.audio_column]    ,  __magic_name__      ):
        raise ValueError(F'''Column {self.audio_column} is not an Audio type.'''      )
       lowerCamelCase		:	Optional[Any]							=      copy.deepcopy(self      )
       lowerCamelCase		:	List[Any]							=      self.input_schema.copy()
       lowerCamelCase		:	Tuple							=      features[self.audio_column]
       lowerCamelCase		:	int							=      input_schema
       return task_template






      @property
      def 						UpperCamelCase__							(      self      ):
       return {self.audio_column: "audio", self.transcription_column: "transcription"}




