






"""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__       (  snake_case       : Dict				)->		List[str]:






     '''simple docstring'''



     UpperCAmelCase__						:    Optional[int]							=							botoa.client("iam"				)

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


def 	SCREAMING_SNAKE_CASE__       (  snake_case       : Optional[int]				)->		Any:






     '''simple docstring'''



     UpperCAmelCase__						:    Dict							=							botoa.client("iam"				)
     return iam_client.get_role(RoleName=snake_case				)["Role"]["Arn"]



def 	SCREAMING_SNAKE_CASE__       (  )->		int:






     '''simple docstring'''



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

          UpperCAmelCase__						:    List[Any]							=							_ask_field("AWS Secret Access Key: "				)
          UpperCAmelCase__						:    Optional[int]							=							aws_secret_access_key

     UpperCAmelCase__						:    Tuple							=							_ask_field("Enter your AWS Region: [us-east-1]"			,					default="us-east-1"				)
     UpperCAmelCase__						:    List[str]							=							aws_region

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

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

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

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

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

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

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

     UpperCAmelCase__						:    Union[str, Any]							=							_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=snake_case			,					compute_environment=ComputeEnvironment.AMAZON_SAGEMAKER			,					distributed_type=snake_case			,					use_cpu=snake_case			,					dynamo_config=snake_case			,					eca_instance_type=snake_case			,					profile=snake_case			,					region=snake_case			,					iam_role_name=snake_case			,					mixed_precision=snake_case			,					num_machines=snake_case			,					sagemaker_inputs_file=snake_case			,					sagemaker_metrics_file=snake_case			,					)










"""simple docstring"""



def 	SCREAMING_SNAKE_CASE__       (  snake_case       : int			,					snake_case       : int				)->		str:






     '''simple docstring'''



     if not isinstance(snake_case			,					snake_case				):
          raise ValueError("iterations must be defined as integers"				)
     if not isinstance(snake_case			,					snake_case				) or not number >= 1:
          raise ValueError(
              "starting number must be\n                         and integer and be more than 0"				)
     if not iterations >= 1:
          raise ValueError("Iterations must be done more than 0 times to play FizzBuzz"				)

     UpperCAmelCase__						:    str							=							""
     while number <= iterations:
          if number % 3 == 0:
               out += "Fizz"
          if number % 5 == 0:
               out += "Buzz"
          if 0 not in (number % 3, number % 5):
               out += str(snake_case				)

          # print(out)
          number += 1
          out += " "
     return out


if __name__ == "__main__":
 import doctest

 doctest.testmod()


