




# 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				):
  lowerCAmelCase__										=      botoa.client('''iam'''				)

  lowerCAmelCase__										=      {
      '''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				)				)
    lowerCAmelCase__										=      {
        '''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				):
  lowerCAmelCase__										=      botoa.client('''iam'''				)
  return iam_client.get_role(RoleName=__lowerCAmelCase				)["Role"]["Arn"]




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

    lowerCAmelCase__										=      _ask_field('''AWS Secret Access Key: '''				)
    lowerCAmelCase__										=      aws_secret_access_key

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

  lowerCAmelCase__										=      _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:
    lowerCAmelCase__										=      _ask_field('''Enter your IAM role name: '''				)
  else:
    lowerCAmelCase__										=      '''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				)

  lowerCAmelCase__										=      _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.'''   , )
  lowerCAmelCase__										=      None
  if is_custom_docker_image:
    lowerCAmelCase__										=      _ask_field('''Enter your Docker image: '''   , lambda __lowerCAmelCase				: str(__lowerCAmelCase				).lower()				)

  lowerCAmelCase__										=      _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.'''   , )
  lowerCAmelCase__										=      None
  if is_sagemaker_inputs_enabled:
    lowerCAmelCase__										=      _ask_field(
        '''Enter the path to the SageMaker inputs TSV file with columns (channel_name, data_location): '''   , lambda __lowerCAmelCase				: str(__lowerCAmelCase				).lower()   , )

  lowerCAmelCase__										=      _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.'''   , )
  lowerCAmelCase__										=      None
  if is_sagemaker_metrics_enabled:
    lowerCAmelCase__										=      _ask_field(
        '''Enter the path to the SageMaker metrics TSV file with columns (metric_name, metric_regex): '''   , lambda __lowerCAmelCase				: str(__lowerCAmelCase				).lower()   , )

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

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

  lowerCAmelCase__										=      _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 TYPE_CHECKING

from ...utils import OptionalDependencyNotAvailable, _LazyModule, is_tokenizers_available, is_torch_available


__magic_name__  :  List[str]					=       {
    """configuration_m2m_100""": ["""M2M_100_PRETRAINED_CONFIG_ARCHIVE_MAP""", """M2M100Config""", """M2M100OnnxConfig"""],
    """tokenization_m2m_100""": ["""M2M100Tokenizer"""],
}


try:
      if not is_torch_available():
            raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
      pass
else:
      __magic_name__  :  Union[str, Any]					=       [
          """M2M_100_PRETRAINED_MODEL_ARCHIVE_LIST""",
          """M2M100ForConditionalGeneration""",
          """M2M100Model""",
          """M2M100PreTrainedModel""",
      ]


if TYPE_CHECKING:
      from .configuration_mam_aaa import M2M_100_PRETRAINED_CONFIG_ARCHIVE_MAP, MaMaaaConfig, MaMaaaOnnxConfig
      from .tokenization_mam_aaa import MaMaaaTokenizer

      try:
            if not is_torch_available():
                  raise OptionalDependencyNotAvailable()
      except OptionalDependencyNotAvailable:
            pass
      else:
            from .modeling_mam_aaa import (
                M2M_100_PRETRAINED_MODEL_ARCHIVE_LIST,
                MaMaaaForConditionalGeneration,
                MaMaaaModel,
                MaMaaaPreTrainedModel,
            )


else:
      import sys

      __magic_name__  :  List[str]					=       _LazyModule(__name__, globals()["""__file__"""], _import_structure, module_spec=__spec__)

