



import argparse

import torch

from transformers import BertForMaskedLM


if __name__ == "__main__":
   _lowercase						  =		argparse.ArgumentParser(
       description=(
           "Extraction some layers of the full BertForMaskedLM or RObertaForMaskedLM for Transfer Learned"
           " Distillation"
       )
   )
   parser.add_argument("--model_type", default="bert", choices=["bert"])
   parser.add_argument("--model_name", default="bert-base-uncased", type=str)
   parser.add_argument("--dump_checkpoint", default="serialization_dir/tf_bert-base-uncased_0247911.pth", type=str)
   parser.add_argument("--vocab_transform", action="store_true")
   _lowercase						  =		parser.parse_args()

   if args.model_type == "bert":
      _lowercase						  =		BertForMaskedLM.from_pretrained(args.model_name)
      _lowercase						  =		"bert"
   else:
      raise ValueError("args.model_type should be \"bert\".")

   _lowercase						  =		model.state_dict()
   _lowercase						  =		{}

   for w in ["word_embeddings", "position_embeddings"]:
      _lowercase						  =		state_dict[F"{prefix}.embeddings.{w}.weight"]
   for w in ["weight", "bias"]:
      _lowercase						  =		state_dict[F"{prefix}.embeddings.LayerNorm.{w}"]

   _lowercase						  =		0
   for teacher_idx in [0, 2, 4, 7, 9, 11]:
      for w in ["weight", "bias"]:
         _lowercase						  =		state_dict[
             F"{prefix}.encoder.layer.{teacher_idx}.attention.self.query.{w}"
         ]
         _lowercase						  =		state_dict[
             F"{prefix}.encoder.layer.{teacher_idx}.attention.self.key.{w}"
         ]
         _lowercase						  =		state_dict[
             F"{prefix}.encoder.layer.{teacher_idx}.attention.self.value.{w}"
         ]

         _lowercase						  =		state_dict[
             F"{prefix}.encoder.layer.{teacher_idx}.attention.output.dense.{w}"
         ]
         _lowercase						  =		state_dict[
             F"{prefix}.encoder.layer.{teacher_idx}.attention.output.LayerNorm.{w}"
         ]

         _lowercase						  =		state_dict[
             F"{prefix}.encoder.layer.{teacher_idx}.intermediate.dense.{w}"
         ]
         _lowercase						  =		state_dict[
             F"{prefix}.encoder.layer.{teacher_idx}.output.dense.{w}"
         ]
         _lowercase						  =		state_dict[
             F"{prefix}.encoder.layer.{teacher_idx}.output.LayerNorm.{w}"
         ]
      std_idx += 1

   _lowercase						  =		state_dict["cls.predictions.decoder.weight"]
   _lowercase						  =		state_dict["cls.predictions.bias"]
   if args.vocab_transform:
      for w in ["weight", "bias"]:
         _lowercase						  =		state_dict[F"cls.predictions.transform.dense.{w}"]
         _lowercase						  =		state_dict[F"cls.predictions.transform.LayerNorm.{w}"]

   print(F"N layers selected for distillation: {std_idx}")
   print(F"Number of params transferred for distillation: {len(compressed_sd.keys())}")

   print(F"Save transferred checkpoint to {args.dump_checkpoint}.")
   torch.save(compressed_sd, args.dump_checkpoint)





from typing import TYPE_CHECKING

from ...utils import (
    OptionalDependencyNotAvailable,
    _LazyModule,
    is_tf_available,
    is_torch_available,
    is_vision_available,
)


_lowercase						  =		{
    "configuration_mobilevit": ["MOBILEVIT_PRETRAINED_CONFIG_ARCHIVE_MAP", "MobileViTConfig", "MobileViTOnnxConfig"],
}

try:
   if not is_vision_available():
      raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
   pass
else:
   _lowercase						  =		["MobileViTFeatureExtractor"]
   _lowercase						  =		["MobileViTImageProcessor"]

try:
   if not is_torch_available():
      raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
   pass
else:
   _lowercase						  =		[
       "MOBILEVIT_PRETRAINED_MODEL_ARCHIVE_LIST",
       "MobileViTForImageClassification",
       "MobileViTForSemanticSegmentation",
       "MobileViTModel",
       "MobileViTPreTrainedModel",
   ]

try:
   if not is_tf_available():
      raise OptionalDependencyNotAvailable()
except OptionalDependencyNotAvailable:
   pass
else:
   _lowercase						  =		[
       "TF_MOBILEVIT_PRETRAINED_MODEL_ARCHIVE_LIST",
       "TFMobileViTForImageClassification",
       "TFMobileViTForSemanticSegmentation",
       "TFMobileViTModel",
       "TFMobileViTPreTrainedModel",
   ]

if TYPE_CHECKING:
   from .configuration_mobilevit import MOBILEVIT_PRETRAINED_CONFIG_ARCHIVE_MAP, MobileViTConfig, MobileViTOnnxConfig

   try:
      if not is_vision_available():
         raise OptionalDependencyNotAvailable()
   except OptionalDependencyNotAvailable:
      pass
   else:
      from .feature_extraction_mobilevit import MobileViTFeatureExtractor
      from .image_processing_mobilevit import MobileViTImageProcessor

   try:
      if not is_torch_available():
         raise OptionalDependencyNotAvailable()
   except OptionalDependencyNotAvailable:
      pass
   else:
      from .modeling_mobilevit import (
          MOBILEVIT_PRETRAINED_MODEL_ARCHIVE_LIST,
          MobileViTForImageClassification,
          MobileViTForSemanticSegmentation,
          MobileViTModel,
          MobileViTPreTrainedModel,
      )

   try:
      if not is_tf_available():
         raise OptionalDependencyNotAvailable()
   except OptionalDependencyNotAvailable:
      pass
   else:
      from .modeling_tf_mobilevit import (
          TF_MOBILEVIT_PRETRAINED_MODEL_ARCHIVE_LIST,
          TFMobileViTForImageClassification,
          TFMobileViTForSemanticSegmentation,
          TFMobileViTModel,
          TFMobileViTPreTrainedModel,
      )


else:
   import sys

   _lowercase						  =		_LazyModule(__name__, globals()["__file__"], _import_structure, module_spec=__spec__)
