
import argparse
import logging
import math
import time

import torch

from transformers import TransfoXLCorpus, TransfoXLLMHeadModel


logging.basicConfig(
    format="""%(asctime)s - %(levelname)s - %(name)s - %(message)s""", datefmt="""%m/%d/%Y %H:%M:%S""", level=logging.INFO
)
__a							  =						logging.getLogger(__name__)

def    UpperCamelCase_ (	)     ->Optional[int]:
		A				=argparse.ArgumentParser(description="PyTorch Transformer Language Model"		)
		parser.add_argument("--model_name"  ,				type=a_  ,				default="transfo-xl-wt103"  ,				help="pretrained model name"		)
		parser.add_argument(
		    "--split"  ,				type=a_  ,				default="test"  ,				choices=["all", "valid", "test"]  ,				help="which split to evaluate"		)
		parser.add_argument("--batch_size"  ,				type=a_  ,				default=10  ,				help="batch size"		)
		parser.add_argument("--tgt_len"  ,				type=a_  ,				default=128  ,				help="number of tokens to predict"		)
		parser.add_argument("--ext_len"  ,				type=a_  ,				default=0  ,				help="length of the extended context"		)
		parser.add_argument("--mem_len"  ,				type=a_  ,				default=1600  ,				help="length of the retained previous heads"		)
		parser.add_argument("--clamp_len"  ,				type=a_  ,				default=1000  ,				help="max positional embedding index"		)
		parser.add_argument("--no_cuda"  ,				action="store_true"  ,				help="Do not use CUDA even though CUA is available"		)
		parser.add_argument("--work_dir"  ,				type=a_  ,				required=a_  ,				help="path to the work_dir"		)
		parser.add_argument("--no_log"  ,				action="store_true"  ,				help="do not log the eval result"		)
		parser.add_argument("--same_length"  ,				action="store_true"  ,				help="set same length attention with masking"		)
		parser.add_argument("--server_ip"  ,				type=a_  ,				default=""  ,				help="Can be used for distant debugging."		)
		parser.add_argument("--server_port"  ,				type=a_  ,				default=""  ,				help="Can be used for distant debugging."		)
		A				=parser.parse_args()
		assert args.ext_len >= 0, "extended context length must be non-negative"

		if args.server_ip and args.server_port:
				# Distant debugging - see https://code.visualstudio.com/docs/python/debugging#_attach-to-a-local-script
				import ptvsd

				print("Waiting for debugger attach"		)
				ptvsd.enable_attach(address=(args.server_ip, args.server_port)  ,				redirect_output=a_		)
				ptvsd.wait_for_attach()

		A				=torch.device("cuda" if torch.cuda.is_available() and not args.no_cuda else "cpu"		)
		logger.info("device: {}".format(a_		)		)

		# Load a pre-processed dataset
		# You can also build the corpus yourself using TransfoXLCorpus methods
		# The pre-processing involve computing word frequencies to prepare the Adaptive input and SoftMax
		# and tokenizing the dataset
		# The pre-processed corpus is a convertion (using the conversion script )
		A				=TransfoXLCorpus.from_pretrained(args.model_name		)

		A				=corpus.get_iterator("valid"  ,				args.batch_size  ,				args.tgt_len  ,				device=a_  ,				ext_len=args.ext_len		)
		A				=corpus.get_iterator("test"  ,				args.batch_size  ,				args.tgt_len  ,				device=a_  ,				ext_len=args.ext_len		)

		# Load a pre-trained model
		A				=TransfoXLLMHeadModel.from_pretrained(args.model_name		)
		model.to(a_		)

		logger.info(
		    "Evaluating with bsz {} tgt_len {} ext_len {} mem_len {} clamp_len {}".format(
		        args.batch_size  ,				args.tgt_len  ,				args.ext_len  ,				args.mem_len  ,				args.clamp_len		)		)

		model.reset_memory_length(args.mem_len		)
		if args.clamp_len > 0:
				A				=args.clamp_len
		if args.same_length:
				A				=True

		###############################################################################
		# Evaluation code
		###############################################################################
		def evaluate(a_		):
				# Turn on evaluation mode which disables dropout.
				model.eval()
				A			,    A				=0, 0.0
				A				=time.time()
				with torch.no_grad():
						A				=None
						for idx, (data, target, seq_len) in enumerate(a_		):
								A				=model(a_  ,				lm_labels=a_  ,				mems=a_		)
								A			,    A			,    A				=ret
								A				=loss.mean()
								total_loss += seq_len * loss.item()
								total_len += seq_len
						A				=time.time() - start_time
				logger.info("Time : {:.2f}s, {:.2f}ms/segment".format(a_  ,				1000 * total_time / (idx + 1)		)		)
				return total_loss / total_len

		# Run on test data.
		if args.split == "all":
				A				=evaluate(a_		)
				A				=evaluate(a_		)
		elif args.split == "valid":
				A				=evaluate(a_		)
				A				=None
		elif args.split == "test":
				A				=evaluate(a_		)
				A				=None

		def format_log(a_  ,				a_		):
				A				="| {0} loss {1:5.2f} | {0} ppl {2:9.3f} ".format(a_  ,				a_  ,				math.exp(a_		)		)
				return log_str

		A				=""
		if valid_loss is not None:
				log_str += format_log(a_  ,				"valid"		)
		if test_loss is not None:
				log_str += format_log(a_  ,				"test"		)

		logger.info("=" * 100		)
		logger.info(a_		)
		logger.info("=" * 100		)


if __name__ == "__main__":
	main()






import argparse
import os
from functools import reduce

import fairseq
import torch
from datasets import load_dataset

from transformers import WavaVecaProcessor, logging
from transformers.models.dataavec.configuration_dataavec_audio import DataaVecAudioConfig

# Copied from https://github.com/pytorch/fairseq/blob/main/examples/data2vec/models/data2vec_audio.py
from transformers.models.dataavec.dataavec_audio import DataaVecAudioModel as Dummy  # noqa: F401
from transformers.models.dataavec.modeling_dataavec_audio import DataaVecAudioForCTC, DataaVecAudioModel


logging.set_verbosity_info()
__a							  =						logging.get_logger(__name__)

__a							  =						{
    """post_extract_proj""": """feature_projection.projection""",
    """models.0.layer_norm""": """feature_projection.layer_norm""",
    """self_attn.k_proj""": """encoder.layers.*.attention.k_proj""",
    """self_attn.v_proj""": """encoder.layers.*.attention.v_proj""",
    """self_attn.q_proj""": """encoder.layers.*.attention.q_proj""",
    """self_attn.out_proj""": """encoder.layers.*.attention.out_proj""",
    """self_attn_layer_norm""": """encoder.layers.*.layer_norm""",
    """fc1""": """encoder.layers.*.feed_forward.intermediate_dense""",
    """fc2""": """encoder.layers.*.feed_forward.output_dense""",
    """final_layer_norm""": """encoder.layers.*.final_layer_norm""",
    """encoder.layer_norm""": """encoder.layer_norm""",
    """w2v_model.layer_norm""": """feature_projection.layer_norm""",
    """w2v_encoder.proj""": """lm_head""",
    """mask_emb""": """masked_spec_embed""",
}
__a							  =						[
    """lm_head""",
]

def    UpperCamelCase_ (	a_  ,				a_  ,				a_  ,				a_  ,				a_		)     ->Dict:
		for attribute in key.split("."		):
				A				=getattr(a_  ,				a_		)

		if weight_type is not None:
				A				=getattr(a_  ,				a_		).shape
		else:
				A				=hf_pointer.shape

		if hf_shape != value.shape:
				raise ValueError(
				    f'''Shape of hf {key + "." + weight_type if weight_type is not None else ""} is {hf_shape}, but should be'''
				    f''' {value.shape} for {full_name}'''		)

		if weight_type == "weight":
				A				=value
		elif weight_type == "weight_g":
				A				=value
		elif weight_type == "weight_v":
				A				=value
		elif weight_type == "bias":
				A				=value
		else:
				A				=value

		logger.info(f'''{key + "." + weight_type if weight_type is not None else ""} was initialized from {full_name}.'''		)

def    UpperCamelCase_ (	a_  ,				a_  ,				a_		)     ->Union[str, Any]:
		A				=[]
		A				=fairseq_model.state_dict()

		if not is_headless:
				A				=hf_model.dataavec_audio.feature_extractor
				A				=hf_model.dataavec_audio.encoder.pos_conv_embed

		else:
				A				=hf_model.feature_extractor
				A				=hf_model.encoder.pos_conv_embed

		for name, value in fairseq_dict.items():
				A				=False
				if "conv_layers" in name:
						load_conv_layer(
						    a_  ,				a_  ,				a_  ,				a_  ,				)
						A				=True
				elif "pos_conv" in name:
						load_pos_conv_layer(
						    a_  ,				a_  ,				a_  ,				a_  ,				)
						A				=True
				else:
						for key, mapped_key in MAPPING.items():
								if not is_headless:
										A				="data2vec_audio." + mapped_key if mapped_key not in TOP_LEVEL_KEYS else mapped_key
								if key in name or key.split("w2v_model."		)[-1] == name.split("."		)[0]:
										A				=True
										if "*" in mapped_key:
												A				=name.split(a_		)[0].split("."		)[-2]
												A				=mapped_key.replace("*"  ,				a_		)
										if "weight_g" in name:
												A				="weight_g"
										elif "weight_v" in name:
												A				="weight_v"
										elif "bias" in name:
												A				="bias"
										elif "weight" in name:
												# TODO: don't match quantizer.weight_proj
												A				="weight"
										else:
												A				=None
										set_recursively(a_  ,				a_  ,				a_  ,				a_  ,				a_		)
								continue
				if not is_used:
						unused_weights.append(a_		)

		logger.warning(f'''Unused weights: {unused_weights}'''		)

def    UpperCamelCase_ (	a_  ,				a_		)     ->List[str]:
		A				=path.split("."		)
		return reduce(a_  ,				a_  ,				a_		)

def    UpperCamelCase_ (	a_  ,				a_  ,				a_  ,				a_		)     ->str:
		A				=access_by_string(a_  ,				a_		)
		A				=hf_weight.data

		if fsq_value.shape != hf_value.shape:
				raise ValueError(f'''{full_name} has size {fsq_value.shape}, but {hf_value.shape} was found.'''		)
		A				=fsq_value
		logger.info(f'''{full_name} was correctly initialized from {hf_weight_path}.'''		)

def    UpperCamelCase_ (	a_  ,				a_  ,				a_  ,				a_		)     ->List[Any]:
		A				=full_name.split("conv_layers."		)[-1]
		A				=name.split("."		)
		A				=int(items[0]		)
		A				=int(items[1]		)

		A				=name.split("."		)[-1]
		if type_id == 0:
				A				="conv"
		elif type_id == 2:
				A				="layer_norm"
		else:
				unused_weights.append(a_		)
				return

		set_weights(a_  ,				a_  ,				a_  ,				f'''conv_layers.{layer_id}.{layer_type}.{weight_type}'''		)

def    UpperCamelCase_ (	a_  ,				a_  ,				a_  ,				a_		)     ->str:
		A				=full_name.split("pos_conv."		)[-1]
		A				=name.split("."		)
		A				=int(items[0]		)
		A				=int(items[1]		)

		A				=name.split("."		)[-1]
		if type_id != 0:
				unused_weights.append(a_		)
				return
		else:
				A				="conv"

		set_weights(a_  ,				a_  ,				a_  ,				f'''layers.{layer_id}.{layer_type}.{weight_type}'''		)

@torch.no_grad()
def    UpperCamelCase_ (	a_  ,				a_  ,				a_=None  ,				a_=None  ,				a_=True		)     ->Optional[int]:
		if config_path is not None:
				A				=DataaVecAudioConfig.from_pretrained(a_		)
		else:
				A				=DataaVecAudioConfig()

		if not is_finetuned:
				# Modify final_proj layer name
				A				=DataaVecAudioModel(a_		)
				A				=os.path.dirname(a_		)

				A				=torch.load(a_		)
				A				=state_dict["model"].pop("final_proj.0.weight"		)
				A				=state_dict["model"].pop("final_proj.0.bias"		)
				A				=os.path.join(a_  ,				"converted.pt"		)
				torch.save(a_  ,				a_		)
		else:
				A				=DataaVecAudioForCTC(a_		)
				A				=checkpoint_path

		def load_dataavec(a_		):
				A			,    A			,    A				=fairseq.checkpoint_utils.load_model_ensemble_and_task([path]		)
				return model[0].eval()

		A				=load_dataavec(a_		)

		recursively_load_weights(a_  ,				a_  ,				not is_finetuned		)

		A				=WavaVecaProcessor.from_pretrained("facebook/wav2vec2-large-lv60"		)

		A				=load_dataset("patrickvonplaten/librispeech_asr_dummy"  ,				"clean"  ,				split="validation"		)
		A				=[x["array"] for x in ds[:4]["audio"]]

		A				=processor(a_  ,				return_tensors="pt"  ,				padding=a_		)

		A				=inputs.input_values
		A				=inputs.attention_mask
		#    input_values = inputs.input_values[:, :-1]
		#    attention_mask = inputs.attention_mask[:, :-1]

		hf_wavavec.eval()
		model.eval()
		if is_finetuned:
				A				=model(source=a_  ,				padding_mask=(1 - attention_mask)  ,				mask=a_  ,				features_only=a_		)[
				    "encoder_out"
				].transpose(0  ,				1		)
				A				=hf_wavavec(a_  ,				attention_mask=a_		)["logits"]

				A				=torch.argmax(a_  ,				dim=-1		)
				A				=processor.batch_decode(a_		)

				print(f'''Expected Output: {ds[:4]["text"]}, Pred: {output_string}'''		)
		else:
				A				=model(source=a_  ,				padding_mask=(1 - attention_mask)  ,				mask=a_  ,				features_only=a_		)[
				    "layer_results"
				][-1][0].transpose(0  ,				1		)
				A				=hf_wavavec(a_  ,				attention_mask=a_		)["last_hidden_state"]

		print(our_output.shape  ,				their_output.shape		)
		A				=torch.max(torch.abs(our_output - their_output		)		).item()
		print(f'''max_absolute_diff = {max_absolute_diff}'''		)  # ~ 1e-7
		A				=torch.allclose(a_  ,				a_  ,				atol=1E-3		)
		print("Do both models output the same tensors?"  ,				"🔥" if success else "💩"		)
		if not success:
				raise Exception("Something went wRoNg"		)

		hf_wavavec.save_pretrained(a_		)

		if is_finetuned:
				processor.save_pretrained(a_		)
		else:
				processor.feature_extractor.save_pretrained(a_		)


if __name__ == "__main__":
	__a							  =						argparse.ArgumentParser()
	parser.add_argument("""--pytorch_dump_folder_path""", default=None, type=str, help="""Path to the output PyTorch model.""")
	parser.add_argument("""--checkpoint_path""", default=None, type=str, help="""Path to fairseq checkpoint""")
	parser.add_argument("""--dict_path""", default=None, type=str, help="""Path to dict of fine-tuned model""")
	parser.add_argument("""--config_path""", default=None, type=str, help="""Path to hf config.json of model to convert""")
	parser.add_argument(
	    """--not_finetuned""", action="""store_true""", help="""Whether the model to convert is a fine-tuned model or not"""
	)
	__a							  =						parser.parse_args()
	convert_wavaveca_checkpoint(
	    args.checkpoint_path, args.pytorch_dump_folder_path, args.config_path, args.dict_path, not args.not_finetuned
	)




