# 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						(	__lowercase						:			List[Any]     ):
		'''simple docstring'''




		A_		:    str         =				botoa.client('iam'     )

		A_		:    Tuple         =				{
		    '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     )     )
				A_		:    Tuple         =				{
				    '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     UpperCamelCase						(	__lowercase						:			int     ):
		'''simple docstring'''




		A_		:    int         =				botoa.client('iam'     )
		return iam_client.get_role(RoleName=__lowercase     )["Role"]["Arn"]




def     UpperCamelCase						(	):
		'''simple docstring'''




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

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

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

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

		A_		:    Optional[int]         =				_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.'						,)
		A_		:    Dict         =				None
		if is_custom_docker_image:
				A_		:    Union[str, Any]         =				_ask_field('Enter your Docker image: '						,lambda __lowercase     : str(__lowercase     ).lower()     )

		A_		:    List[str]         =				_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.'						,)
		A_		:    int         =				None
		if is_sagemaker_inputs_enabled:
				A_		:    Dict         =				_ask_field(
				    'Enter the path to the SageMaker inputs TSV file with columns (channel_name, data_location): '						,lambda __lowercase     : str(__lowercase     ).lower()						,)

		A_		:    List[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.'						,)
		A_		:    Optional[Any]         =				None
		if is_sagemaker_metrics_enabled:
				A_		:    Any         =				_ask_field(
				    'Enter the path to the SageMaker metrics TSV file with columns (metric_name, metric_regex): '						,lambda __lowercase     : str(__lowercase     ).lower()						,)

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

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

		A_		:    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=__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						,)







import warnings

from ...utils import logging
from .image_processing_donut import DonutImageProcessor


_UpperCAmelCase            =		logging.get_logger(__name__)





class UpperCAmelCase						( __A  ):


				'''simple docstring'''






				def __init__(						self		,     *lowercase		,     **lowercase ):



						"""simple docstring"""





						warnings.warn(
						    'The class DonutFeatureExtractor is deprecated and will be removed in version 5 of Transformers. Please'
						    ' use DonutImageProcessor instead.'		,     lowercase		,     )
						super().__init__(*lowercase		,     **lowercase )






