
"""simple docstring"""




import json
import logging
import os
import subprocess
from argparse import ArgumentParser


snake_case			       =    logging.getLogger(__name__)

def   UpperCamelCase_  (		):
					SCREAMING_SNAKE_CASE           =     ArgumentParser()
					SCREAMING_SNAKE_CASE     ,   SCREAMING_SNAKE_CASE           =     parser.parse_known_args()
					for arg in unknown:
										if arg.startswith(('-', '--')      ):
															parser.add_argument(arg.split('='      )[0]      )

					return parser.parse_args()

def   UpperCamelCase_  (		):
					SCREAMING_SNAKE_CASE           =     parse_args()
					SCREAMING_SNAKE_CASE           =     8_8_8_8
					SCREAMING_SNAKE_CASE           =     int(os.environ['SM_NUM_GPUS']      )
					SCREAMING_SNAKE_CASE           =     json.loads(os.environ['SM_HOSTS']      )
					SCREAMING_SNAKE_CASE           =     len(SCREAMING_SNAKE_CASE_      )
					SCREAMING_SNAKE_CASE           =     os.environ['SM_CURRENT_HOST']
					SCREAMING_SNAKE_CASE           =     hosts.index(SCREAMING_SNAKE_CASE_      )
					SCREAMING_SNAKE_CASE           =     'INFO'

					if num_nodes > 1:
										SCREAMING_SNAKE_CASE           =     f'''python -m torch.distributed.launch \
                --nnodes={num_nodes}  \
                --node_rank={rank}  \
                --nproc_per_node={num_gpus}  \
                --master_addr={hosts[0]}  \
                --master_port={port} \
                ./run_glue.py \
                {''.join(['nested fstring' for parameter,value in args.__dict__.items()]      )}'''
					else:
										SCREAMING_SNAKE_CASE           =     f'''python -m torch.distributed.launch \
            --nproc_per_node={num_gpus}  \
            ./run_glue.py \
            {''.join(['nested fstring' for parameter,value in args.__dict__.items()]      )}'''
					try:
										subprocess.run(SCREAMING_SNAKE_CASE_,					shell=SCREAMING_SNAKE_CASE_      )
					except Exception as e:
										logger.info(SCREAMING_SNAKE_CASE_      )


if __name__ == "__main__":
	main()


"""simple docstring"""




import timeit
from typing import Callable, Optional

from ..configuration_utils import PretrainedConfig
from ..models.auto.modeling_auto import MODEL_MAPPING, MODEL_WITH_LM_HEAD_MAPPING
from ..utils import is_pyanvml_available, is_torch_available, logging
from .benchmark_utils import (
    Benchmark,
    Memory,
    MemorySummary,
    measure_peak_memory_cpu,
    start_memory_tracing,
    stop_memory_tracing,
)


if is_torch_available():
	import torch

	from .benchmark_args import PyTorchBenchmarkArguments


if is_pyanvml_available():
	import pyanvml.pyanvml as nvml


snake_case			       =		logging.get_logger(__name__)




class 					UpperCamelCase     (	__magic_name__				):

				"""simple docstring"""



				UpperCAmelCase_    :				PyTorchBenchmarkArguments
				UpperCAmelCase_    :				PretrainedConfig
				UpperCAmelCase_    :				str						  =    "PyTorch"


				@property
				def 							A (    self      )   ->   List[str]:
									"""simple docstring"""







									return torch.__version__


				def 							A (    self		,     lowercase__		,     lowercase__		,     lowercase__      )   ->   float:
									"""simple docstring"""







									SCREAMING_SNAKE_CASE           =     self._prepare_inference_func(lowercase__		,     lowercase__		,     lowercase__      )
									return self._measure_speed(_inference      )


				def 							A (    self		,     lowercase__		,     lowercase__		,     lowercase__      )   ->   [Memory, Optional[MemorySummary]]:
									"""simple docstring"""







									SCREAMING_SNAKE_CASE           =     self._prepare_inference_func(lowercase__		,     lowercase__		,     lowercase__      )
									return self._measure_memory(_inference      )


				def 							A (    self		,     lowercase__		,     lowercase__		,     lowercase__      )   ->   float:
									"""simple docstring"""







									SCREAMING_SNAKE_CASE           =     self._prepare_train_func(lowercase__		,     lowercase__		,     lowercase__      )
									return self._measure_speed(_train      )


				def 							A (    self		,     lowercase__		,     lowercase__		,     lowercase__      )   ->   [Memory, Optional[MemorySummary]]:
									"""simple docstring"""







									SCREAMING_SNAKE_CASE           =     self._prepare_train_func(lowercase__		,     lowercase__		,     lowercase__      )
									return self._measure_memory(_train      )


				def 							A (    self		,     lowercase__		,     lowercase__		,     lowercase__      )   ->   Callable[[], None]:
									"""simple docstring"""







									SCREAMING_SNAKE_CASE           =     self.config_dict[model_name]

									if self.args.torchscript:
														SCREAMING_SNAKE_CASE           =     True

									SCREAMING_SNAKE_CASE           =     (
									    hasattr(lowercase__		,     'architectures'      )
									    and isinstance(config.architectures		,     lowercase__      )
									    and len(config.architectures      ) > 0
									)
									if not self.args.only_pretrain_model and has_model_class_in_config:
														try:
																			SCREAMING_SNAKE_CASE           =     config.architectures[0]
																			SCREAMING_SNAKE_CASE           =     __import__('transformers'		,     fromlist=[model_class]      )
																			SCREAMING_SNAKE_CASE           =     getattr(lowercase__		,     lowercase__      )
																			SCREAMING_SNAKE_CASE           =     model_cls(lowercase__      )
														except ImportError:
																			raise ImportError(
																			    f'''{model_class} does not exist. If you just want to test the pretrained model, you might want to'''
																			    ' set `--only_pretrain_model` or `args.only_pretrain_model=True`.'      )
									else:
														SCREAMING_SNAKE_CASE           =     MODEL_MAPPING[config.__class__](lowercase__      )

									model.eval()
									model.to(self.args.device      )

									# encoder-decoder has vocab size saved differently
									SCREAMING_SNAKE_CASE           =     config.vocab_size if hasattr(lowercase__		,     'vocab_size'      ) else config.encoder.vocab_size
									SCREAMING_SNAKE_CASE           =     torch.randint(lowercase__		,     (batch_size, sequence_length)		,     dtype=torch.long		,     device=self.args.device      )

									if self.args.fpaa:
														logger.info('Running training in Mixed Precision...'      )
														if not self.args.is_gpu:
																			raise ValueError('Mixed precision is possible only for GPU.'      )
														# amp seems to have memory leaks so that memory usage
														# is measured using .half() for now https://github.com/NVIDIA/apex/issues/439
														model.half()

									if self.args.torchscript:
														with torch.no_grad():
																			SCREAMING_SNAKE_CASE           =     torch.jit.trace(lowercase__		,     lowercase__      )
									else:
														SCREAMING_SNAKE_CASE           =     model

									def encoder_decoder_forward():
														with torch.no_grad():
																			SCREAMING_SNAKE_CASE           =     inference_model(lowercase__		,     decoder_input_ids=lowercase__      )
														return outputs

									def encoder_forward():
														with torch.no_grad():
																			SCREAMING_SNAKE_CASE           =     inference_model(lowercase__      )
														return outputs

									SCREAMING_SNAKE_CASE           =     encoder_decoder_forward if config.is_encoder_decoder else encoder_forward
									return _forward


				def 							A (    self		,     lowercase__		,     lowercase__		,     lowercase__      )   ->   Callable[[], None]:
									"""simple docstring"""







									SCREAMING_SNAKE_CASE           =     self.config_dict[model_name]

									SCREAMING_SNAKE_CASE           =     (
									    hasattr(lowercase__		,     'architectures'      )
									    and isinstance(config.architectures		,     lowercase__      )
									    and len(config.architectures      ) > 0
									)
									if not self.args.only_pretrain_model and has_model_class_in_config:
														try:
																			SCREAMING_SNAKE_CASE           =     config.architectures[0]
																			SCREAMING_SNAKE_CASE           =     __import__('transformers'		,     fromlist=[model_class]      )
																			SCREAMING_SNAKE_CASE           =     getattr(lowercase__		,     lowercase__      )
																			SCREAMING_SNAKE_CASE           =     model_cls(lowercase__      )
														except ImportError:
																			raise ImportError(
																			    f'''{model_class} does not exist. If you just want to test the pretrained model, you might want to'''
																			    ' set `--only_pretrain_model` or `args.only_pretrain_model=True`.'      )
									else:
														SCREAMING_SNAKE_CASE           =     MODEL_WITH_LM_HEAD_MAPPING[config.__class__](lowercase__      )

									if self.args.torchscript:
														raise NotImplementedError('Training for torchscript is currently not implemented'      )
									else:
														SCREAMING_SNAKE_CASE           =     model

									model.train()
									model.to(self.args.device      )

									# encoder-decoder has vocab size saved differently
									SCREAMING_SNAKE_CASE           =     config.vocab_size if hasattr(lowercase__		,     'vocab_size'      ) else config.encoder.vocab_size
									SCREAMING_SNAKE_CASE           =     torch.randint(lowercase__		,     (batch_size, sequence_length)		,     dtype=torch.long		,     device=self.args.device      )

									if self.args.fpaa:
														logger.info('Running training in Mixed Precision...'      )
														if not self.args.is_gpu:
																			raise ValueError('Mixed precision is possible only for GPU.'      )

														# amp seems to have memory leaks so that memory usage
														# is measured using .half() for now https://github.com/NVIDIA/apex/issues/439
														model.half()

									def compute_loss_and_backprob_encoder():
														SCREAMING_SNAKE_CASE           =     train_model(lowercase__		,     labels=lowercase__      )[0]
														loss.backward()
														return loss

									def compute_loss_and_backprob_encoder_decoder():
														SCREAMING_SNAKE_CASE           =     train_model(lowercase__		,     decoder_input_ids=lowercase__		,     labels=lowercase__      )[0]
														loss.backward()
														return loss

									SCREAMING_SNAKE_CASE           =     (
									    compute_loss_and_backprob_encoder_decoder
									    if config.is_encoder_decoder
									    else compute_loss_and_backprob_encoder
									)
									return _train


				def 							A (    self		,     lowercase__      )   ->   float:
									"""simple docstring"""







									try:
														if self.args.is_tpu or self.args.torchscript:
																			# run additional 10 times to stabilize compilation for tpu and torchscript
																			logger.info('Do inference on TPU or torchscript. Running model 5 times to stabilize compilation'      )
																			timeit.repeat(
																			    lowercase__		,     repeat=1		,     number=5		,     )

														# as written in https://docs.python.org/2/library/timeit.html#timeit.Timer.repeat, min should be taken rather than the average
														SCREAMING_SNAKE_CASE           =     timeit.repeat(
														    lowercase__		,     repeat=self.args.repeat		,     number=10		,     )

														if self.args.is_tpu and self.args.torch_xla_tpu_print_metrics:
																			import torch_xla.debug.metrics as met

																			self.print_fn(met.metrics_report()      )

														return min(lowercase__      ) / 10.0
									except RuntimeError as e:
														self.print_fn(f'''Doesn\'t fit on GPU. {e}'''      )
														return "N/A"




				def 							A (    self		,     lowercase__      )   ->   [Memory, MemorySummary]:
									"""simple docstring"""







									try:
														if self.args.trace_memory_line_by_line:
																			SCREAMING_SNAKE_CASE           =     start_memory_tracing('transformers'      )

														if self.args.is_tpu:
																			# tpu
																			raise NotImplementedError(
																			    'Memory Benchmarking is currently not implemented for TPU. Please disable memory benchmarking with'
																			    ' `--no-memory` or `args.memory=False`'      )
														elif self.args.is_gpu:
																			if not is_pyanvml_available():
																								logger.warning(
																								    'py3nvml not installed, we won\'t log GPU memory usage. '
																								    'Install py3nvml (pip install py3nvml) to log information about GPU.'      )
																								SCREAMING_SNAKE_CASE           =     'N/A'
																			else:
																								logger.info(
																								    'Measuring total GPU usage on GPU device. Make sure to not have additional processes running'
																								    ' on the same GPU.'      )
																								# init nvml
																								nvml.nvmlInit()
																								func()
																								SCREAMING_SNAKE_CASE           =     nvml.nvmlDeviceGetHandleByIndex(self.args.device_idx      )
																								SCREAMING_SNAKE_CASE           =     nvml.nvmlDeviceGetMemoryInfo(lowercase__      )
																								SCREAMING_SNAKE_CASE           =     meminfo.used
																								SCREAMING_SNAKE_CASE           =     Memory(lowercase__      )
																								# shutdown nvml
																								nvml.nvmlShutdown()
														else:
																			# cpu
																			SCREAMING_SNAKE_CASE           =     measure_peak_memory_cpu(lowercase__      )
																			SCREAMING_SNAKE_CASE           =     Memory(lowercase__      ) if isinstance(lowercase__		,     lowercase__      ) else memory_bytes

														if self.args.trace_memory_line_by_line:
																			SCREAMING_SNAKE_CASE           =     stop_memory_tracing(lowercase__      )
														else:
																			SCREAMING_SNAKE_CASE           =     None

														return memory, summary
									except RuntimeError as e:
														self.print_fn(f'''Doesn\'t fit on GPU. {e}'''      )
														return "N/A", None
