





# 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 						A_							(	_lowerCAmelCase	)		->					Dict:
 UpperCamelCase      :   List[str]			      =  botoa.client("iam"	)

 UpperCamelCase      :   Any			      =  {
     "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=_lowerCAmelCase				,  AssumeRolePolicyDocument=json.dumps(_lowerCAmelCase				,  indent=2	)	)
  UpperCamelCase      :   List[str]			      =  {
      "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=_lowerCAmelCase				,  PolicyName=F"""{role_name}_policy_permission"""				,  PolicyDocument=json.dumps(_lowerCAmelCase				,  indent=2	)				,  )
 except iam_client.exceptions.EntityAlreadyExistsException:
  print(F"""role {role_name} already exists. Using existing one"""	)



def 						A_							(	_lowerCAmelCase	)		->					List[Any]:
 UpperCamelCase      :   List[str]			      =  botoa.client("iam"	)
 return iam_client.get_role(RoleName=_lowerCAmelCase	)["Role"]["Arn"]



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

  UpperCamelCase      :   Optional[Any]			      =  _ask_field("AWS Secret Access Key: "	)
  UpperCamelCase      :   str			      =  aws_secret_access_key

 UpperCamelCase      :   Dict			      =  _ask_field("Enter your AWS Region: [us-east-1]"				,  default="us-east-1"	)
 UpperCamelCase      :   List[Any]			      =  aws_region

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

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

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

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

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

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

 UpperCamelCase      :   str			      =  1
 if distributed_type in (SageMakerDistributedType.DATA_PARALLEL, SageMakerDistributedType.MODEL_PARALLEL):
  UpperCamelCase      :   Optional[int]			      =  _ask_field(
      "How many machines do you want use? [1]: "				,  _lowerCAmelCase				,  default=1				,  )

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







__lowerCamelCase			:	Any					    =	9.8_0_6_6_5



def 						A_							(	_lowerCAmelCase				,  _lowerCAmelCase				,  _lowerCAmelCase = g	)		->					float:

 if fluid_density <= 0:
  raise ValueError("Impossible fluid density"	)
 if volume < 0:
  raise ValueError("Impossible Object volume"	)
 if gravity <= 0:
  raise ValueError("Impossible Gravity"	)

 return fluid_density * gravity * volume


if __name__ == "__main__":
    import doctest

    # run doctest
    doctest.testmod()
