






'''simple docstring'''



import argparse
import logging
import os
import re

import tensorflow as tf

from transformers import (
    AutoConfig,
    AutoTokenizer,
    DataCollatorForLanguageModeling,
    PushToHubCallback,
    TFAutoModelForMaskedLM,
    create_optimizer,
)


__UpperCamelCase   :							List[str]         =   logging.getLogger(__name__)

__UpperCamelCase   :							int         =   tf.data.AUTOTUNE



def  __UpperCAmelCase						(					)	->      Tuple:

   """simple docstring"""
   __a					  =     argparse.ArgumentParser(description='Train a masked language model on TPU.'     )
   parser.add_argument(
       '--pretrained_model_config',       type=SCREAMING_SNAKE_CASE__,       default='roberta-base',       help='The model config to use. Note that we don\'t copy the model\'s weights, only the config!',       )
   parser.add_argument(
       '--tokenizer',       type=SCREAMING_SNAKE_CASE__,       default='unigram-tokenizer-wikitext',       help='The name of the tokenizer to load. We use the pretrained tokenizer to initialize the model\'s vocab size.',       )

   parser.add_argument(
       '--per_replica_batch_size',       type=SCREAMING_SNAKE_CASE__,       default=8,       help='Batch size per TPU core.',       )

   parser.add_argument(
       '--no_tpu',       action='store_true',       help='If set, run on CPU and don\'t try to initialize a TPU. Useful for debugging on non-TPU instances.',       )

   parser.add_argument(
       '--tpu_name',       type=SCREAMING_SNAKE_CASE__,       help='Name of TPU resource to initialize. Should be blank on Colab, and \'local\' on TPU VMs.',       default='local',       )

   parser.add_argument(
       '--tpu_zone',       type=SCREAMING_SNAKE_CASE__,       help='Google cloud zone that TPU resource is located in. Only used for non-Colab TPU nodes.',       )

   parser.add_argument(
       '--gcp_project',       type=SCREAMING_SNAKE_CASE__,       help='Google cloud project name. Only used for non-Colab TPU nodes.'     )

   parser.add_argument(
       '--bfloat16',       action='store_true',       help='Use mixed-precision bfloat16 for training. This is the recommended lower-precision format for TPU.',       )

   parser.add_argument(
       '--train_dataset',       type=SCREAMING_SNAKE_CASE__,       help='Path to training dataset to load. If the path begins with `gs://`'
       ' then the dataset will be loaded from a Google Cloud Storage bucket.',       )

   parser.add_argument(
       '--shuffle_buffer_size',       type=SCREAMING_SNAKE_CASE__,       default=2**18,       help='Size of the shuffle buffer (in samples)',       )

   parser.add_argument(
       '--eval_dataset',       type=SCREAMING_SNAKE_CASE__,       help='Path to evaluation dataset to load. If the path begins with `gs://`'
       ' then the dataset will be loaded from a Google Cloud Storage bucket.',       )

   parser.add_argument(
       '--num_epochs',       type=SCREAMING_SNAKE_CASE__,       default=1,       help='Number of epochs to train for.',       )

   parser.add_argument(
       '--learning_rate',       type=SCREAMING_SNAKE_CASE__,       default=1e-4,       help='Learning rate to use for training.',       )

   parser.add_argument(
       '--weight_decay_rate',       type=SCREAMING_SNAKE_CASE__,       default=1e-3,       help='Weight decay rate to use for training.',       )

   parser.add_argument(
       '--max_length',       type=SCREAMING_SNAKE_CASE__,       default=512,       help='Maximum length of tokenized sequences. Should match the setting used in prepare_tfrecord_shards.py',       )

   parser.add_argument(
       '--mlm_probability',       type=SCREAMING_SNAKE_CASE__,       default=0.1_5,       help='Fraction of tokens to mask during training.',       )

   parser.add_argument('--output_dir',       type=SCREAMING_SNAKE_CASE__,       required=SCREAMING_SNAKE_CASE__,       help='Path to save model checkpoints to.'     )
   parser.add_argument('--hub_model_id',       type=SCREAMING_SNAKE_CASE__,       help='Model ID to upload to on the Hugging Face Hub.'     )

   __a					  =     parser.parse_args()
   return args



def  __UpperCAmelCase						(					SCREAMING_SNAKE_CASE__:						Dict     )	->      str:

   """simple docstring"""
   try:
      if args.tpu_name:
         __a					  =     tf.distribute.cluster_resolver.TPUClusterResolver(
             args.tpu_name,       zone=args.tpu_zone,       project=args.gcp_project     )
      else:
         __a					  =     tf.distribute.cluster_resolver.TPUClusterResolver()
   except ValueError:
      raise RuntimeError(
          'Couldn\'t connect to TPU! Most likely you need to specify --tpu_name, --tpu_zone, or '
          '--gcp_project. When running on a TPU VM, use --tpu_name local.'     )

   tf.config.experimental_connect_to_cluster(SCREAMING_SNAKE_CASE__     )
   tf.tpu.experimental.initialize_tpu_system(SCREAMING_SNAKE_CASE__     )

   return tpu



def  __UpperCAmelCase						(					SCREAMING_SNAKE_CASE__:						Union[str, Any]     )	->      Optional[Any]:

   """simple docstring"""
   __a					  =     0
   for file in file_list:
      __a					  =     file.split('/'     )[-1]
      __a					  =     re.search(r'-\d+-(\d+)\.tfrecord',       SCREAMING_SNAKE_CASE__     ).group(1     )
      __a					  =     int(SCREAMING_SNAKE_CASE__     )
      num_samples += sample_count

   return num_samples



def  __UpperCAmelCase						(					SCREAMING_SNAKE_CASE__:						Dict,       SCREAMING_SNAKE_CASE__:						Optional[Any],       SCREAMING_SNAKE_CASE__:						int,       SCREAMING_SNAKE_CASE__:						Dict,       SCREAMING_SNAKE_CASE__:						Any,       SCREAMING_SNAKE_CASE__:						List[str]=None     )	->      int:

   """simple docstring"""
   __a					  =     count_samples(SCREAMING_SNAKE_CASE__     )
   __a					  =     tf.data.Dataset.from_tensor_slices(SCREAMING_SNAKE_CASE__     )
   if shuffle:
      __a					  =     dataset.shuffle(len(SCREAMING_SNAKE_CASE__     )     )
   __a					  =     tf.data.TFRecordDataset(SCREAMING_SNAKE_CASE__,       num_parallel_reads=SCREAMING_SNAKE_CASE__     )
   # TF can't infer the total sample count because it doesn't read all the records yet, so we assert it here
   __a					  =     dataset.apply(tf.data.experimental.assert_cardinality(SCREAMING_SNAKE_CASE__     )     )
   __a					  =     dataset.map(SCREAMING_SNAKE_CASE__,       num_parallel_calls=SCREAMING_SNAKE_CASE__     )
   if shuffle:
      assert shuffle_buffer_size is not None
      __a					  =     dataset.shuffle(args.shuffle_buffer_size     )
   __a					  =     dataset.batch(SCREAMING_SNAKE_CASE__,       drop_remainder=SCREAMING_SNAKE_CASE__     )
   __a					  =     dataset.map(SCREAMING_SNAKE_CASE__,       num_parallel_calls=SCREAMING_SNAKE_CASE__     )
   __a					  =     dataset.prefetch(SCREAMING_SNAKE_CASE__     )
   return dataset



def  __UpperCAmelCase						(					SCREAMING_SNAKE_CASE__:						Optional[Any]     )	->      Optional[int]:

   """simple docstring"""
   if not args.no_tpu:
      __a					  =     initialize_tpu(SCREAMING_SNAKE_CASE__     )
      __a					  =     tf.distribute.TPUStrategy(SCREAMING_SNAKE_CASE__     )
   else:
      __a					  =     tf.distribute.OneDeviceStrategy(device='/gpu:0'     )

   if args.bfloataa:
      tf.keras.mixed_precision.set_global_policy('mixed_bfloat16'     )

   __a					  =     AutoTokenizer.from_pretrained(args.tokenizer     )
   __a					  =     AutoConfig.from_pretrained(args.pretrained_model_config     )
   __a					  =     tokenizer.vocab_size

   __a					  =     tf.io.gfile.glob(os.path.join(args.train_dataset,       '*.tfrecord'     )     )
   if not training_records:
      raise ValueError(f"""No .tfrecord files found in {args.train_dataset}."""     )
   __a					  =     tf.io.gfile.glob(os.path.join(args.eval_dataset,       '*.tfrecord'     )     )
   if not eval_records:
      raise ValueError(f"""No .tfrecord files found in {args.eval_dataset}."""     )

   __a					  =     count_samples(SCREAMING_SNAKE_CASE__     )

   __a					  =     num_train_samples // (args.per_replica_batch_size * strategy.num_replicas_in_sync)
   __a					  =     steps_per_epoch * args.num_epochs

   with strategy.scope():
      __a					  =     TFAutoModelForMaskedLM.from_config(SCREAMING_SNAKE_CASE__     )
      model(model.dummy_inputs     )  # Pass some dummy inputs through the model to ensure all the weights are built
      __a  ,      __a					  =     create_optimizer(
          num_train_steps=SCREAMING_SNAKE_CASE__,       num_warmup_steps=total_train_steps // 20,       init_lr=args.learning_rate,       weight_decay_rate=args.weight_decay_rate,       )

      # Transformers models compute the right loss for their task by default when labels are passed, and will
      # use this for training unless you specify your own loss function in compile().
      model.compile(optimizer=SCREAMING_SNAKE_CASE__,       metrics=['accuracy']     )

   def decode_fn(SCREAMING_SNAKE_CASE__:						List[str]     ):
      __a					  =     {
          'input_ids': tf.io.FixedLenFeature(dtype=tf.intaa,       shape=(args.max_length,)     ),
          'attention_mask': tf.io.FixedLenFeature(dtype=tf.intaa,       shape=(args.max_length,)     ),
      }
      return tf.io.parse_single_example(SCREAMING_SNAKE_CASE__,       SCREAMING_SNAKE_CASE__     )

   # Many of the data collators in Transformers are TF-compilable when return_tensors == "tf", so we can
   # use their methods in our data pipeline.
   __a					  =     DataCollatorForLanguageModeling(
       tokenizer=SCREAMING_SNAKE_CASE__,       mlm_probability=args.mlm_probability,       mlm=SCREAMING_SNAKE_CASE__,       return_tensors='tf'     )

   def mask_with_collator(SCREAMING_SNAKE_CASE__:						List[Any]     ):
      # TF really needs an isin() function
      __a					  =     (
          ~tf.cast(batch['attention_mask'],       tf.bool     )
          | (batch['input_ids'] == tokenizer.cls_token_id)
          | (batch['input_ids'] == tokenizer.sep_token_id)
      )
      __a  ,      __a					  =     data_collator.tf_mask_tokens(
          batch['input_ids'],       vocab_size=len(SCREAMING_SNAKE_CASE__     ),       mask_token_id=tokenizer.mask_token_id,       special_tokens_mask=SCREAMING_SNAKE_CASE__,       )
      return batch

   __a					  =     args.per_replica_batch_size * strategy.num_replicas_in_sync

   __a					  =     prepare_dataset(
       SCREAMING_SNAKE_CASE__,       decode_fn=SCREAMING_SNAKE_CASE__,       mask_fn=SCREAMING_SNAKE_CASE__,       batch_size=SCREAMING_SNAKE_CASE__,       shuffle=SCREAMING_SNAKE_CASE__,       shuffle_buffer_size=args.shuffle_buffer_size,       )

   __a					  =     prepare_dataset(
       SCREAMING_SNAKE_CASE__,       decode_fn=SCREAMING_SNAKE_CASE__,       mask_fn=SCREAMING_SNAKE_CASE__,       batch_size=SCREAMING_SNAKE_CASE__,       shuffle=SCREAMING_SNAKE_CASE__,       )

   __a					  =     []
   if args.hub_model_id:
      callbacks.append(
          PushToHubCallback(output_dir=args.output_dir,       hub_model_id=args.hub_model_id,       tokenizer=SCREAMING_SNAKE_CASE__     )     )

   model.fit(
       SCREAMING_SNAKE_CASE__,       validation_data=SCREAMING_SNAKE_CASE__,       epochs=args.num_epochs,       callbacks=SCREAMING_SNAKE_CASE__,       )

   model.save_pretrained(args.output_dir     )


if __name__ == "__main__":
 __UpperCamelCase   :							Optional[int]         =   parse_args()
 main(args)







'''simple docstring'''



import argparse

import torch

from transformers import RemBertConfig, RemBertModel, load_tf_weights_in_rembert
from transformers.utils import logging


logging.set_verbosity_info()



def  __UpperCAmelCase						(					SCREAMING_SNAKE_CASE__:						Optional[Any],       SCREAMING_SNAKE_CASE__:						Tuple,       SCREAMING_SNAKE_CASE__:						Dict     )	->      List[Any]:

   """simple docstring"""
   # Initialise PyTorch model
   __a					  =     RemBertConfig.from_json_file(SCREAMING_SNAKE_CASE__     )
   print('Building PyTorch model from configuration: {}'.format(str(SCREAMING_SNAKE_CASE__     )     )     )
   __a					  =     RemBertModel(SCREAMING_SNAKE_CASE__     )

   # Load weights from tf checkpoint
   load_tf_weights_in_rembert(SCREAMING_SNAKE_CASE__,       SCREAMING_SNAKE_CASE__,       SCREAMING_SNAKE_CASE__     )

   # Save pytorch-model
   print('Save PyTorch model to {}'.format(SCREAMING_SNAKE_CASE__     )     )
   torch.save(model.state_dict(),       SCREAMING_SNAKE_CASE__     )


if __name__ == "__main__":
 __UpperCamelCase   :							List[str]         =   argparse.ArgumentParser()
 # Required parameters
 parser.add_argument(
     """--tf_checkpoint_path""", default=None, type=str, required=True, help="""Path to the TensorFlow checkpoint path."""
 )
 parser.add_argument(
     """--rembert_config_file""",
     default=None,
     type=str,
     required=True,
     help=(
         """The config json file corresponding to the pre-trained RemBERT model. \n"""
         """This specifies the model architecture."""
     ),
 )
 parser.add_argument(
     """--pytorch_dump_path""", default=None, type=str, required=True, help="""Path to the output PyTorch model."""
 )
 __UpperCamelCase   :							List[str]         =   parser.parse_args()
 convert_rembert_tf_checkpoint_to_pytorch(args.tf_checkpoint_path, args.rembert_config_file, args.pytorch_dump_path)