




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_						(			UpperCamelCase__							: Optional[Any] )	->			Tuple:





				"""simple docstring"""


				__lowerCamelCase									=       botoa.client('iam' )

				__lowerCamelCase									=       {
				    '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=__A					,	AssumeRolePolicyDocument=json.dumps(__A					,	indent=2 ) )
								__lowerCamelCase									=       {
								    '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=__A					,	PolicyName=F"""{role_name}_policy_permission"""					,	PolicyDocument=json.dumps(__A					,	indent=2 )					,	)
				except iam_client.exceptions.EntityAlreadyExistsException:
								print(F"""role {role_name} already exists. Using existing one""" )







def      lowerCamelCase_						(			UpperCamelCase__							: Tuple )	->			List[str]:





				"""simple docstring"""


				__lowerCamelCase									=       botoa.client('iam' )
				return iam_client.get_role(RoleName=__A )["Role"]["Arn"]







def      lowerCamelCase_						(			)	->			str:





				"""simple docstring"""


				__lowerCamelCase									=       _ask_options(
				    'How do you want to authorize?'					,	['AWS Profile', 'Credentials (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) ']					,	__A					,	)
				__lowerCamelCase									=       None
				if credentials_configuration == 0:
								__lowerCamelCase									=       _ask_field('Enter your AWS Profile name: [default] '					,	default='default' )
								__lowerCamelCase									=       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`' )
								__lowerCamelCase									=       _ask_field('AWS Access Key ID: ' )
								__lowerCamelCase									=       aws_access_key_id

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

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

				__lowerCamelCase									=       _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']					,	__A					,	)
				if role_management == 0:
								__lowerCamelCase									=       _ask_field('Enter your IAM role name: ' )
				else:
								__lowerCamelCase									=       'accelerate_sagemaker_execution_role'
								print(F"""Accelerate will create an iam role \"{iam_role_name}\" using the provided credentials""" )
								_create_iam_role_for_sagemaker(__A )

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

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

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

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

								if use_custom_options:
												__lowerCamelCase									=       _ask_options(
												    'Which mode do you want to use?'					,	__A					,	lambda UpperCamelCase__ : TORCH_DYNAMO_MODES[int(__A )]					,	default='default'					,	)
												__lowerCamelCase									=       _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=__A					,	error_message='Please enter yes or no.'					,	)
												__lowerCamelCase									=       _ask_field(
												    'Do you want to enable dynamic shape tracing? [yes/NO]: '					,	_convert_yes_no_to_bool					,	default=__A					,	error_message='Please enter yes or no.'					,	)
				__lowerCamelCase									=       'Which EC2 instance type you want to use for your training?'
				if distributed_type != SageMakerDistributedType.NO:
								__lowerCamelCase									=       _ask_options(
								    __A					,	__A					,	lambda UpperCamelCase__ : SAGEMAKER_PARALLEL_EC2_INSTANCES[int(__A )] )
				else:
								eca_instance_query += "? [ml.p3.2xlarge]:"
								__lowerCamelCase									=       _ask_field(__A					,	lambda UpperCamelCase__ : str(__A ).lower()					,	default='ml.p3.2xlarge' )

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

				__lowerCamelCase									=       _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=__A					,	compute_environment=ComputeEnvironment.AMAZON_SAGEMAKER					,	distributed_type=__A					,	use_cpu=__A					,	dynamo_config=__A					,	eca_instance_type=__A					,	profile=__A					,	region=__A					,	iam_role_name=__A					,	mixed_precision=__A					,	num_machines=__A					,	sagemaker_inputs_file=__A					,	sagemaker_metrics_file=__A					,	)







"""simple docstring"""

def  __snake_case							(	__A      :						int							,		__A      :						int     )     ->       float:






				'''simple docstring'''
				return base * power(__A							,		(exponent - 1)     ) if exponent else 1


if __name__ == "__main__":
							print('Raise base to the power of exponent using recursion...')
							A_						:    str				=      int(input('Enter the base: ').strip())
							A_						:    Dict				=      int(input('Enter the exponent: ').strip())
							A_						:    List[str]				=      power(base, abs(exponent))
							if exponent < 0:  # power() does not properly deal w/ negative exponents
														A_						:    Any				=      1 / result
							print(f'''{base} to the power of {exponent} is {result}''')





