




'''simple docstring'''






import textwrap

import pyarrow as pa
import pytest

from datasets import Features, Image
from datasets.packaged_modules.text.text import Text

from ..utils import require_pil




@pytest.fixture
def 		a_(			lowerCamelCase   )					->List[str]:






       '''simple docstring'''




       lowercase	:		Union[str, Any]    =   tmp_path / '''text.txt'''
       lowercase	:		List[Any]    =   textwrap.dedent(
           '''\
        Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
        Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
        Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
        Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

        Second paragraph:
        Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
        Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
        Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
        Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
        '''   )
       with open(lowerCamelCase ,					'''w''' ,					encoding='''utf-8'''   ) as f:
              f.write(lowerCamelCase   )
       return str(lowerCamelCase   )




@pytest.fixture
def 		a_(			lowerCamelCase ,					lowerCamelCase   )					->Union[str, Any]:






       '''simple docstring'''




       lowercase	:		List[Any]    =   tmp_path / '''text_with_image.txt'''
       with open(lowerCamelCase ,					'''w''' ,					encoding='''utf-8'''   ) as f:
              f.write(lowerCamelCase   )
       return str(lowerCamelCase   )




@pytest.mark.parametrize('''keep_linebreaks''' ,					[True, False]   )
def 		a_(			lowerCamelCase ,					lowerCamelCase   )					->Optional[int]:






       '''simple docstring'''




       with open(lowerCamelCase ,					encoding='''utf-8'''   ) as f:
              lowercase	:		str    =   f.read().splitlines(keepends=lowerCamelCase   )
       lowercase	:		Tuple    =   Text(keep_linebreaks=lowerCamelCase ,					encoding='''utf-8'''   )
       lowercase	:		Tuple    =   text._generate_tables([[text_file]]   )
       lowercase	:		str    =   pa.concat_tables([table for _, table in generator]   ).to_pydict()['''text''']
       assert generated_content == expected_content




@require_pil
def 		a_(			lowerCamelCase   )					->Union[str, Any]:






       '''simple docstring'''




       with open(lowerCamelCase ,					encoding='''utf-8'''   ) as f:
              lowercase	:		List[Any]    =   f.read().splitlines()[0]
       lowercase	:		str    =   Text(encoding='''utf-8''' ,					features=Features({'''image''': Image()}   )   )
       lowercase	:		Any    =   text._generate_tables([[text_file_with_image]]   )
       lowercase	:		Optional[int]    =   pa.concat_tables([table for _, table in generator]   )
       assert pa_table.schema.field('''image'''   ).type == Image()()
       lowercase	:		int    =   pa_table.to_pydict()['''image''']
       assert generated_content == [{"path": image_file, "bytes": None}]





@pytest.mark.parametrize('''sample_by''' ,					['''line''', '''paragraph''', '''document''']   )
def 		a_(			lowerCamelCase ,					lowerCamelCase   )					->Tuple:






       '''simple docstring'''




       with open(lowerCamelCase ,					encoding='''utf-8'''   ) as f:
              lowercase	:		int    =   f.read()
       if sample_by == "line":
              lowercase	:		Union[str, Any]    =   expected_content.splitlines()
       elif sample_by == "paragraph":
              lowercase	:		List[str]    =   expected_content.split('''\n\n'''   )
       elif sample_by == "document":
              lowercase	:		Union[str, Any]    =   [expected_content]
       lowercase	:		Dict    =   Text(sample_by=lowerCamelCase ,					encoding='''utf-8''' ,					chunksize=100   )
       lowercase	:		Optional[int]    =   text._generate_tables([[text_file]]   )
       lowercase	:		Tuple    =   pa.concat_tables([table for _, table in generator]   ).to_pydict()['''text''']
       assert generated_content == expected_content










'''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


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

class 	SCREAMING_SNAKE_CASE_		(							lowerCamelCase_					):
 __snake_case						:  PyTorchBenchmarkArguments
 __snake_case						:  PretrainedConfig
 __snake_case						:  str       =   "PyTorch"



 @property
 def  SCREAMING_SNAKE_CASE(	self			):






        '''simple docstring'''




        return torch.__version__



 def  SCREAMING_SNAKE_CASE(	self ,		A ,		A ,		A			):






        '''simple docstring'''




        lowercase	:		str    =   self._prepare_inference_func(A ,		A ,		A			)
        return self._measure_speed(_inference			)



 def  SCREAMING_SNAKE_CASE(	self ,		A ,		A ,		A			):






        '''simple docstring'''




        lowercase	:		int    =   self._prepare_inference_func(A ,		A ,		A			)
        return self._measure_memory(_inference			)



 def  SCREAMING_SNAKE_CASE(	self ,		A ,		A ,		A			):






        '''simple docstring'''




        lowercase	:		Union[str, Any]    =   self._prepare_train_func(A ,		A ,		A			)
        return self._measure_speed(_train			)



 def  SCREAMING_SNAKE_CASE(	self ,		A ,		A ,		A			):






        '''simple docstring'''




        lowercase	:		Any    =   self._prepare_train_func(A ,		A ,		A			)
        return self._measure_memory(_train			)



 def  SCREAMING_SNAKE_CASE(	self ,		A ,		A ,		A			):






        '''simple docstring'''




        lowercase	:		Any    =   self.config_dict[model_name]

        if self.args.torchscript:
               lowercase	:		Any    =   True

        lowercase	:		Union[str, Any]    =   (
            hasattr(A ,		'''architectures'''			)
            and isinstance(config.architectures ,		A			)
            and len(config.architectures			) > 0
        )
        if not self.args.only_pretrain_model and has_model_class_in_config:
               try:
                      lowercase	:		Any    =   config.architectures[0]
                      lowercase	:		Dict    =   __import__('''transformers''' ,		fromlist=[model_class]			)
                      lowercase	:		List[str]    =   getattr(A ,		A			)
                      lowercase	:		Dict    =   model_cls(A			)
               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:
               lowercase	:		Optional[int]    =   MODEL_MAPPING[config.__class__](A			)

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

        # encoder-decoder has vocab size saved differently
        lowercase	:		str    =   config.vocab_size if hasattr(A ,		'''vocab_size'''			) else config.encoder.vocab_size
        lowercase	:		Union[str, Any]    =   torch.randint(A ,		(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():
                      lowercase	:		int    =   torch.jit.trace(A ,		A			)
        else:
               lowercase	:		Any    =   model

        def encoder_decoder_forward():
               with torch.no_grad():
                      lowercase	:		int    =   inference_model(A ,		decoder_input_ids=A			)
               return outputs

        def encoder_forward():
               with torch.no_grad():
                      lowercase	:		Tuple    =   inference_model(A			)
               return outputs

        lowercase	:		int    =   encoder_decoder_forward if config.is_encoder_decoder else encoder_forward
        return _forward



 def  SCREAMING_SNAKE_CASE(	self ,		A ,		A ,		A			):






        '''simple docstring'''




        lowercase	:		Optional[int]    =   self.config_dict[model_name]

        lowercase	:		Optional[Any]    =   (
            hasattr(A ,		'''architectures'''			)
            and isinstance(config.architectures ,		A			)
            and len(config.architectures			) > 0
        )
        if not self.args.only_pretrain_model and has_model_class_in_config:
               try:
                      lowercase	:		str    =   config.architectures[0]
                      lowercase	:		List[str]    =   __import__('''transformers''' ,		fromlist=[model_class]			)
                      lowercase	:		int    =   getattr(A ,		A			)
                      lowercase	:		Any    =   model_cls(A			)
               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:
               lowercase	:		Union[str, Any]    =   MODEL_WITH_LM_HEAD_MAPPING[config.__class__](A			)

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

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

        # encoder-decoder has vocab size saved differently
        lowercase	:		Union[str, Any]    =   config.vocab_size if hasattr(A ,		'''vocab_size'''			) else config.encoder.vocab_size
        lowercase	:		List[Any]    =   torch.randint(A ,		(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():
               lowercase	:		Optional[Any]    =   train_model(A ,		labels=A			)[0]
               loss.backward()
               return loss

        def compute_loss_and_backprob_encoder_decoder():
               lowercase	:		List[Any]    =   train_model(A ,		decoder_input_ids=A ,		labels=A			)[0]
               loss.backward()
               return loss

        lowercase	:		Any    =   (
            compute_loss_and_backprob_encoder_decoder
            if config.is_encoder_decoder
            else compute_loss_and_backprob_encoder
        )
        return _train



 def  SCREAMING_SNAKE_CASE(	self ,		A			):






        '''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(
                          A ,		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
               lowercase	:		str    =   timeit.repeat(
                   A ,		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(A			) / 1_0.0
        except RuntimeError as e:
               self.print_fn(f"""Doesn't fit on GPU. {e}"""			)
               return "N/A"





 def  SCREAMING_SNAKE_CASE(	self ,		A			):






        '''simple docstring'''




        try:
               if self.args.trace_memory_line_by_line:
                      lowercase	:		int    =   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.'''			)
                             lowercase	:		str    =   '''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()
                             lowercase	:		List[Any]    =   nvml.nvmlDeviceGetHandleByIndex(self.args.device_idx			)
                             lowercase	:		List[Any]    =   nvml.nvmlDeviceGetMemoryInfo(A			)
                             lowercase	:		int    =   meminfo.used
                             lowercase	:		Dict    =   Memory(A			)
                             # shutdown nvml
                             nvml.nvmlShutdown()
               else:
                      # cpu
                      lowercase	:		Optional[Any]    =   measure_peak_memory_cpu(A			)
                      lowercase	:		Union[str, Any]    =   Memory(A			) if isinstance(A ,		A			) else memory_bytes

               if self.args.trace_memory_line_by_line:
                      lowercase	:		Tuple    =   stop_memory_tracing(A			)
               else:
                      lowercase	:		int    =   None

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




