

from . import (
    albert,
    align,
    altclip,
    audio_spectrogram_transformer,
    auto,
    autoformer,
    bark,
    bart,
    barthez,
    bartpho,
    beit,
    bert,
    bert_generation,
    bert_japanese,
    bertweet,
    big_bird,
    bigbird_pegasus,
    biogpt,
    bit,
    blenderbot,
    blenderbot_small,
    blip,
    blip_a,
    bloom,
    bridgetower,
    byta,
    camembert,
    canine,
    chinese_clip,
    clap,
    clip,
    clipseg,
    codegen,
    conditional_detr,
    convbert,
    convnext,
    convnextva,
    cpm,
    cpmant,
    ctrl,
    cvt,
    dataavec,
    deberta,
    deberta_va,
    decision_transformer,
    deformable_detr,
    deit,
    deprecated,
    deta,
    detr,
    dialogpt,
    dinat,
    distilbert,
    dit,
    donut,
    dpr,
    dpt,
    efficientformer,
    efficientnet,
    electra,
    encodec,
    encoder_decoder,
    ernie,
    ernie_m,
    esm,
    falcon,
    flaubert,
    flava,
    fnet,
    focalnet,
    fsmt,
    funnel,
    git,
    glpn,
    gpta,
    gpt_bigcode,
    gpt_neo,
    gpt_neox,
    gpt_neox_japanese,
    gpt_swa,
    gptj,
    gptsan_japanese,
    graphormer,
    groupvit,
    herbert,
    hubert,
    ibert,
    imagegpt,
    informer,
    instructblip,
    jukebox,
    layoutlm,
    layoutlmva,
    layoutlmva,
    layoutxlm,
    led,
    levit,
    lilt,
    llama,
    longformer,
    longta,
    luke,
    lxmert,
    mam_aaa,
    marian,
    markuplm,
    maskaformer,
    maskformer,
    mbart,
    mbartaa,
    mega,
    megatron_bert,
    megatron_gpta,
    mgp_str,
    mluke,
    mobilebert,
    mobilenet_va,
    mobilenet_va,
    mobilevit,
    mobilevitva,
    mpnet,
    mra,
    mta,
    musicgen,
    mvp,
    nat,
    nezha,
    nllb,
    nllb_moe,
    nystromformer,
    oneformer,
    open_llama,
    openai,
    opt,
    owlvit,
    pegasus,
    pegasus_x,
    perceiver,
    phobert,
    pixastruct,
    plbart,
    poolformer,
    prophetnet,
    qdqbert,
    rag,
    realm,
    reformer,
    regnet,
    rembert,
    resnet,
    roberta,
    roberta_prelayernorm,
    roc_bert,
    roformer,
    rwkv,
    sam,
    segformer,
    sew,
    sew_d,
    speech_encoder_decoder,
    speech_to_text,
    speech_to_text_a,
    speechta,
    splinter,
    squeezebert,
    swiftformer,
    swin,
    swinasr,
    swinva,
    switch_transformers,
    ta,
    table_transformer,
    tapas,
    time_series_transformer,
    timesformer,
    timm_backbone,
    transfo_xl,
    trocr,
    tvlt,
    umta,
    unispeech,
    unispeech_sat,
    upernet,
    videomae,
    vilt,
    vision_encoder_decoder,
    vision_text_dual_encoder,
    visual_bert,
    vit,
    vit_hybrid,
    vit_mae,
    vit_msn,
    vivit,
    wavaveca,
    wavaveca_conformer,
    wavaveca_phoneme,
    wavaveca_with_lm,
    wavlm,
    whisper,
    x_clip,
    xglm,
    xlm,
    xlm_prophetnet,
    xlm_roberta,
    xlm_roberta_xl,
    xlnet,
    xmod,
    yolos,
    yoso,
)








'''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 		UpperCamelCase__      (		__SCREAMING_SNAKE_CASE		)    ->   Dict:
      snake_case__       :   Optional[int]	      =    botoa.client('iam'		)

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






def 		UpperCamelCase__      (		__SCREAMING_SNAKE_CASE		)    ->   Optional[int]:
      snake_case__       :   Tuple	      =    botoa.client('iam'		)
      return iam_client.get_role(RoleName=__SCREAMING_SNAKE_CASE		)["Role"]["Arn"]






def 		UpperCamelCase__      (		)    ->   Tuple:
      snake_case__       :   Dict	      =    _ask_options(
          'How do you want to authorize?'				,      ['AWS Profile', 'Credentials (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) ']				,      __SCREAMING_SNAKE_CASE				,      )
      snake_case__       :   int	      =    None
      if credentials_configuration == 0:
            snake_case__       :   Any	      =    _ask_field('Enter your AWS Profile name: [default] '				,      default='default'		)
            snake_case__       :   Union[str, 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`'		)
            snake_case__       :   Dict	      =    _ask_field('AWS Access Key ID: '		)
            snake_case__       :   Tuple	      =    aws_access_key_id

            snake_case__       :   int	      =    _ask_field('AWS Secret Access Key: '		)
            snake_case__       :   Optional[int]	      =    aws_secret_access_key

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

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

      snake_case__       :   List[str]	      =    _ask_field(
          'Do you want to use custom Docker image? [yes/NO]: '				,      _convert_yes_no_to_bool				,      default=__SCREAMING_SNAKE_CASE				,      error_message='Please enter yes or no.'				,      )
      snake_case__       :   Dict	      =    None
      if is_custom_docker_image:
            snake_case__       :   Optional[int]	      =    _ask_field('Enter your Docker image: '				,      lambda __SCREAMING_SNAKE_CASE		: str(__SCREAMING_SNAKE_CASE		).lower()		)

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

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

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

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

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

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