


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        UpperCAmelCase__	(lowerCAmelCase_       ):




					'''simple docstring'''


					__SCREAMING_SNAKE_CASE						       =    botoa.client("iam"       )

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




def        UpperCAmelCase__	(lowerCAmelCase_       ):




					'''simple docstring'''


					__SCREAMING_SNAKE_CASE						       =    botoa.client("iam"       )
					return iam_client.get_role(RoleName=SCREAMING_SNAKE_CASE_       )["Role"]["Arn"]




def        UpperCAmelCase__	():




					'''simple docstring'''


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

										__SCREAMING_SNAKE_CASE						       =    _ask_field("AWS Secret Access Key: "       )
										__SCREAMING_SNAKE_CASE						       =    aws_secret_access_key

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

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

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

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

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

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

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

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

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




"""simple docstring"""







from __future__ import annotations




def        UpperCAmelCase__	(lowerCAmelCase_       ):




					'''simple docstring'''


					if not nums:
										return 0
					__SCREAMING_SNAKE_CASE						       =    nums[0]
					__SCREAMING_SNAKE_CASE						       =    0
					for num in nums[1:]:
										__SCREAMING_SNAKE_CASE       ,  __SCREAMING_SNAKE_CASE						       =    (
										    max_excluding + num,
										    max(lowerCAmelCase_  ,						lowerCAmelCase_       ),
										)
					return max(lowerCAmelCase_  ,						lowerCAmelCase_       )


if __name__ == "__main__":
		import doctest

		doctest.testmod()
