



'''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			) -> Optional[Any]:
  __lowerCamelCase			:			List[Any]       			=					botoa.client('iam'			)

  __lowerCamelCase			:			Union[str, Any]       			=					{
      '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			:			Optional[int]       			=					{
        '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			) -> Dict:
  __lowerCamelCase			:			Union[str, Any]       			=					botoa.client('iam'			)
  return iam_client.get_role(RoleName=_lowerCAmelCase			)["Role"]["Arn"]


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

    __lowerCamelCase			:			Tuple       			=					_ask_field('AWS Secret Access Key: '			)
    __lowerCamelCase			:			List[Any]       			=					aws_secret_access_key

  __lowerCamelCase			:			int       			=					_ask_field('Enter your AWS Region: [us-east-1]'			,default='us-east-1'			)
  __lowerCamelCase			:			int       			=					aws_region

  __lowerCamelCase			:			Union[str, 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']			,_lowerCAmelCase			,)
  if role_management == 0:
    __lowerCamelCase			:			Optional[Any]       			=					_ask_field('Enter your IAM role name: '			)
  else:
    __lowerCamelCase			:			Dict       			=					'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			:			List[Any]       			=					_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			:			Tuple       			=					None
  if is_custom_docker_image:
    __lowerCamelCase			:			Tuple       			=					_ask_field('Enter your Docker image: '			,lambda _lowerCAmelCase			: str(_lowerCAmelCase			).lower()			)

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

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

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

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

  __lowerCamelCase			:			List[Any]       			=					_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'''





from __future__ import annotations

_UpperCamelCase											=		10

def 			a_	(				_lowerCAmelCase			) -> list[int]:
  __lowerCamelCase			:			str       			=					1
  __lowerCamelCase			:			Union[str, Any]       			=					max(_lowerCAmelCase			)
  while placement <= max_digit:
    # declare and initialize empty buckets
    __lowerCamelCase			:			list[list]       			=					[[] for _ in range(_lowerCAmelCase			)]
    # split list_of_ints between the buckets
    for i in list_of_ints:
      __lowerCamelCase			:			List[str]       			=					int((i / placement) % RADIX			)
      buckets[tmp].append(_lowerCAmelCase			)
    # put each buckets' contents into list_of_ints
    __lowerCamelCase			:			Dict       			=					0
    for b in range(_lowerCAmelCase			):
      for i in buckets[b]:
        __lowerCamelCase			:			List[str]       			=					i
        a += 1
        # move to next
    placement *= RADIX
  return list_of_ints


if __name__ == "__main__":
   import doctest

   doctest.testmod()






