

"""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     __SCREAMING_SNAKE_CASE    ( A_					):
	lowerCAmelCase__      :		int    							=      botoa.client('''iam'''					)

	lowerCAmelCase__      :		int    							=      {
	    '''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__      :		Dict    							=      {
		    '''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     __SCREAMING_SNAKE_CASE    ( A_					):
	lowerCAmelCase__      :		Union[str, Any]    							=      botoa.client('''iam'''					)
	return iam_client.get_role(RoleName=A_					)["Role"]["Arn"]





def     __SCREAMING_SNAKE_CASE    ( ):
	lowerCAmelCase__      :		int    							=      _ask_options(
	    '''How do you want to authorize?'''		,	['''AWS Profile''', '''Credentials (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) ''']		,	A_		,	)
	lowerCAmelCase__      :		List[str]    							=      None
	if credentials_configuration == 0:
		lowerCAmelCase__      :		Tuple    							=      _ask_field('''Enter your AWS Profile name: [default] '''		,	default='''default'''					)
		lowerCAmelCase__      :		List[str]    							=      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__      :		Optional[int]    							=      _ask_field('''AWS Access Key ID: '''					)
		lowerCAmelCase__      :		int    							=      aws_access_key_id

		lowerCAmelCase__      :		Dict    							=      _ask_field('''AWS Secret Access Key: '''					)
		lowerCAmelCase__      :		Optional[Any]    							=      aws_secret_access_key

	lowerCAmelCase__      :		str    							=      _ask_field('''Enter your AWS Region: [us-east-1]'''		,	default='''us-east-1'''					)
	lowerCAmelCase__      :		Union[str, Any]    							=      aws_region

	lowerCAmelCase__      :		str    							=      _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__      :		Any    							=      _ask_field('''Enter your IAM role name: '''					)
	else:
		lowerCAmelCase__      :		Tuple    							=      '''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__      :		Union[str, Any]    							=      _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__      :		int    							=      None
	if is_custom_docker_image:
		lowerCAmelCase__      :		str    							=      _ask_field('''Enter your Docker image: '''		,	lambda A_					: str(A_					).lower()					)

	lowerCAmelCase__      :		Union[str, Any]    							=      _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__      :		Dict    							=      None
	if is_sagemaker_inputs_enabled:
		lowerCAmelCase__      :		Any    							=      _ask_field(
		    '''Enter the path to the SageMaker inputs TSV file with columns (channel_name, data_location): '''		,	lambda A_					: str(A_					).lower()		,	)

	lowerCAmelCase__      :		Optional[int]    							=      _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__      :		str    							=      None
	if is_sagemaker_metrics_enabled:
		lowerCAmelCase__      :		Union[str, Any]    							=      _ask_field(
		    '''Enter the path to the SageMaker metrics TSV file with columns (metric_name, metric_regex): '''		,	lambda A_					: str(A_					).lower()		,	)

	lowerCAmelCase__      :		Union[str, Any]    							=      _ask_options(
	    '''What is the distributed mode?'''		,	['''No distributed training''', '''Data parallelism''']		,	_convert_sagemaker_distributed_mode		,	)
	lowerCAmelCase__      :		Union[str, Any]    							=      {}
	lowerCAmelCase__      :		List[Any]    							=      _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__      :		str    							=      '''dynamo_'''
		lowerCAmelCase__      :		Optional[Any]    							=      _ask_options(
		    '''Which dynamo backend would you like to use?'''		,	[x.lower() for x in DYNAMO_BACKENDS]		,	_convert_dynamo_backend		,	default=2		,	)
		lowerCAmelCase__      :		Optional[int]    							=      _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__      :		Any    							=      _ask_options(
			    '''Which mode do you want to use?'''		,	A_		,	lambda A_					: TORCH_DYNAMO_MODES[int(A_					)]		,	default='''default'''		,	)
			lowerCAmelCase__      :		Optional[int]    							=      _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__      :		Optional[int]    							=      _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__      :		Tuple    							=      '''Which EC2 instance type you want to use for your training?'''
	if distributed_type != SageMakerDistributedType.NO:
		lowerCAmelCase__      :		Optional[Any]    							=      _ask_options(
		    A_		,	A_		,	lambda A_					: SAGEMAKER_PARALLEL_EC2_INSTANCES[int(A_					)]					)
	else:
		eca_instance_query += "? [ml.p3.2xlarge]:"
		lowerCAmelCase__      :		List[Any]    							=      _ask_field(A_		,	lambda A_					: str(A_					).lower()		,	default='''ml.p3.2xlarge'''					)

	lowerCAmelCase__      :		int    							=      1
	if distributed_type in (SageMakerDistributedType.DATA_PARALLEL, SageMakerDistributedType.MODEL_PARALLEL):
		lowerCAmelCase__      :		List[str]    							=      _ask_field(
		    '''How many machines do you want use? [1]: '''		,	A_		,	default=1		,	)

	lowerCAmelCase__      :		Optional[int]    							=      _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     __SCREAMING_SNAKE_CASE    ( A_					):
	lowerCAmelCase__      :		Any    							=      int(A_					)
	if decimal in (0, 1):  # Exit cases for the recursion
		return str(A_					)
	lowerCAmelCase__							,lowerCAmelCase__      :		Any    							=      divmod(A_		,	2					)
	return binary_recursive(A_					) + str(A_					)

def     __SCREAMING_SNAKE_CASE    ( A_					):
	lowerCAmelCase__      :		Union[str, Any]    							=      str(A_					).strip()
	if not number:
		raise ValueError('''No input value was provided'''					)
	lowerCAmelCase__      :		Any    							=      '''-''' if number.startswith('''-'''					) else ''''''
	lowerCAmelCase__      :		Dict    							=      number.lstrip('''-'''					)
	if not number.isnumeric():
		raise ValueError('''Input value is not an integer'''					)
	return f'{negative}0b{binary_recursive(int(A_					)					)}'


if __name__ == "__main__":
							from doctest import testmod

							testmod()




