
import argparse
import logging
import os
import re

import tensorflow as tf

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


_A     =  logging.getLogger(__name__)

_A     =  tf.data.AUTOTUNE






def      lowerCamelCase__       (       ):




			"""simple docstring"""


			lowerCAmelCase_      			=			argparse.ArgumentParser(description="Train a masked language model on TPU."       )
			parser.add_argument(
			    "--pretrained_model_config"					,							type=__lowerCAmelCase					,							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=__lowerCAmelCase					,							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=__lowerCAmelCase					,							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=__lowerCAmelCase					,							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=__lowerCAmelCase					,							help="Google cloud zone that TPU resource is located in. Only used for non-Colab TPU nodes."					,							)

			parser.add_argument(
			    "--gcp_project"					,							type=__lowerCAmelCase					,							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=__lowerCAmelCase					,							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=__lowerCAmelCase					,							default=2**18					,							help="Size of the shuffle buffer (in samples)"					,							)

			parser.add_argument(
			    "--eval_dataset"					,							type=__lowerCAmelCase					,							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=__lowerCAmelCase					,							default=1					,							help="Number of epochs to train for."					,							)

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

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

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

			parser.add_argument(
			    "--mlm_probability"					,							type=__lowerCAmelCase					,							default=0.15					,							help="Fraction of tokens to mask during training."					,							)

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

			lowerCAmelCase_      			=			parser.parse_args()
			return args






def      lowerCamelCase__       (       __lowerCAmelCase						:						Tuple       ):




			"""simple docstring"""


			try:
						if args.tpu_name:
									lowerCAmelCase_      			=			tf.distribute.cluster_resolver.TPUClusterResolver(
									    args.tpu_name					,							zone=args.tpu_zone					,							project=args.gcp_project       )
						else:
									lowerCAmelCase_      			=			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(__lowerCAmelCase       )
			tf.tpu.experimental.initialize_tpu_system(__lowerCAmelCase       )

			return tpu






def      lowerCamelCase__       (       __lowerCAmelCase						:						Any       ):




			"""simple docstring"""


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

			return num_samples






def      lowerCamelCase__       (       __lowerCAmelCase						:						Tuple					,							__lowerCAmelCase						:						int					,							__lowerCAmelCase						:						Union[str, Any]					,							__lowerCAmelCase						:						Optional[int]					,							__lowerCAmelCase						:						str					,							__lowerCAmelCase						:						List[Any]=None       ):




			"""simple docstring"""


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






def      lowerCamelCase__       (       __lowerCAmelCase						:						Optional[int]       ):




			"""simple docstring"""


			if not args.no_tpu:
						lowerCAmelCase_      			=			initialize_tpu(__lowerCAmelCase       )
						lowerCAmelCase_      			=			tf.distribute.TPUStrategy(__lowerCAmelCase       )
			else:
						lowerCAmelCase_      			=			tf.distribute.OneDeviceStrategy(device="/gpu:0"       )

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

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

			lowerCAmelCase_      			=			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}."""       )
			lowerCAmelCase_      			=			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}."""       )

			lowerCAmelCase_      			=			count_samples(__lowerCAmelCase       )

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

			with strategy.scope():
						lowerCAmelCase_      			=			TFAutoModelForMaskedLM.from_config(__lowerCAmelCase       )
						model(model.dummy_inputs       )  # Pass some dummy inputs through the model to ensure all the weights are built
						lowerCAmelCase_			,						lowerCAmelCase_      			=			create_optimizer(
						    num_train_steps=__lowerCAmelCase					,							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=__lowerCAmelCase					,							metrics=["accuracy"]       )

			def decode_fn(__lowerCAmelCase						:						str       ):
						lowerCAmelCase_      			=			{
						    "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(__lowerCAmelCase					,							__lowerCAmelCase       )

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

			def mask_with_collator(__lowerCAmelCase						:						Tuple       ):
						# TF really needs an isin() function
						lowerCAmelCase_      			=			(
						    ~tf.cast(batch["attention_mask"]					,							tf.bool       )
						    | (batch["input_ids"] == tokenizer.cls_token_id)
						    | (batch["input_ids"] == tokenizer.sep_token_id)
						)
						lowerCAmelCase_			,						lowerCAmelCase_      			=			data_collator.tf_mask_tokens(
						    batch["input_ids"]					,							vocab_size=len(__lowerCAmelCase       )					,							mask_token_id=tokenizer.mask_token_id					,							special_tokens_mask=__lowerCAmelCase					,							)
						return batch

			lowerCAmelCase_      			=			args.per_replica_batch_size * strategy.num_replicas_in_sync

			lowerCAmelCase_      			=			prepare_dataset(
			    __lowerCAmelCase					,							decode_fn=__lowerCAmelCase					,							mask_fn=__lowerCAmelCase					,							batch_size=__lowerCAmelCase					,							shuffle=__lowerCAmelCase					,							shuffle_buffer_size=args.shuffle_buffer_size					,							)

			lowerCAmelCase_      			=			prepare_dataset(
			    __lowerCAmelCase					,							decode_fn=__lowerCAmelCase					,							mask_fn=__lowerCAmelCase					,							batch_size=__lowerCAmelCase					,							shuffle=__lowerCAmelCase					,							)

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

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

			model.save_pretrained(args.output_dir       )


if __name__ == "__main__":
			_A     =  parse_args()
			main(args)




from collections import OrderedDict
from typing import Mapping

from ...configuration_utils import PretrainedConfig
from ...onnx import OnnxConfig
from ...utils import logging


_A     =  logging.get_logger(__name__)

_A     =  {
    "bert-base-uncased": "https://huggingface.co/bert-base-uncased/resolve/main/config.json",
    "bert-large-uncased": "https://huggingface.co/bert-large-uncased/resolve/main/config.json",
    "bert-base-cased": "https://huggingface.co/bert-base-cased/resolve/main/config.json",
    "bert-large-cased": "https://huggingface.co/bert-large-cased/resolve/main/config.json",
    "bert-base-multilingual-uncased": "https://huggingface.co/bert-base-multilingual-uncased/resolve/main/config.json",
    "bert-base-multilingual-cased": "https://huggingface.co/bert-base-multilingual-cased/resolve/main/config.json",
    "bert-base-chinese": "https://huggingface.co/bert-base-chinese/resolve/main/config.json",
    "bert-base-german-cased": "https://huggingface.co/bert-base-german-cased/resolve/main/config.json",
    "bert-large-uncased-whole-word-masking": (
        "https://huggingface.co/bert-large-uncased-whole-word-masking/resolve/main/config.json"
    ),
    "bert-large-cased-whole-word-masking": (
        "https://huggingface.co/bert-large-cased-whole-word-masking/resolve/main/config.json"
    ),
    "bert-large-uncased-whole-word-masking-finetuned-squad": (
        "https://huggingface.co/bert-large-uncased-whole-word-masking-finetuned-squad/resolve/main/config.json"
    ),
    "bert-large-cased-whole-word-masking-finetuned-squad": (
        "https://huggingface.co/bert-large-cased-whole-word-masking-finetuned-squad/resolve/main/config.json"
    ),
    "bert-base-cased-finetuned-mrpc": "https://huggingface.co/bert-base-cased-finetuned-mrpc/resolve/main/config.json",
    "bert-base-german-dbmdz-cased": "https://huggingface.co/bert-base-german-dbmdz-cased/resolve/main/config.json",
    "bert-base-german-dbmdz-uncased": "https://huggingface.co/bert-base-german-dbmdz-uncased/resolve/main/config.json",
    "cl-tohoku/bert-base-japanese": "https://huggingface.co/cl-tohoku/bert-base-japanese/resolve/main/config.json",
    "cl-tohoku/bert-base-japanese-whole-word-masking": (
        "https://huggingface.co/cl-tohoku/bert-base-japanese-whole-word-masking/resolve/main/config.json"
    ),
    "cl-tohoku/bert-base-japanese-char": (
        "https://huggingface.co/cl-tohoku/bert-base-japanese-char/resolve/main/config.json"
    ),
    "cl-tohoku/bert-base-japanese-char-whole-word-masking": (
        "https://huggingface.co/cl-tohoku/bert-base-japanese-char-whole-word-masking/resolve/main/config.json"
    ),
    "TurkuNLP/bert-base-finnish-cased-v1": (
        "https://huggingface.co/TurkuNLP/bert-base-finnish-cased-v1/resolve/main/config.json"
    ),
    "TurkuNLP/bert-base-finnish-uncased-v1": (
        "https://huggingface.co/TurkuNLP/bert-base-finnish-uncased-v1/resolve/main/config.json"
    ),
    "wietsedv/bert-base-dutch-cased": "https://huggingface.co/wietsedv/bert-base-dutch-cased/resolve/main/config.json",
    # See all BERT models at https://huggingface.co/models?filter=bert
}





class 			_lowerCAmelCase      (			__a ):
				_lowercase    	='''bert'''




				def __init__(      self       ,       _UpperCamelCase=30_522       ,       _UpperCamelCase=768       ,       _UpperCamelCase=12       ,       _UpperCamelCase=12       ,       _UpperCamelCase=3_072       ,       _UpperCamelCase="gelu"       ,       _UpperCamelCase=0.1       ,       _UpperCamelCase=0.1       ,       _UpperCamelCase=512       ,       _UpperCamelCase=2       ,       _UpperCamelCase=0.02       ,       _UpperCamelCase=1e-1_2       ,       _UpperCamelCase=0       ,       _UpperCamelCase="absolute"       ,       _UpperCamelCase=True       ,       _UpperCamelCase=None       ,       **_UpperCamelCase       ,       )       ->   str:
							super().__init__(pad_token_id=_UpperCamelCase       ,       **_UpperCamelCase  )

							lowerCAmelCase_      			=			vocab_size
							lowerCAmelCase_      			=			hidden_size
							lowerCAmelCase_      			=			num_hidden_layers
							lowerCAmelCase_      			=			num_attention_heads
							lowerCAmelCase_      			=			hidden_act
							lowerCAmelCase_      			=			intermediate_size
							lowerCAmelCase_      			=			hidden_dropout_prob
							lowerCAmelCase_      			=			attention_probs_dropout_prob
							lowerCAmelCase_      			=			max_position_embeddings
							lowerCAmelCase_      			=			type_vocab_size
							lowerCAmelCase_      			=			initializer_range
							lowerCAmelCase_      			=			layer_norm_eps
							lowerCAmelCase_      			=			position_embedding_type
							lowerCAmelCase_      			=			use_cache
							lowerCAmelCase_      			=			classifier_dropout





class 			_lowerCAmelCase      (			__a ):




				@property
				def   __a		(      self  )       ->   Mapping[str, Mapping[int, str]]:
							if self.task == "multiple-choice":
										lowerCAmelCase_      			=			{0: "batch", 1: "choice", 2: "sequence"}
							else:
										lowerCAmelCase_      			=			{0: "batch", 1: "sequence"}
							return OrderedDict(
							    [
							        ("input_ids", dynamic_axis),
							        ("attention_mask", dynamic_axis),
							        ("token_type_ids", dynamic_axis),
							    ]  )



