





'''simple docstring'''






import argparse
import os

# New Code #
import evaluate
import torch
from datasets import load_dataset
from torch.optim import AdamW
from torch.utils.data import DataLoader
from transformers import AutoModelForSequenceClassification, AutoTokenizer, get_linear_schedule_with_warmup, set_seed

from accelerate import Accelerator, DistributedType
from accelerate.utils import find_executable_batch_size


########################################################################
# This is a fully working simple example to use Accelerate,
# specifically showcasing how to ensure out-of-memory errors never
# interrupt training, and builds off the `nlp_example.py` script.
#
# This example trains a Bert base model on GLUE MRPC
# in any of the following settings (with the same script):
#   - single CPU or single GPU
#   - multi GPUS (using PyTorch distributed mode)
#   - (multi) TPUs
#   - fp16 (mixed-precision) or fp32 (normal precision)
#
# New additions from the base script can be found quickly by
# looking for the # New Code # tags
#
# To run it in each of these various modes, follow the instructions
# in the readme for examples:
# https://github.com/huggingface/accelerate/tree/main/examples
#
########################################################################


__lowerCamelCase						: List[str]		=   16
__lowerCamelCase						: List[str]		=   32


def 					_a   (__SCREAMING_SNAKE_CASE  ,      __SCREAMING_SNAKE_CASE = 16   ):


  """simple docstring"""

  _UpperCamelCase       			=AutoTokenizer.from_pretrained('''bert-base-cased'''   )
  _UpperCamelCase       			=load_dataset('''glue'''  ,      '''mrpc'''   )

  def tokenize_function(__SCREAMING_SNAKE_CASE   ):
    # max_length=None => use the model max length (it's actually the default)
    _UpperCamelCase       			=tokenizer(examples['''sentence1''']  ,      examples['''sentence2''']  ,      truncation=__SCREAMING_SNAKE_CASE  ,      max_length=__SCREAMING_SNAKE_CASE   )
    return outputs

  # Apply the method we just defined to all the examples in all the splits of the dataset
  # starting with the main process first:
  with accelerator.main_process_first():
    _UpperCamelCase       			=datasets.map(
        __SCREAMING_SNAKE_CASE  ,      batched=__SCREAMING_SNAKE_CASE  ,      remove_columns=['''idx''', '''sentence1''', '''sentence2''']  ,      )

  # We also rename the 'label' column to 'labels' which is the expected name for labels by the models of the
  # transformers library
  _UpperCamelCase       			=tokenized_datasets.rename_column('''label'''  ,      '''labels'''   )

  def collate_fn(__SCREAMING_SNAKE_CASE   ):
    # On TPU it's best to pad everything to the same length or training will be very slow.
    _UpperCamelCase       			=128 if accelerator.distributed_type == DistributedType.TPU else None
    # When using mixed precision we want round multiples of 8/16
    if accelerator.mixed_precision == "fp8":
      _UpperCamelCase       			=16
    elif accelerator.mixed_precision != "no":
      _UpperCamelCase       			=8
    else:
      _UpperCamelCase       			=None

    return tokenizer.pad(
        __SCREAMING_SNAKE_CASE  ,      padding='''longest'''  ,      max_length=__SCREAMING_SNAKE_CASE  ,      pad_to_multiple_of=__SCREAMING_SNAKE_CASE  ,      return_tensors='''pt'''  ,      )

  # Instantiate dataloaders.
  _UpperCamelCase       			=DataLoader(
      tokenized_datasets['''train''']  ,      shuffle=__SCREAMING_SNAKE_CASE  ,      collate_fn=__SCREAMING_SNAKE_CASE  ,      batch_size=__SCREAMING_SNAKE_CASE   )
  _UpperCamelCase       			=DataLoader(
      tokenized_datasets['''validation''']  ,      shuffle=__SCREAMING_SNAKE_CASE  ,      collate_fn=__SCREAMING_SNAKE_CASE  ,      batch_size=__SCREAMING_SNAKE_CASE   )

  return train_dataloader, eval_dataloader


# For testing only
if os.environ.get('TESTING_MOCKED_DATALOADERS', None) == "1":
      from accelerate.test_utils.training import mocked_dataloaders

      __lowerCamelCase						: Any		=   mocked_dataloaders  # noqa: F811


def 					_a   (__SCREAMING_SNAKE_CASE  ,      __SCREAMING_SNAKE_CASE   ):


  """simple docstring"""

  if os.environ.get('''TESTING_MOCKED_DATALOADERS'''  ,      __SCREAMING_SNAKE_CASE   ) == "1":
    _UpperCamelCase       			=2
  # Initialize accelerator
  _UpperCamelCase       			=Accelerator(cpu=args.cpu  ,      mixed_precision=args.mixed_precision   )
  # Sample hyper-parameters for learning rate, batch size, seed and a few other HPs
  _UpperCamelCase       			=config['''lr''']
  _UpperCamelCase       			=int(config['''num_epochs''']   )
  _UpperCamelCase       			=int(config['''seed''']   )
  _UpperCamelCase       			=int(config['''batch_size''']   )

  _UpperCamelCase       			=evaluate.load('''glue'''  ,      '''mrpc'''   )

  # New Code #
  # We now can define an inner training loop function. It should take a batch size as the only parameter,
  # and build the dataloaders in there.
  # It also gets our decorator
  @find_executable_batch_size(starting_batch_size=__SCREAMING_SNAKE_CASE   )
  def inner_training_loop(__SCREAMING_SNAKE_CASE   ):
    # And now just move everything below under this function
    # We need to bring in the Accelerator object from earlier
    nonlocal accelerator
    # And reset all of its attributes that could hold onto any memory:
    accelerator.free_memory()

    # Then we can declare the model, optimizer, and everything else:
    set_seed(__SCREAMING_SNAKE_CASE   )

    # Instantiate the model (we build the model here so that the seed also control new weights initialization)
    _UpperCamelCase       			=AutoModelForSequenceClassification.from_pretrained('''bert-base-cased'''  ,      return_dict=__SCREAMING_SNAKE_CASE   )

    # We could avoid this line since the accelerator is set with `device_placement=True` (default value).
    # Note that if you are placing tensors on devices manually, this line absolutely needs to be before the optimizer
    # creation otherwise training will not work on TPU (`accelerate` will kindly throw an error to make us aware of that).
    _UpperCamelCase       			=model.to(accelerator.device   )

    # Instantiate optimizer
    _UpperCamelCase       			=AdamW(params=model.parameters()  ,      lr=__SCREAMING_SNAKE_CASE   )
    _UpperCamelCase			,     _UpperCamelCase       			=get_dataloaders(__SCREAMING_SNAKE_CASE  ,      __SCREAMING_SNAKE_CASE   )

    # Instantiate scheduler
    _UpperCamelCase       			=get_linear_schedule_with_warmup(
        optimizer=__SCREAMING_SNAKE_CASE  ,      num_warmup_steps=100  ,      num_training_steps=(len(__SCREAMING_SNAKE_CASE   ) * num_epochs)  ,      )

    # Prepare everything
    # There is no specific order to remember, we just need to unpack the objects in the same order we gave them to the
    # prepare method.
    _UpperCamelCase			,     _UpperCamelCase			,     _UpperCamelCase			,     _UpperCamelCase			,     _UpperCamelCase       			=accelerator.prepare(
        __SCREAMING_SNAKE_CASE  ,      __SCREAMING_SNAKE_CASE  ,      __SCREAMING_SNAKE_CASE  ,      __SCREAMING_SNAKE_CASE  ,      __SCREAMING_SNAKE_CASE   )

    # Now we train the model
    for epoch in range(__SCREAMING_SNAKE_CASE   ):
      model.train()
      for step, batch in enumerate(__SCREAMING_SNAKE_CASE   ):
        # We could avoid this line since we set the accelerator with `device_placement=True`.
        batch.to(accelerator.device   )
        _UpperCamelCase       			=model(**__SCREAMING_SNAKE_CASE   )
        _UpperCamelCase       			=outputs.loss
        accelerator.backward(__SCREAMING_SNAKE_CASE   )
        optimizer.step()
        lr_scheduler.step()
        optimizer.zero_grad()

      model.eval()
      for step, batch in enumerate(__SCREAMING_SNAKE_CASE   ):
        # We could avoid this line since we set the accelerator with `device_placement=True`.
        batch.to(accelerator.device   )
        with torch.no_grad():
          _UpperCamelCase       			=model(**__SCREAMING_SNAKE_CASE   )
        _UpperCamelCase       			=outputs.logits.argmax(dim=-1   )
        _UpperCamelCase			,     _UpperCamelCase       			=accelerator.gather_for_metrics((predictions, batch['''labels'''])   )
        metric.add_batch(
            predictions=__SCREAMING_SNAKE_CASE  ,      references=__SCREAMING_SNAKE_CASE  ,      )

      _UpperCamelCase       			=metric.compute()
      # Use accelerator.print to print only on the main process.
      accelerator.print(f'''epoch {epoch}:'''  ,      __SCREAMING_SNAKE_CASE   )

    # New Code #
    # And call it at the end with no arguments
    # Note: You could also refactor this outside of your training loop function
  inner_training_loop()


def 					_a   ():


  """simple docstring"""

  _UpperCamelCase       			=argparse.ArgumentParser(description='''Simple example of training script.'''   )
  parser.add_argument(
      '''--mixed_precision'''  ,      type=__SCREAMING_SNAKE_CASE  ,      default=__SCREAMING_SNAKE_CASE  ,      choices=['''no''', '''fp16''', '''bf16''', '''fp8''']  ,      help='''Whether to use mixed precision. Choose'''
      '''between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >= 1.10.'''
      '''and an Nvidia Ampere GPU.'''  ,      )
  parser.add_argument('''--cpu'''  ,      action='''store_true'''  ,      help='''If passed, will train on the CPU.'''   )
  _UpperCamelCase       			=parser.parse_args()
  _UpperCamelCase       			={'''lr''': 2E-5, '''num_epochs''': 3, '''seed''': 42, '''batch_size''': 16}
  training_function(__SCREAMING_SNAKE_CASE  ,      __SCREAMING_SNAKE_CASE   )


if __name__ == "__main__":
      main()













'''simple docstring'''






# Copyright 2023 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.

from typing import TYPE_CHECKING

from ...utils import OptionalDependencyNotAvailable, _LazyModule, is_torch_available


__lowerCamelCase						: Optional[int]		=   {
    'configuration_xmod': [
        'XMOD_PRETRAINED_CONFIG_ARCHIVE_MAP',
        'XmodConfig',
        'XmodOnnxConfig',
    ],
}

try:
      if not is_torch_available():
            raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
      pass
else:
      __lowerCamelCase						: int		=   [
          'XMOD_PRETRAINED_MODEL_ARCHIVE_LIST',
          'XmodForCausalLM',
          'XmodForMaskedLM',
          'XmodForMultipleChoice',
          'XmodForQuestionAnswering',
          'XmodForSequenceClassification',
          'XmodForTokenClassification',
          'XmodModel',
          'XmodPreTrainedModel',
      ]

if TYPE_CHECKING:
      from .configuration_xmod import XMOD_PRETRAINED_CONFIG_ARCHIVE_MAP, XmodConfig, XmodOnnxConfig

      try:
            if not is_torch_available():
                  raise OptionalDependencyNotAvailable()
      except OptionalDependencyNotAvailable:
            pass
      else:
            from .modeling_xmod import (
                XMOD_PRETRAINED_MODEL_ARCHIVE_LIST,
                XmodForCausalLM,
                XmodForMaskedLM,
                XmodForMultipleChoice,
                XmodForQuestionAnswering,
                XmodForSequenceClassification,
                XmodForTokenClassification,
                XmodModel,
                XmodPreTrainedModel,
            )

else:
      import sys

      __lowerCamelCase						: Dict		=   _LazyModule(__name__, globals()['__file__'], _import_structure, module_spec=__spec__)






