


import importlib.metadata
import warnings
from copy import deepcopy

from packaging import version

from ..utils import logging
from .import_utils import is_accelerate_available, is_bitsandbytes_available


if is_bitsandbytes_available():
			import bitsandbytes as bnb
			import torch
			import torch.nn as nn

			from ..pytorch_utils import ConvaD

if is_accelerate_available():
			from accelerate import init_empty_weights
			from accelerate.utils import find_tied_parameters

_snake_case  :	Any			      =       logging.get_logger(__name__)







def        lowerCAmelCase_  (      __lowerCamelCase							,			__lowerCamelCase							,			__lowerCamelCase							,			__lowerCamelCase=None							,			__lowerCamelCase=None			):
							# Recurse if needed
							if "." in tensor_name:
														__snake_case	:    Tuple											=     tensor_name.split("."			)
														for split in splits[:-1]:
																					__snake_case	:    List[str]											=     getattr(__lowerCamelCase							,			__lowerCamelCase			)
																					if new_module is None:
																												raise ValueError(F'{module} has no attribute {split}.'			)
																					__snake_case	:    Optional[int]											=     new_module
														__snake_case	:    Union[str, Any]											=     splits[-1]

							if tensor_name not in module._parameters and tensor_name not in module._buffers:
														raise ValueError(F'{module} does not have a parameter or a buffer named {tensor_name}.'			)
							__snake_case	:    Optional[int]											=     tensor_name in module._buffers
							__snake_case	:    List[str]											=     getattr(__lowerCamelCase							,			__lowerCamelCase			)

							if old_value.device == torch.device("meta"			) and device not in ["meta", torch.device("meta"			)] and value is None:
														raise ValueError(F'{tensor_name} is on the meta device, we need a `value` to put in on {device}.'			)

							__snake_case	:    List[Any]											=     False
							__snake_case	:    Optional[int]											=     False
							if is_buffer or not is_bitsandbytes_available():
														__snake_case	:    Dict											=     False
														__snake_case	:    Optional[int]											=     False
							else:
														__snake_case	:    Any											=     hasattr(bnb.nn							,			"Params4bit"			) and isinstance(module._parameters[tensor_name]							,			bnb.nn.Paramsabit			)
														__snake_case	:    Union[str, Any]											=     isinstance(module._parameters[tensor_name]							,			bnb.nn.IntaParams			)

							if is_abit or is_abit:
														__snake_case	:    Union[str, Any]											=     module._parameters[tensor_name]
														if param.device.type != "cuda":
																					if value is None:
																												__snake_case	:    Any											=     old_value.to(__lowerCamelCase			)
																					elif isinstance(__lowerCamelCase							,			torch.Tensor			):
																												__snake_case	:    int											=     value.to("cpu"			)
																												if value.dtype == torch.inta:
																																			__snake_case	:    Optional[int]											=     version.parse(importlib.metadata.version("bitsandbytes"			)			) > version.parse(
																																			    "0.37.2"			)
																																			if not is_abit_serializable:
																																										raise ValueError(
																																										    "Detected int8 weights but the version of bitsandbytes is not compatible with int8 serialization. "
																																										    "Make sure to download the latest `bitsandbytes` version. `pip install --upgrade bitsandbytes`."			)
																					else:
																												__snake_case	:    Optional[int]											=     torch.tensor(__lowerCamelCase							,			device="cpu"			)

																					# Support models using `Conv1D` in place of `nn.Linear` (e.g. gpt2) by transposing the weight matrix prior to quantization.
																					# Since weights are saved in the correct "orientation", we skip transposing when loading.
																					if issubclass(module.source_cls							,			__lowerCamelCase			) and fpaa_statistics is None:
																												__snake_case	:    List[Any]											=     new_value.T

																					__snake_case	:    Tuple											=     old_value.__dict__
																					if is_abit:
																												__snake_case	:    List[str]											=     bnb.nn.IntaParams(__lowerCamelCase							,			requires_grad=__lowerCamelCase							,			**__lowerCamelCase			).to(__lowerCamelCase			)
																					elif is_abit:
																												__snake_case	:    Optional[int]											=     bnb.nn.Paramsabit(__lowerCamelCase							,			requires_grad=__lowerCamelCase							,			**__lowerCamelCase			).to(__lowerCamelCase			)

																					__snake_case	:    Dict											=     new_value
																					if fpaa_statistics is not None:
																												setattr(module.weight							,			"SCB"							,			fpaa_statistics.to(__lowerCamelCase			)			)

							else:
														if value is None:
																					__snake_case	:    Tuple											=     old_value.to(__lowerCamelCase			)
														elif isinstance(__lowerCamelCase							,			torch.Tensor			):
																					__snake_case	:    Dict											=     value.to(__lowerCamelCase			)
														else:
																					__snake_case	:    List[Any]											=     torch.tensor(__lowerCamelCase							,			device=__lowerCamelCase			)

														if is_buffer:
																					__snake_case	:    Optional[Any]											=     new_value
														else:
																					__snake_case	:    int											=     nn.Parameter(__lowerCamelCase							,			requires_grad=old_value.requires_grad			)
																					__snake_case	:    Tuple											=     new_value







def        lowerCAmelCase_  (      __lowerCamelCase							,			__lowerCamelCase=None							,			__lowerCamelCase=None							,			__lowerCamelCase=None							,			__lowerCamelCase=False			):
							for name, module in model.named_children():
														if current_key_name is None:
																					__snake_case	:    List[Any]											=     []
														current_key_name.append(__lowerCamelCase			)

														if (isinstance(__lowerCamelCase							,			nn.Linear			) or isinstance(__lowerCamelCase							,			__lowerCamelCase			)) and name not in modules_to_not_convert:
																					# Check if the current key is not in the `modules_to_not_convert`
																					if not any(key in ".".join(__lowerCamelCase			) for key in modules_to_not_convert			):
																												with init_empty_weights():
																																			if isinstance(__lowerCamelCase							,			__lowerCamelCase			):
																																										__snake_case				,    __snake_case	:    Union[str, Any]											=     module.weight.shape
																																			else:
																																										__snake_case	:    List[Any]											=     module.in_features
																																										__snake_case	:    Tuple											=     module.out_features

																																			if quantization_config.quantization_method() == "llm_int8":
																																										__snake_case	:    Tuple											=     bnb.nn.LinearabitLt(
																																										    __lowerCamelCase							,			__lowerCamelCase							,			module.bias is not None							,			has_fpaa_weights=quantization_config.llm_inta_has_fpaa_weight							,			threshold=quantization_config.llm_inta_threshold							,			)
																																										__snake_case	:    List[str]											=     True
																																			else:
																																										if (
																																										    quantization_config.llm_inta_skip_modules is not None
																																										    and name in quantization_config.llm_inta_skip_modules
																																										):
																																																	pass
																																										else:
																																																	__snake_case	:    Optional[int]											=     bnb.nn.Linearabit(
																																																	    __lowerCamelCase							,			__lowerCamelCase							,			module.bias is not None							,			quantization_config.bnb_abit_compute_dtype							,			compress_statistics=quantization_config.bnb_abit_use_double_quant							,			quant_type=quantization_config.bnb_abit_quant_type							,			)
																																																	__snake_case	:    int											=     True
                    # Store the module class in case we need to transpose the weight later
																																			__snake_case	:    str											=     type(__lowerCamelCase			)
																																			# Force requires grad to False to avoid unexpected errors
																																			model._modules[name].requires_grad_(__lowerCamelCase			)
														if len(list(module.children()			)			) > 0:
																					__snake_case				,    __snake_case	:    Tuple											=     _replace_with_bnb_linear(
																					    __lowerCamelCase							,			__lowerCamelCase							,			__lowerCamelCase							,			__lowerCamelCase							,			has_been_replaced=__lowerCamelCase							,			)
														# Remove the last key for recursion
														current_key_name.pop(-1			)
							return model, has_been_replaced







def        lowerCAmelCase_  (      __lowerCamelCase							,			__lowerCamelCase=None							,			__lowerCamelCase=None							,			__lowerCamelCase=None			):
							__snake_case	:    List[str]											=     ["lm_head"] if modules_to_not_convert is None else modules_to_not_convert
							__snake_case				,    __snake_case	:    Any											=     _replace_with_bnb_linear(
							    __lowerCamelCase							,			__lowerCamelCase							,			__lowerCamelCase							,			__lowerCamelCase			)

							if not has_been_replaced:
														logger.warning(
														    "You are loading your model in 8bit or 4bit but no linear modules were found in your model."
														    " Please double check your model architecture, or submit an issue on github if you think this is"
														    " a bug."			)

							return model







def        lowerCAmelCase_  (      *__lowerCamelCase							,			**__lowerCamelCase			):
							warnings.warn(
							    "`replace_8bit_linear` will be deprecated in a future version, please use `replace_with_bnb_linear` instead"							,			__lowerCamelCase							,			)
							return replace_with_bnb_linear(*__lowerCamelCase							,			**__lowerCamelCase			)







def        lowerCAmelCase_  (      *__lowerCamelCase							,			**__lowerCamelCase			):
							warnings.warn(
							    "`set_module_8bit_tensor_to_device` will be deprecated in a future version, please use `set_module_quantized_tensor_to_device` instead"							,			__lowerCamelCase							,			)
							return set_module_quantized_tensor_to_device(*__lowerCamelCase							,			**__lowerCamelCase			)







def        lowerCAmelCase_  (      __lowerCamelCase			):
							__snake_case	:    Optional[int]											=     deepcopy(__lowerCamelCase			)  # this has 0 cost since it is done inside `init_empty_weights` context manager`
							tied_model.tie_weights()

							__snake_case	:    Any											=     find_tied_parameters(__lowerCamelCase			)
							# For compatibility with Accelerate < 0.18
							if isinstance(__lowerCamelCase							,			__lowerCamelCase			):
														__snake_case	:    Dict											=     sum(list(tied_params.values()			)							,			[]			) + list(tied_params.keys()			)
							else:
														__snake_case	:    Any											=     sum(__lowerCamelCase							,			[]			)
							__snake_case	:    Optional[int]											=     len(__lowerCamelCase			) > 0

							# Check if it is a base model
							__snake_case	:    Dict											=     not hasattr(__lowerCamelCase							,			model.base_model_prefix			)

							# Ignore this for base models (BertModel, GPT2Model, etc.)
							if (not has_tied_params) and is_base_model:
														return []

							# otherwise they have an attached head
							__snake_case	:    Optional[int]											=     list(model.named_children()			)
							__snake_case	:    List[str]											=     [list_modules[-1][0]]

							# add last module together with tied weights
							__snake_case	:    int											=     set(__lowerCamelCase			) - set(__lowerCamelCase			)
							__snake_case	:    Optional[Any]											=     list(set(__lowerCamelCase			)			) + list(__lowerCamelCase			)

							# remove ".weight" from the keys
							__snake_case	:    Optional[Any]											=     [".weight", ".bias"]
							__snake_case	:    Any											=     []
							for name in list_untouched:
														for name_to_remove in names_to_remove:
																					if name_to_remove in name:
																												__snake_case	:    Optional[int]											=     name.replace(__lowerCamelCase							,			""			)
														filtered_module_names.append(__lowerCamelCase			)

							return filtered_module_names





import unittest

from transformers import BertGenerationTokenizer
from transformers.testing_utils import get_tests_dir, require_sentencepiece, require_torch, slow
from transformers.utils import cached_property

from ...test_tokenization_common import TokenizerTesterMixin


_snake_case  :	Optional[int]			      =       "▁"

_snake_case  :	Tuple			      =       get_tests_dir("fixtures/test_sentencepiece.model")

@require_sentencepiece
class        a	(_lowerCAmelCase  ,       unittest.TestCase   ):




							"""simple docstring"""


							__UpperCAmelCase					:							Optional[Any]  						=						BertGenerationTokenizer
							__UpperCAmelCase					:							List[Any]  						=						False
							__UpperCAmelCase					:							List[Any]  						=						True

							def 					__snake_case      (							self :						Optional[int]       )			->					Optional[int]:
														super().setUp()

														__snake_case	:    Tuple											=     BertGenerationTokenizer(lowerCamelCase					,			keep_accents=lowerCamelCase       )
														tokenizer.save_pretrained(self.tmpdirname       )

							def 					__snake_case      (							self :						Dict       )			->					int:
														__snake_case	:    str											=     "<s>"
														__snake_case	:    Any											=     1

														self.assertEqual(self.get_tokenizer()._convert_token_to_id(lowerCamelCase       )					,			lowerCamelCase       )
														self.assertEqual(self.get_tokenizer()._convert_id_to_token(lowerCamelCase       )					,			lowerCamelCase       )

							def 					__snake_case      (							self :						str       )			->					Optional[Any]:
														__snake_case	:    int											=     list(self.get_tokenizer().get_vocab().keys()       )

														self.assertEqual(vocab_keys[0]					,			"<unk>"       )
														self.assertEqual(vocab_keys[1]					,			"<s>"       )
														self.assertEqual(vocab_keys[-1]					,			"<pad>"       )
														self.assertEqual(len(lowerCamelCase       )					,			1002       )

							def 					__snake_case      (							self :						List[str]       )			->					Optional[int]:
														self.assertEqual(self.get_tokenizer().vocab_size					,			1000       )

							def 					__snake_case      (							self :						List[str]       )			->					Union[str, Any]:
														__snake_case	:    List[Any]											=     BertGenerationTokenizer(lowerCamelCase					,			keep_accents=lowerCamelCase       )

														__snake_case	:    int											=     tokenizer.tokenize("This is a test"       )
														self.assertListEqual(lowerCamelCase					,			["▁This", "▁is", "▁a", "▁t", "est"]       )

														self.assertListEqual(
														    tokenizer.convert_tokens_to_ids(lowerCamelCase       )					,			[285, 46, 10, 170, 382]					,			)

														__snake_case	:    str											=     tokenizer.tokenize("I was born in 92000, and this is falsé."       )
														self.assertListEqual(
														    lowerCamelCase					,			[
														        SPIECE_UNDERLINE + "I",
														        SPIECE_UNDERLINE + "was",
														        SPIECE_UNDERLINE + "b",
														        "or",
														        "n",
														        SPIECE_UNDERLINE + "in",
														        SPIECE_UNDERLINE + "",
														        "9",
														        "2",
														        "0",
														        "0",
														        "0",
														        ",",
														        SPIECE_UNDERLINE + "and",
														        SPIECE_UNDERLINE + "this",
														        SPIECE_UNDERLINE + "is",
														        SPIECE_UNDERLINE + "f",
														        "al",
														        "s",
														        "é",
														        ".",
														    ]					,			)
														__snake_case	:    Any											=     tokenizer.convert_tokens_to_ids(lowerCamelCase       )
														self.assertListEqual(
														    lowerCamelCase					,			[8, 21, 84, 55, 24, 19, 7, 0, 602, 347, 347, 347, 3, 12, 66, 46, 72, 80, 6, 0, 4]					,			)

														__snake_case	:    Optional[Any]											=     tokenizer.convert_ids_to_tokens(lowerCamelCase       )
														self.assertListEqual(
														    lowerCamelCase					,			[
														        SPIECE_UNDERLINE + "I",
														        SPIECE_UNDERLINE + "was",
														        SPIECE_UNDERLINE + "b",
														        "or",
														        "n",
														        SPIECE_UNDERLINE + "in",
														        SPIECE_UNDERLINE + "",
														        "<unk>",
														        "2",
														        "0",
														        "0",
														        "0",
														        ",",
														        SPIECE_UNDERLINE + "and",
														        SPIECE_UNDERLINE + "this",
														        SPIECE_UNDERLINE + "is",
														        SPIECE_UNDERLINE + "f",
														        "al",
														        "s",
														        "<unk>",
														        ".",
														    ]					,			)

							@cached_property
							def 					__snake_case      (							self :						str       )			->					List[Any]:
														return BertGenerationTokenizer.from_pretrained("google/bert_for_seq_generation_L-24_bbc_encoder"       )

							@slow
							def 					__snake_case      (							self :						Tuple       )			->					Union[str, Any]:
														__snake_case	:    Union[str, Any]											=     "Hello World!"
														__snake_case	:    List[str]											=     [18536, 2260, 101]

														self.assertListEqual(lowerCamelCase					,			self.big_tokenizer.encode(lowerCamelCase       )       )

							@slow
							def 					__snake_case      (							self :						str       )			->					Optional[int]:
														__snake_case	:    List[Any]											=     (
														    "This is a very long text with a lot of weird characters, such as: . , ~ ? ( ) \" [ ] ! : - . Also we will"
														    " add words that should not exsist and be tokenized to <unk>, such as saoneuhaoesuth"
														)
														__snake_case	:    Any											=     [
														    871,
														    419,
														    358,
														    946,
														    991,
														    2521,
														    452,
														    358,
														    1357,
														    387,
														    7751,
														    3536,
														    112,
														    985,
														    456,
														    126,
														    865,
														    938,
														    5400,
														    5734,
														    458,
														    1368,
														    467,
														    786,
														    2462,
														    5246,
														    1159,
														    633,
														    865,
														    4519,
														    457,
														    582,
														    852,
														    2557,
														    427,
														    916,
														    508,
														    405,
														    34324,
														    497,
														    391,
														    408,
														    11342,
														    1244,
														    385,
														    100,
														    938,
														    985,
														    456,
														    574,
														    362,
														    12597,
														    3200,
														    3129,
														    1172,
														]

														self.assertListEqual(lowerCamelCase					,			self.big_tokenizer.encode(lowerCamelCase       )       )

							@require_torch
							@slow
							def 					__snake_case      (							self :						Optional[Any]       )			->					str:
														import torch

														from transformers import BertGenerationConfig, BertGenerationEncoder

														# Build sequence
														__snake_case	:    List[Any]											=     list(self.big_tokenizer.get_vocab().keys()       )[:10]
														__snake_case	:    Union[str, Any]											=     " ".join(lowerCamelCase       )
														__snake_case	:    Optional[int]											=     self.big_tokenizer.encode_plus(lowerCamelCase					,			return_tensors="pt"					,			return_token_type_ids=lowerCamelCase       )
														__snake_case	:    Optional[Any]											=     self.big_tokenizer.batch_encode_plus(
														    [sequence + " " + sequence]					,			return_tensors="pt"					,			return_token_type_ids=lowerCamelCase       )

														__snake_case	:    List[Any]											=     BertGenerationConfig()
														__snake_case	:    Dict											=     BertGenerationEncoder(lowerCamelCase       )

														assert model.get_input_embeddings().weight.shape[0] >= self.big_tokenizer.vocab_size

														with torch.no_grad():
																					model(**lowerCamelCase       )
																					model(**lowerCamelCase       )






							@slow
							def 					__snake_case      (							self :						List[Any]       )			->					List[Any]:
														# fmt: off
														__snake_case	:    Optional[Any]											=     {"input_ids": [[39286, 458, 36335, 2001, 456, 13073, 13266, 455, 113, 7746, 1741, 11157, 391, 13073, 13266, 455, 113, 3967, 35412, 113, 4936, 109, 3870, 2377, 113, 30084, 45720, 458, 134, 17496, 112, 503, 11672, 113, 118, 112, 5665, 13347, 38687, 112, 1496, 31389, 112, 3268, 47264, 134, 962, 112, 16377, 8035, 23130, 430, 12169, 15518, 28592, 458, 146, 41697, 109, 391, 12169, 15518, 16689, 458, 146, 41358, 109, 452, 726, 4034, 111, 763, 35412, 5082, 388, 1903, 111, 9051, 391, 2870, 48918, 1900, 1123, 550, 998, 112, 9586, 15985, 455, 391, 410, 22955, 37636, 114], [448, 17496, 419, 3663, 385, 763, 113, 27533, 2870, 3283, 13043, 1639, 24713, 523, 656, 24013, 18550, 2521, 517, 27014, 21244, 420, 1212, 1465, 391, 927, 4833, 388, 578, 11786, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [484, 2169, 7687, 21932, 18146, 726, 363, 17032, 3391, 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], "attention_mask": [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]}  # noqa: E501
														# fmt: on

														self.tokenizer_integration_test_util(
														    expected_encoding=lowerCamelCase					,			model_name="google/bert_for_seq_generation_L-24_bbc_encoder"					,			revision="c817d1fd1be2ffa69431227a1fe320544943d4db"					,			)

