





# 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  )		->				Tuple:
 UpperCamelCase			:      Any 			=     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			:      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=_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  )		->				Union[str, Any]:
 UpperCamelCase			:      int 			=     botoa.client("iam"  )
 return iam_client.get_role(RoleName=_lowerCAmelCase  )["Role"]["Arn"]



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

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

 UpperCamelCase			:      Union[str, Any] 			=     _ask_field("Enter your AWS Region: [us-east-1]"							,     default="us-east-1"  )
 UpperCamelCase			:      Optional[int] 			=     aws_region

 UpperCamelCase			:      int 			=     _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			:      List[str] 			=     _ask_field("Enter your IAM role name: "  )
 else:
  UpperCamelCase			:      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(_lowerCAmelCase  )

 UpperCamelCase			:      str 			=     _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			:      Union[str, Any] 			=     None
 if is_custom_docker_image:
  UpperCamelCase			:      Optional[Any] 			=     _ask_field("Enter your Docker image: "							,     lambda _lowerCAmelCase  : str(_lowerCAmelCase  ).lower()  )

 UpperCamelCase			:      int 			=     _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			:      str 			=     _ask_field(
      "Enter the path to the SageMaker inputs TSV file with columns (channel_name, data_location): "							,     lambda _lowerCAmelCase  : str(_lowerCAmelCase  ).lower()							,     )

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

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

 UpperCamelCase			:      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=_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							,     )







from typing import Callable, Optional

from .. import Features
from ..packaged_modules.generator.generator import Generator
from .abc import AbstractDatasetInputStream



class       A__     ( __snake_case    ):





      def __init__(				self ,							A_ ,							A_ = None ,							A_ = None ,							A_ = False ,							A_ = False ,							A_ = None ,							A_ = None ,							**A_ ,							):
       '''simple docstring'''




       super().__init__(
           features=A_ ,							cache_dir=A_ ,							keep_in_memory=A_ ,							streaming=A_ ,							num_proc=A_ ,							**A_ ,							)
       UpperCamelCase			:      Optional[int] 			=     Generator(
           cache_dir=A_ ,							features=A_ ,							generator=A_ ,							gen_kwargs=A_ ,							**A_ ,							)





      def  __UpperCamelCase(				self     ):
       '''simple docstring'''




       if self.streaming:
        UpperCamelCase			:      Optional[Any] 			=     self.builder.as_streaming_dataset(split="train"     )
       # Build regular (map-style) dataset
       else:
        UpperCamelCase			:      Union[str, Any] 			=     None
        UpperCamelCase			:      Union[str, Any] 			=     None
        UpperCamelCase			:      List[Any] 			=     None
        UpperCamelCase			:      List[str] 			=     None

        self.builder.download_and_prepare(
            download_config=A_ ,							download_mode=A_ ,							verification_mode=A_ ,							base_path=A_ ,							num_proc=self.num_proc ,							)
        UpperCamelCase			:      int 			=     self.builder.as_dataset(
            split="train" ,							verification_mode=A_ ,							in_memory=self.keep_in_memory     )
       return dataset
