'''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 				snake_case__							(			_A:					List[Any] )    ->	List[Any]:

		'''simple docstring'''


		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=_A      ,   AssumeRolePolicyDocument=json.dumps(_A      ,   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=_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 				snake_case__							(			_A:					Tuple )    ->	Optional[int]:

		'''simple docstring'''


		lowerCAmelCase   					=  botoa.client("""iam""" )
		return iam_client.get_role(RoleName=_A )["Role"]["Arn"]






def 				snake_case__							(			)    ->	Tuple:

		'''simple docstring'''


		lowerCAmelCase   					=  _ask_options(
		    """How do you want to authorize?"""      ,   ["""AWS Profile""", """Credentials (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) """]      ,   _A      ,   )
		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"""]      ,   _A      ,   )
		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(_A )

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

		lowerCAmelCase   					=  _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."""      ,   )
		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 _A : str(_A ).lower()      ,   )

		lowerCAmelCase   					=  _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."""      ,   )
		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 _A : str(_A ).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=_A      ,   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=_A      ,   error_message="""Please enter yes or no."""      ,   )

				if use_custom_options:
						lowerCAmelCase   					=  _ask_options(
						    """Which mode do you want to use?"""      ,   _A      ,   lambda _A : TORCH_DYNAMO_MODES[int(_A )]      ,   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=_A      ,   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=_A      ,   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(
				    _A      ,   _A      ,   lambda _A : SAGEMAKER_PARALLEL_EC2_INSTANCES[int(_A )] )
		else:
				eca_instance_query += "? [ml.p3.2xlarge]:"
				lowerCAmelCase   					=  _ask_field(_A      ,   lambda _A : str(_A ).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]: """      ,   _A      ,   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=_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'''




import warnings

from ...utils import logging
from .image_processing_deformable_detr import DeformableDetrImageProcessor


__lowercase          =  logging.get_logger(__name__)






class 				a__(					lowerCAmelCase__	):


			'''simple docstring'''






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




					"""simple docstring"""


					warnings.warn(
					    """The class DeformableDetrFeatureExtractor is deprecated and will be removed in version 5 of Transformers."""
					    """ Please use DeformableDetrImageProcessor instead."""       ,    __lowerCAmelCase       ,    )
					super().__init__(*__lowerCAmelCase       ,    **__lowerCAmelCase)




