| import transformers |
| import torch |
| from .models_utils import BaseLM |
| from transformers import AutoTokenizer, AutoConfig, AutoModelForCausalLM |
| import torch.nn.functional as F |
| import torch |
| from tqdm import tqdm |
| import pdb |
|
|
|
|
| class LMClass(BaseLM): |
| def __init__(self, args,model_name=None): |
|
|
| super().__init__() |
|
|
| self.args = args |
| self._device = torch.device("cuda" if torch.cuda.is_available() else "cpu") |
| if model_name is not None: |
| self.model_name = model_name |
| else: |
| self.model_name = args.model |
| self.batch_size_per_gpu = args.batch_size |
|
|
| self.model_config = self.model_name |
| config = AutoConfig.from_pretrained( |
| self.model_name, attn_implementation=args.attn_implementation,trust_remote_code=True |
| ) |
|
|
| self.tokenizer = AutoTokenizer.from_pretrained(self.model_name, use_fast=False,legacy=False) |
| torch_dtype = torch.bfloat16 if args.use_bfloat16 is True else torch.float16 |
|
|
| self.model = AutoModelForCausalLM.from_pretrained(self.model_name, config=config, device_map='cpu',torch_dtype=torch_dtype, trust_remote_code=True) |
| |
| self.seqlen = self.model.config.max_position_embeddings |
| self.model.eval() |
| self.vocab_size = self.tokenizer.vocab_size |
| print("vocab size: ", self.vocab_size) |
|
|
| @property |
| def eot_token(self) -> str: |
| return self.tokenizer.eos_token |
|
|
| @property |
| def eot_token_id(self): |
| |
| return self.tokenizer.eos_token_id |
|
|
| @property |
| def max_length(self): |
| try: |
| return self.gpt2.config.n_ctx |
| except AttributeError: |
| |
| return self.model.config.max_position_embeddings |
|
|
| @property |
| def max_gen_toks(self): |
| print("max_gen_toks fn") |
| return 256 |
|
|
| @property |
| def batch_size(self): |
| |
| return self.batch_size_per_gpu |
|
|
| @property |
| def device(self): |
| |
| return self._device |
|
|
| def tok_encode(self, string: str): |
| return self.tokenizer.encode(string, add_special_tokens=False) |
|
|
| def tok_encode_batch(self, strings): |
| return self.tokenizer( |
| strings, |
| padding=True, |
| add_special_tokens=False, |
| return_tensors="pt", |
| ) |
|
|
| def tok_decode(self, tokens): |
| return self.tokenizer.batch_decode(tokens, skip_special_tokens=True) |
|
|
| def _model_call(self, inps): |
| """ |
| inps: a torch tensor of shape [batch, sequence] |
| the size of sequence may vary from call to call |
| returns: a torch tensor of shape [batch, sequence, vocab] with the |
| logits returned from the model |
| """ |
| with torch.no_grad(): |
|
|
| return self.model(inps)["logits"] |
|
|
| def model_batched_set(self, inps): |
| dataset_logits = [] |
| for batch in inps: |
| multi_logits = F.log_softmax( |
| self._model_call(batch), dim=-1 |
| ).cpu() |
| dataset_logits.append(multi_logits) |
| return dataset_logits |
|
|
| def _model_generate(self, context, max_length, eos_token_id): |
| return self.model.generate( |
| context, max_length=max_length, eos_token_id=eos_token_id, do_sample=False |
| ) |
|
|