# 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       lowerCAmelCase_     (		lowercase:							Union[str, Any]		)    ->				Any:







 '''simple docstring'''
 _UpperCamelCase:     Union[str, Any]							= botoa.client('''iam'''		)

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




def       lowerCAmelCase_     (		lowercase:							Any		)    ->				Optional[Any]:







 '''simple docstring'''
 _UpperCamelCase:     str							= botoa.client('''iam'''		)
 return iam_client.get_role(RoleName=lowercase		)["Role"]["Arn"]





def       lowerCAmelCase_     (		)    ->				int:







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

  _UpperCamelCase:     Any							= _ask_field('''AWS Secret Access Key: '''		)
  _UpperCamelCase:     str							= aws_secret_access_key

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

 _UpperCamelCase:     Optional[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''']  ,					lowercase  ,					)
 if role_management == 0:
  _UpperCamelCase:     Any							= _ask_field('''Enter your IAM role name: '''		)
 else:
  _UpperCamelCase:     Optional[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(lowercase		)

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

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

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

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

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

 _UpperCamelCase:     Optional[Any]							= 1
 if distributed_type in (SageMakerDistributedType.DATA_PARALLEL, SageMakerDistributedType.MODEL_PARALLEL):
  _UpperCamelCase:     Optional[Any]							= _ask_field(
      '''How many machines do you want use? [1]: '''  ,					lowercase  ,					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=lowercase  ,					compute_environment=ComputeEnvironment.AMAZON_SAGEMAKER  ,					distributed_type=lowercase  ,					use_cpu=lowercase  ,					dynamo_config=lowercase  ,					eca_instance_type=lowercase  ,					profile=lowercase  ,					region=lowercase  ,					iam_role_name=lowercase  ,					mixed_precision=lowercase  ,					num_machines=lowercase  ,					sagemaker_inputs_file=lowercase  ,					sagemaker_metrics_file=lowercase  ,					)
from typing import TYPE_CHECKING

from ...utils import (
    OptionalDependencyNotAvailable,
    _LazyModule,
    is_flax_available,
    is_tf_available,
    is_tokenizers_available,
    is_torch_available,
)


UpperCAmelCase_			    =							{
    '''configuration_blenderbot''': [
        '''BLENDERBOT_PRETRAINED_CONFIG_ARCHIVE_MAP''',
        '''BlenderbotConfig''',
        '''BlenderbotOnnxConfig''',
    ],
    '''tokenization_blenderbot''': ['''BlenderbotTokenizer'''],
}

try:
  if not is_tokenizers_available():
    raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
  pass
else:
  UpperCAmelCase_			    =							['''BlenderbotTokenizerFast''']

try:
  if not is_torch_available():
    raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
  pass
else:
  UpperCAmelCase_			    =							[
      '''BLENDERBOT_PRETRAINED_MODEL_ARCHIVE_LIST''',
      '''BlenderbotForCausalLM''',
      '''BlenderbotForConditionalGeneration''',
      '''BlenderbotModel''',
      '''BlenderbotPreTrainedModel''',
  ]


try:
  if not is_tf_available():
    raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
  pass
else:
  UpperCAmelCase_			    =							[
      '''TFBlenderbotForConditionalGeneration''',
      '''TFBlenderbotModel''',
      '''TFBlenderbotPreTrainedModel''',
  ]


try:
  if not is_flax_available():
    raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
  pass
else:
  UpperCAmelCase_			    =							[
      '''FlaxBlenderbotForConditionalGeneration''',
      '''FlaxBlenderbotModel''',
      '''FlaxBlenderbotPreTrainedModel''',
  ]


if TYPE_CHECKING:
  from .configuration_blenderbot import (
      BLENDERBOT_PRETRAINED_CONFIG_ARCHIVE_MAP,
      BlenderbotConfig,
      BlenderbotOnnxConfig,
  )
  from .tokenization_blenderbot import BlenderbotTokenizer

  try:
    if not is_tokenizers_available():
      raise OptionalDependencyNotAvailable()
  except OptionalDependencyNotAvailable:
    pass
  else:
    from .tokenization_blenderbot_fast import BlenderbotTokenizerFast

  try:
    if not is_torch_available():
      raise OptionalDependencyNotAvailable()
  except OptionalDependencyNotAvailable:
    pass
  else:
    from .modeling_blenderbot import (
        BLENDERBOT_PRETRAINED_MODEL_ARCHIVE_LIST,
        BlenderbotForCausalLM,
        BlenderbotForConditionalGeneration,
        BlenderbotModel,
        BlenderbotPreTrainedModel,
    )

  try:
    if not is_tf_available():
      raise OptionalDependencyNotAvailable()
  except OptionalDependencyNotAvailable:
    pass
  else:
    from .modeling_tf_blenderbot import (
        TFBlenderbotForConditionalGeneration,
        TFBlenderbotModel,
        TFBlenderbotPreTrainedModel,
    )

  try:
    if not is_flax_available():
      raise OptionalDependencyNotAvailable()
  except OptionalDependencyNotAvailable:
    pass
  else:
    from .modeling_flax_blenderbot import (
        FlaxBlenderbotForConditionalGeneration,
        FlaxBlenderbotModel,
        FlaxBlenderbotPreTrainedModel,
    )

else:
  import sys

  UpperCAmelCase_			    =							_LazyModule(__name__, globals()['''__file__'''], _import_structure, module_spec=__spec__)