


"""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       lowerCamelCase					(a_						:Tuple)     ->							Optional[int]:
       lowercase		:Union[str, Any]       							=				botoa.client('''iam''')

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






def       lowerCamelCase					(a_						:Optional[Any])     ->							List[Any]:
       lowercase		:Dict       							=				botoa.client('''iam''')
       return iam_client.get_role(RoleName=a_)["Role"]["Arn"]






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

              lowercase		:List[str]       							=				_ask_field('''AWS Secret Access Key: ''')
              lowercase		:Dict       							=				aws_secret_access_key

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

       lowercase		:Any       							=				_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''']				,				a_				,				)
       if role_management == 0:
              lowercase		:str       							=				_ask_field('''Enter your IAM role name: ''')
       else:
              lowercase		:List[str]       							=				'''accelerate_sagemaker_execution_role'''
              print(F"""Accelerate will create an iam role \"{iam_role_name}\" using the provided credentials""")
              _create_iam_role_for_sagemaker(a_)

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

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

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

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

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

       lowercase		:Optional[int]       							=				1
       if distributed_type in (SageMakerDistributedType.DATA_PARALLEL, SageMakerDistributedType.MODEL_PARALLEL):
              lowercase		:Dict       							=				_ask_field(
                  '''How many machines do you want use? [1]: '''				,				a_				,				default=1				,				)

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





"""simple docstring"""



# Copyright 2023 The HuggingFace Inc. 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 re

from ..utils import cached_file


# docstyle-ignore
UpperCAmelCase      		=			'''
Human: <<task>>

Assistant: '''


UpperCAmelCase      		=			'''huggingface-tools/default-prompts'''
UpperCAmelCase      		=			{'''chat''': '''chat_prompt_template.txt''', '''run''': '''run_prompt_template.txt'''}






def       lowerCamelCase					(a_						:int				,				a_						:str				,				a_						:Dict="run")     ->							Optional[Any]:
       if prompt_or_repo_id is None:
              lowercase		:Tuple       							=				DEFAULT_PROMPTS_REPO

       # prompt is considered a repo ID when it does not contain any kind of space
       if re.search('''\\s'''				,				a_) is not None:
              return prompt_or_repo_id

       lowercase		:List[str]       							=				cached_file(
           a_				,				PROMPT_FILES[mode]				,				repo_type='''dataset'''				,				user_agent={'''agent''': agent_name})
       with open(a_				,				'''r'''				,				encoding='''utf-8''') as f:
              return f.read()

