"""simple docstring"""
import argparse

import pytorch_lightning as pl
import torch
from torch import nn

from transformers import LongformerForQuestionAnswering, LongformerModel



class 					lowerCAmelCase_      (     pl.LightningModule   ):



				"""simple docstring"""

				def __init__(			self						,      lowerCAmelCase      ):






										"""simple docstring"""

										super().__init__()
										snake_case        =     model
										snake_case        =     2
										snake_case        =     nn.Linear(self.model.config.hidden_size						,      self.num_labels      )

				def 						snake_case	(			self      ):






										"""simple docstring"""

										pass





def 				lowerCAmelCase__      (     _UpperCamelCase    :			List[Any]	,     _UpperCamelCase    :			Dict	,     _UpperCamelCase    :			Dict   )   ->			Tuple:





						"""simple docstring"""






						snake_case        =     LongformerModel.from_pretrained(_UpperCAmelCase   )
						snake_case        =     LightningModel(_UpperCAmelCase   )

						snake_case        =     torch.load(_UpperCAmelCase	,     map_location=torch.device('cpu'   )   )
						lightning_model.load_state_dict(ckpt['state_dict']   )

						# init longformer question answering model
						snake_case        =     LongformerForQuestionAnswering.from_pretrained(_UpperCAmelCase   )

						# transfer weights
						longformer_for_qa.longformer.load_state_dict(lightning_model.model.state_dict()   )
						longformer_for_qa.qa_outputs.load_state_dict(lightning_model.qa_outputs.state_dict()   )
						longformer_for_qa.eval()

						# save model
						longformer_for_qa.save_pretrained(_UpperCAmelCase   )

						print(f"""Conversion successful. Model saved under {pytorch_dump_folder_path}"""   )


if __name__ == "__main__":
					SCREAMING_SNAKE_CASE__      =					argparse.ArgumentParser()
					# Required parameters
					parser.add_argument(
					    "--longformer_model",
					    default=None,
					    type=str,
					    required=True,
					    help="model identifier of longformer. Should be either `longformer-base-4096` or `longformer-large-4096`.",
					)
					parser.add_argument(
					    "--longformer_question_answering_ckpt_path",
					    default=None,
					    type=str,
					    required=True,
					    help="Path the official PyTorch Lightning Checkpoint.",
					)
					parser.add_argument(
					    "--pytorch_dump_folder_path", default=None, type=str, required=True, help="Path to the output PyTorch model."
					)
					SCREAMING_SNAKE_CASE__      =					parser.parse_args()
					convert_longformer_qa_checkpoint_to_pytorch(
					    args.longformer_model, args.longformer_question_answering_ckpt_path, args.pytorch_dump_folder_path
					)



"""simple docstring"""
import pickle
import unittest

import torch

from accelerate import Accelerator
from accelerate.state import AcceleratorState
from accelerate.test_utils import require_cpu



@require_cpu
class 					lowerCAmelCase_      (     unittest.TestCase   ):



				"""simple docstring"""

				def 						snake_case	(			self      ):






										"""simple docstring"""

										snake_case        =     torch.nn.Linear(10						,      10      )
										snake_case        =     torch.optim.SGD(model.parameters()						,      0.1      )
										snake_case        =     Accelerator()
										snake_case        =     accelerator.prepare(lowerCAmelCase      )
										try:
																pickle.loads(pickle.dumps(lowerCAmelCase      )      )
										except Exception as e:
																self.fail(F"""Accelerated optimizer pickling failed with {e}"""      )
										AcceleratorState._reset_state()


