






# 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      snake_case		(							UpperCAmelCase	:       Tuple   ):

				'''simple docstring'''





				A	 =      botoa.client('iam'   )

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







def      snake_case		(							UpperCAmelCase	:       List[str]   ):

				'''simple docstring'''





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







def      snake_case		(							):

				'''simple docstring'''





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

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

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

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

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

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

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

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

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

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

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













def      snake_case		(							UpperCAmelCase	:       int   ):
				A	 =      0
				while num > 0:
								digit_sum += num % 10
								num //= 10
				return digit_sum







def      snake_case		(							UpperCAmelCase	:       int = 1_00   ):
				A	 =      1
				A	 =      2

				for i in range(2,						max_n + 1   ):
								A	 =      pre_numerator
								A	 =      2 * i // 3 if i % 3 == 0 else 1
								A	 =      cur_numerator
								A	 =      e_cont * pre_numerator + temp

				return sum_digits(UpperCAmelCase   )


if __name__ == "__main__":
					print(f'''{solution() = }''')





