
'''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 A (__lowerCamelCase :int						):
						_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 :List[str]						):
						_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					,      )






'''simple docstring'''
import os
from typing import List, Optional, Union

from ...image_processing_utils import BatchFeature
from ...image_utils import ImageInput
from ...processing_utils import ProcessorMixin
from ...tokenization_utils_base import PaddingStrategy, PreTokenizedInput, TextInput, TruncationStrategy
from ...utils import TensorType
from ..auto import AutoTokenizer
class   __UpperCAmelCase				(     lowerCAmelCase				):



					'''simple docstring'''





					_UpperCamelCase							=		["""image_processor""", """tokenizer"""]
					_UpperCamelCase							=		"""BlipImageProcessor"""
					_UpperCamelCase							=		"""AutoTokenizer"""



					def __init__(	self     :						Union[str, Any]      ,       _lowercase     :						Union[str, Any]      ,       _lowercase     :						List[Any]      ,       _lowercase     :						List[str])    ->							Union[str, Any]:
								super().__init__(_lowercase      ,       _lowercase)

								# add QFormer tokenizer
								A_									= qformer_tokenizer



					def __call__(	self     :						Optional[int]      ,       _lowercase     :						ImageInput = None      ,       _lowercase     :						Union[TextInput, PreTokenizedInput, List[TextInput], List[PreTokenizedInput]] = None      ,       _lowercase     :						bool = True      ,       _lowercase     :						Union[bool, str, PaddingStrategy] = False      ,       _lowercase     :						Union[bool, str, TruncationStrategy] = None      ,       _lowercase     :						Optional[int] = None      ,       _lowercase     :						int = 0      ,       _lowercase     :						Optional[int] = None      ,       _lowercase     :						Optional[bool] = None      ,       _lowercase     :						bool = False      ,       _lowercase     :						bool = False      ,       _lowercase     :						bool = False      ,       _lowercase     :						bool = False      ,       _lowercase     :						bool = False      ,       _lowercase     :						bool = True      ,       _lowercase     :						Optional[Union[str, TensorType]] = None      ,       **_lowercase     :						List[Any]      ,       )    ->							BatchFeature:
								if images is None and text is None:
											raise ValueError('You have to specify at least images or text.')

								A_									= BatchFeature()

								if text is not None:
											A_									= self.tokenizer(
											    text=_lowercase      ,       add_special_tokens=_lowercase      ,       padding=_lowercase      ,       truncation=_lowercase      ,       max_length=_lowercase      ,       stride=_lowercase      ,       pad_to_multiple_of=_lowercase      ,       return_attention_mask=_lowercase      ,       return_overflowing_tokens=_lowercase      ,       return_special_tokens_mask=_lowercase      ,       return_offsets_mapping=_lowercase      ,       return_token_type_ids=_lowercase      ,       return_length=_lowercase      ,       verbose=_lowercase      ,       return_tensors=_lowercase      ,       **_lowercase      ,       )
											encoding.update(_lowercase)
											A_									= self.qformer_tokenizer(
											    text=_lowercase      ,       add_special_tokens=_lowercase      ,       padding=_lowercase      ,       truncation=_lowercase      ,       max_length=_lowercase      ,       stride=_lowercase      ,       pad_to_multiple_of=_lowercase      ,       return_attention_mask=_lowercase      ,       return_overflowing_tokens=_lowercase      ,       return_special_tokens_mask=_lowercase      ,       return_offsets_mapping=_lowercase      ,       return_token_type_ids=_lowercase      ,       return_length=_lowercase      ,       verbose=_lowercase      ,       return_tensors=_lowercase      ,       **_lowercase      ,       )
											A_									= qformer_text_encoding.pop('input_ids')
											A_									= qformer_text_encoding.pop('attention_mask')

								if images is not None:
											A_									= self.image_processor(_lowercase      ,       return_tensors=_lowercase)
											encoding.update(_lowercase)

								return encoding



					def     __snake_case						(	self     :						List[Any]      ,       *_lowercase     :						Optional[Any]      ,       **_lowercase     :						List[Any])    ->							Union[str, Any]:
								return self.tokenizer.batch_decode(*_lowercase      ,       **_lowercase)



					def     __snake_case						(	self     :						Optional[int]      ,       *_lowercase     :						List[Any]      ,       **_lowercase     :						List[str])    ->							str:
								return self.tokenizer.decode(*_lowercase      ,       **_lowercase)



					@property
					# Copied from transformers.models.blip.processing_blip.BlipProcessor.model_input_names
					def     __snake_case						(	self     :						Any)    ->							Optional[int]:
								A_									= self.tokenizer.model_input_names
								A_									= self.image_processor.model_input_names
								return list(dict.fromkeys(tokenizer_input_names + image_processor_input_names))



					def     __snake_case						(	self     :						Optional[Any]      ,       _lowercase     :						Optional[int]      ,       **_lowercase     :						int)    ->							Tuple:
								if os.path.isfile(_lowercase):
											raise ValueError(F'Provided path ({save_directory}) should be a directory, not a file')
								os.makedirs(_lowercase      ,       exist_ok=_lowercase)
								A_									= os.path.join(_lowercase      ,       'qformer_tokenizer')
								self.qformer_tokenizer.save_pretrained(_lowercase)
								return super().save_pretrained(_lowercase      ,       **_lowercase)



					@classmethod
					def     __snake_case						(	cls     :						Dict      ,       _lowercase     :						Dict      ,       **_lowercase     :						int)    ->							Any:
								A_									= AutoTokenizer.from_pretrained(_lowercase      ,       subfolder='qformer_tokenizer')
								A_									= cls._get_arguments_from_pretrained(_lowercase      ,       **_lowercase)
								args.append(_lowercase)
								return cls(*_lowercase)




