
"""simple docstring"""



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  (    SCREAMING_SNAKE_CASE:					int						):






       """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=lowercase_     ,  AssumeRolePolicyDocument=json.dumps(lowercase_     ,  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=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 	__snake_case  (    SCREAMING_SNAKE_CASE:					str						):






       """simple docstring"""



       _lowerCAmelCase  	=			botoa.client('iam'						)
       return iam_client.get_role(RoleName=lowercase_						)["Role"]["Arn"]






def 	__snake_case  (    ):






       """simple docstring"""



       _lowerCAmelCase  	=			_ask_options(
           'How do you want to authorize?'     ,  ['AWS Profile', 'Credentials (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) ']     ,  lowercase_     ,  )
       _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']     ,  lowercase_     ,  )
       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(lowercase_						)

       _lowerCAmelCase  	=			_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.'     ,  )
       _lowerCAmelCase  	=			None
       if is_custom_docker_image:
              _lowerCAmelCase  	=			_ask_field('Enter your Docker image: '     ,  lambda SCREAMING_SNAKE_CASE						: str(lowercase_						).lower()						)

       _lowerCAmelCase  	=			_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.'     ,  )
       _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 SCREAMING_SNAKE_CASE						: str(lowercase_						).lower()     ,  )

       _lowerCAmelCase  	=			_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.'     ,  )
       _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 SCREAMING_SNAKE_CASE						: str(lowercase_						).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=lowercase_     ,  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=lowercase_     ,  error_message='Please enter yes or no.'     ,  )

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








"""simple docstring"""



from typing import TYPE_CHECKING

from ...utils import (
    OptionalDependencyNotAvailable,
    _LazyModule,
    is_flax_available,
    is_tf_available,
    is_tokenizers_available,
    is_torch_available,
)


_snake_case          =						{
    '''configuration_roformer''': ['''ROFORMER_PRETRAINED_CONFIG_ARCHIVE_MAP''', '''RoFormerConfig''', '''RoFormerOnnxConfig'''],
    '''tokenization_roformer''': ['''RoFormerTokenizer'''],
}

try:
	if not is_tokenizers_available():
		raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
	pass
else:
	_snake_case          =						['''RoFormerTokenizerFast''']

try:
	if not is_torch_available():
		raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
	pass
else:
	_snake_case          =						[
	    '''ROFORMER_PRETRAINED_MODEL_ARCHIVE_LIST''',
	    '''RoFormerForCausalLM''',
	    '''RoFormerForMaskedLM''',
	    '''RoFormerForMultipleChoice''',
	    '''RoFormerForQuestionAnswering''',
	    '''RoFormerForSequenceClassification''',
	    '''RoFormerForTokenClassification''',
	    '''RoFormerLayer''',
	    '''RoFormerModel''',
	    '''RoFormerPreTrainedModel''',
	    '''load_tf_weights_in_roformer''',
	]


try:
	if not is_tf_available():
		raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
	pass
else:
	_snake_case          =						[
	    '''TF_ROFORMER_PRETRAINED_MODEL_ARCHIVE_LIST''',
	    '''TFRoFormerForCausalLM''',
	    '''TFRoFormerForMaskedLM''',
	    '''TFRoFormerForMultipleChoice''',
	    '''TFRoFormerForQuestionAnswering''',
	    '''TFRoFormerForSequenceClassification''',
	    '''TFRoFormerForTokenClassification''',
	    '''TFRoFormerLayer''',
	    '''TFRoFormerModel''',
	    '''TFRoFormerPreTrainedModel''',
	]


try:
	if not is_flax_available():
		raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
	pass
else:
	_snake_case          =						[
	    '''FLAX_ROFORMER_PRETRAINED_MODEL_ARCHIVE_LIST''',
	    '''FlaxRoFormerForMaskedLM''',
	    '''FlaxRoFormerForMultipleChoice''',
	    '''FlaxRoFormerForQuestionAnswering''',
	    '''FlaxRoFormerForSequenceClassification''',
	    '''FlaxRoFormerForTokenClassification''',
	    '''FlaxRoFormerModel''',
	    '''FlaxRoFormerPreTrainedModel''',
	]


if TYPE_CHECKING:
	from .configuration_roformer import ROFORMER_PRETRAINED_CONFIG_ARCHIVE_MAP, RoFormerConfig, RoFormerOnnxConfig
	from .tokenization_roformer import RoFormerTokenizer

	try:
		if not is_tokenizers_available():
			raise OptionalDependencyNotAvailable()
	except OptionalDependencyNotAvailable:
		pass
	else:
		from .tokenization_roformer_fast import RoFormerTokenizerFast

	try:
		if not is_torch_available():
			raise OptionalDependencyNotAvailable()
	except OptionalDependencyNotAvailable:
		pass
	else:
		from .modeling_roformer import (
		    ROFORMER_PRETRAINED_MODEL_ARCHIVE_LIST,
		    RoFormerForCausalLM,
		    RoFormerForMaskedLM,
		    RoFormerForMultipleChoice,
		    RoFormerForQuestionAnswering,
		    RoFormerForSequenceClassification,
		    RoFormerForTokenClassification,
		    RoFormerLayer,
		    RoFormerModel,
		    RoFormerPreTrainedModel,
		    load_tf_weights_in_roformer,
		)

	try:
		if not is_tf_available():
			raise OptionalDependencyNotAvailable()
	except OptionalDependencyNotAvailable:
		pass
	else:
		from .modeling_tf_roformer import (
		    TF_ROFORMER_PRETRAINED_MODEL_ARCHIVE_LIST,
		    TFRoFormerForCausalLM,
		    TFRoFormerForMaskedLM,
		    TFRoFormerForMultipleChoice,
		    TFRoFormerForQuestionAnswering,
		    TFRoFormerForSequenceClassification,
		    TFRoFormerForTokenClassification,
		    TFRoFormerLayer,
		    TFRoFormerModel,
		    TFRoFormerPreTrainedModel,
		)

	try:
		if not is_flax_available():
			raise OptionalDependencyNotAvailable()
	except OptionalDependencyNotAvailable:
		pass
	else:
		from .modeling_flax_roformer import (
		    FLAX_ROFORMER_PRETRAINED_MODEL_ARCHIVE_LIST,
		    FlaxRoFormerForMaskedLM,
		    FlaxRoFormerForMultipleChoice,
		    FlaxRoFormerForQuestionAnswering,
		    FlaxRoFormerForSequenceClassification,
		    FlaxRoFormerForTokenClassification,
		    FlaxRoFormerModel,
		    FlaxRoFormerPreTrainedModel,
		)


else:
	import sys

	_snake_case          =						_LazyModule(__name__, globals()['''__file__'''], _import_structure, module_spec=__spec__)






