
"""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 				A_  (__a					):

					'''simple docstring'''





					A_								=    botoa.client("iam"					)

					A_								=    {
					    "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=UpperCamelCase_					, AssumeRolePolicyDocument=json.dumps(UpperCamelCase_					, indent=2					)					)
										A_								=    {
										    "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=UpperCamelCase_					, PolicyName=f'{role_name}_policy_permission'					, PolicyDocument=json.dumps(UpperCamelCase_					, indent=2					)					, )
					except iam_client.exceptions.EntityAlreadyExistsException:
										print(f'role {role_name} already exists. Using existing one'					)
def 				A_  (__a					):

					'''simple docstring'''





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




def 				A_  ():

					'''simple docstring'''





					A_								=    _ask_options(
					    "How do you want to authorize?"					, ["AWS Profile", "Credentials (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY) "]					, UpperCamelCase_					, )
					A_								=    None
					if credentials_configuration == 0:
										A_								=    _ask_field("Enter your AWS Profile name: [default] "					, default="default"					)
										A_								=    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_								=    _ask_field("AWS Access Key ID: "					)
										A_								=    aws_access_key_id

										A_								=    _ask_field("AWS Secret Access Key: "					)
										A_								=    aws_secret_access_key

					A_								=    _ask_field("Enter your AWS Region: [us-east-1]"					, default="us-east-1"					)
					A_								=    aws_region

					A_								=    _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"]					, UpperCamelCase_					, )
					if role_management == 0:
										A_								=    _ask_field("Enter your IAM role name: "					)
					else:
										A_								=    "accelerate_sagemaker_execution_role"
										print(f'Accelerate will create an iam role \"{iam_role_name}\" using the provided credentials'					)
										_create_iam_role_for_sagemaker(UpperCamelCase_					)

					A_								=    _ask_field(
					    "Do you want to use custom Docker image? [yes/NO]: "					, _convert_yes_no_to_bool					, default=UpperCamelCase_					, error_message="Please enter yes or no."					, )
					A_								=    None
					if is_custom_docker_image:
										A_								=    _ask_field("Enter your Docker image: "					, lambda __a					: str(UpperCamelCase_					).lower()					)

					A_								=    _ask_field(
					    "Do you want to provide SageMaker input channels with data locations? [yes/NO]: "					, _convert_yes_no_to_bool					, default=UpperCamelCase_					, error_message="Please enter yes or no."					, )
					A_								=    None
					if is_sagemaker_inputs_enabled:
										A_								=    _ask_field(
										    "Enter the path to the SageMaker inputs TSV file with columns (channel_name, data_location): "					, lambda __a					: str(UpperCamelCase_					).lower()					, )

					A_								=    _ask_field(
					    "Do you want to enable SageMaker metrics? [yes/NO]: "					, _convert_yes_no_to_bool					, default=UpperCamelCase_					, error_message="Please enter yes or no."					, )
					A_								=    None
					if is_sagemaker_metrics_enabled:
										A_								=    _ask_field(
										    "Enter the path to the SageMaker metrics TSV file with columns (metric_name, metric_regex): "					, lambda __a					: str(UpperCamelCase_					).lower()					, )

					A_								=    _ask_options(
					    "What is the distributed mode?"					, ["No distributed training", "Data parallelism"]					, _convert_sagemaker_distributed_mode					, )
					A_								=    {}
					A_								=    _ask_field(
					    "Do you wish to optimize your script with torch dynamo?[yes/NO]:"					, _convert_yes_no_to_bool					, default=UpperCamelCase_					, error_message="Please enter yes or no."					, )
					if use_dynamo:
										A_								=    "dynamo_"
										A_								=    _ask_options(
										    "Which dynamo backend would you like to use?"					, [x.lower() for x in DYNAMO_BACKENDS]					, _convert_dynamo_backend					, default=2					, )
										A_								=    _ask_field(
										    "Do you want to customize the defaults sent to torch.compile? [yes/NO]: "					, _convert_yes_no_to_bool					, default=UpperCamelCase_					, error_message="Please enter yes or no."					, )

										if use_custom_options:
															A_								=    _ask_options(
															    "Which mode do you want to use?"					, UpperCamelCase_					, lambda __a					: TORCH_DYNAMO_MODES[int(UpperCamelCase_					)]					, default="default"					, )
															A_								=    _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=UpperCamelCase_					, error_message="Please enter yes or no."					, )
															A_								=    _ask_field(
															    "Do you want to enable dynamic shape tracing? [yes/NO]: "					, _convert_yes_no_to_bool					, default=UpperCamelCase_					, error_message="Please enter yes or no."					, )
					A_								=    "Which EC2 instance type you want to use for your training?"
					if distributed_type != SageMakerDistributedType.NO:
										A_								=    _ask_options(
										    UpperCamelCase_					, UpperCamelCase_					, lambda __a					: SAGEMAKER_PARALLEL_EC2_INSTANCES[int(UpperCamelCase_					)]					)
					else:
										eca_instance_query += "? [ml.p3.2xlarge]:"
										A_								=    _ask_field(UpperCamelCase_					, lambda __a					: str(UpperCamelCase_					).lower()					, default="ml.p3.2xlarge"					)

					A_								=    1
					if distributed_type in (SageMakerDistributedType.DATA_PARALLEL, SageMakerDistributedType.MODEL_PARALLEL):
										A_								=    _ask_field(
										    "How many machines do you want use? [1]: "					, UpperCamelCase_					, default=1					, )

					A_								=    _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=UpperCamelCase_					, compute_environment=ComputeEnvironment.AMAZON_SAGEMAKER					, distributed_type=UpperCamelCase_					, use_cpu=UpperCamelCase_					, dynamo_config=UpperCamelCase_					, eca_instance_type=UpperCamelCase_					, profile=UpperCamelCase_					, region=UpperCamelCase_					, iam_role_name=UpperCamelCase_					, mixed_precision=UpperCamelCase_					, num_machines=UpperCamelCase_					, sagemaker_inputs_file=UpperCamelCase_					, sagemaker_metrics_file=UpperCamelCase_					, )








'''simple docstring'''
import argparse
import json
import re
from pathlib import Path

import requests
import torch
from huggingface_hub import hf_hub_download
from PIL import Image

from transformers import (
    MobileNetVaConfig,
    MobileNetVaForImageClassification,
    MobileNetVaImageProcessor,
    load_tf_weights_in_mobilenet_va,
)
from transformers.utils import logging


logging.set_verbosity_info()
__SCREAMING_SNAKE_CASE					:				List[Any]									=		logging.get_logger(__name__)







def       a_				(	UpperCamelCase_ ):
							A_			    =		MobileNetVaConfig(layer_norm_eps=0.001 )

							if "_quant" in model_name:
														raise ValueError("Quantized models are not supported." )

							A_			    =		re.match(R"^mobilenet_v1_([^_]*)_([^_]*)$"						,  UpperCamelCase_ )
							if matches:
														A_			    =		float(matches[1] )
														A_			    =		int(matches[2] )

							# The TensorFlow version of MobileNetV1 predicts 1001 classes instead of
							# the usual 1000. The first class (index 0) is "background".
							A_			    =		1_0_0_1
							A_			    =		"imagenet-1k-id2label.json"
							A_			    =		"huggingface/label-files"
							A_			    =		json.load(open(hf_hub_download(UpperCamelCase_						,  UpperCamelCase_						,  repo_type="dataset" )						,  "r" ) )
							A_			    =		{int(UpperCamelCase_ ) + 1: v for k, v in idalabel.items()}
							A_			    =		"background"
							A_			    =		idalabel
							A_			    =		{v: k for k, v in idalabel.items()}

							return config







def       a_				(	):
							A_			    =		"http://images.cocodataset.org/val2017/000000039769.jpg"
							A_			    =		Image.open(requests.get(UpperCamelCase_						,  stream=UpperCamelCase_ ).raw )
							return im







@torch.no_grad()
def       a_				(	UpperCamelCase_						,  UpperCamelCase_						,  UpperCamelCase_						,  UpperCamelCase_=False ):
							A_			    =		get_mobilenet_va_config(UpperCamelCase_ )

							# Load 🤗 model
							A_			    =		MobileNetVaForImageClassification(UpperCamelCase_ ).eval()

							# Load weights from TensorFlow checkpoint
							load_tf_weights_in_mobilenet_va(UpperCamelCase_						,  UpperCamelCase_						,  UpperCamelCase_ )

							# Check outputs on an image, prepared by MobileNetV1ImageProcessor
							A_			    =		MobileNetVaImageProcessor(
							    crop_size={"width": config.image_size, "height": config.image_size}						,  size={"shortest_edge": config.image_size + 3_2}						,  )
							A_			    =		image_processor(images=prepare_img()						,  return_tensors="pt" )
							A_			    =		model(**UpperCamelCase_ )
							A_			    =		outputs.logits

							assert logits.shape == (1, 1_0_0_1)

							if model_name == "mobilenet_v1_1.0_224":
														A_			    =		torch.tensor([-4.1739, -1.1233, 3.1205] )
							elif model_name == "mobilenet_v1_0.75_192":
														A_			    =		torch.tensor([-3.9440, -2.3141, -0.3333] )
							else:
														A_			    =		None

							if expected_logits is not None:
														assert torch.allclose(logits[0, :3]						,  UpperCamelCase_						,  atol=1e-4 )

							Path(UpperCamelCase_ ).mkdir(exist_ok=UpperCamelCase_ )
							print(f"Saving model {model_name} to {pytorch_dump_folder_path}" )
							model.save_pretrained(UpperCamelCase_ )
							print(f"Saving image processor to {pytorch_dump_folder_path}" )
							image_processor.save_pretrained(UpperCamelCase_ )

							if push_to_hub:
														print("Pushing to the hub..." )
														A_			    =		"google/" + model_name
														image_processor.push_to_hub(UpperCamelCase_ )
														model.push_to_hub(UpperCamelCase_ )


if __name__ == "__main__":
							__SCREAMING_SNAKE_CASE					:				int									=		argparse.ArgumentParser()
							# Required parameters
							parser.add_argument(
							    '''--model_name''',
							    default='''mobilenet_v1_1.0_224''',
							    type=str,
							    help='''Name of the MobileNetV1 model you\'d like to convert. Should in the form \'mobilenet_v1_<depth>_<size>\'.''',
							)
							parser.add_argument(
							    '''--checkpoint_path''', required=True, type=str, help='''Path to the original TensorFlow checkpoint (.ckpt file).'''
							)
							parser.add_argument(
							    '''--pytorch_dump_folder_path''', required=True, type=str, help='''Path to the output PyTorch model directory.'''
							)
							parser.add_argument(
							    '''--push_to_hub''', action='''store_true''', help='''Whether or not to push the converted model to the 🤗 hub.'''
							)

							__SCREAMING_SNAKE_CASE					:				Dict									=		parser.parse_args()
							convert_movilevit_checkpoint(
							    args.model_name, args.checkpoint_path, args.pytorch_dump_folder_path, args.push_to_hub
							)





