diff --git a/openicl/icl_dataset_reader.py b/openicl/icl_dataset_reader.py index cef1b92..3452c67 100644 --- a/openicl/icl_dataset_reader.py +++ b/openicl/icl_dataset_reader.py @@ -225,8 +225,10 @@ def __init__(self, datalist: List, model_name=None, tokenizer=None) -> None: self.tokenizer = tokenizer else: self.tokenizer = AutoTokenizer.from_pretrained(model_name) - self.tokenizer.pad_token = self.tokenizer.eos_token - self.tokenizer.pad_token_id = self.tokenizer.eos_token_id + if self.tokenizer.eos_token is not None: + self.tokenizer.pad_token = self.tokenizer.eos_token + if self.tokenizer.eos_token_id is not None: + self.tokenizer.pad_token_id = self.tokenizer.eos_token_id self.tokenizer.padding_side = "left" self.encode_dataset = [] self.init_dataset() @@ -234,7 +236,10 @@ def __init__(self, datalist: List, model_name=None, tokenizer=None) -> None: def init_dataset(self): for idx, data in enumerate(self.datalist): - tokenized_data = self.tokenizer.encode_plus(data, truncation=True, return_tensors='pt', verbose=False) + try: + tokenized_data = self.tokenizer(data, truncation=True, return_tensors='pt', verbose=False) + except (TypeError, AttributeError): + tokenized_data = self.tokenizer.encode_plus(data, truncation=True, return_tensors='pt', verbose=False) self.encode_dataset.append({ 'input_ids': tokenized_data.input_ids[0], 'attention_mask': tokenized_data.attention_mask[0], diff --git a/openicl/icl_inferencer/icl_base_inferencer.py b/openicl/icl_inferencer/icl_base_inferencer.py index 2b9d33e..ad01b14 100644 --- a/openicl/icl_inferencer/icl_base_inferencer.py +++ b/openicl/icl_inferencer/icl_base_inferencer.py @@ -141,8 +141,11 @@ def __init_tokenizer(self, tokenizer_name): self.tokenizer = tokenizer_name else: self.tokenizer = AutoTokenizer.from_pretrained(tokenizer_name) - self.tokenizer.pad_token = self.tokenizer.eos_token - self.tokenizer.pad_token_id = self.tokenizer.eos_token_id + + if self.tokenizer.eos_token is not None: + self.tokenizer.pad_token = self.tokenizer.eos_token + if self.tokenizer.eos_token_id is not None: + self.tokenizer.pad_token_id = self.tokenizer.eos_token_id self.tokenizer.padding_side = "left" def __init_api(self, **kwargs): diff --git a/openicl/icl_inferencer/icl_ppl_inferencer.py b/openicl/icl_inferencer/icl_ppl_inferencer.py index 9a7e9ec..bf88cd9 100644 --- a/openicl/icl_inferencer/icl_ppl_inferencer.py +++ b/openicl/icl_inferencer/icl_ppl_inferencer.py @@ -183,8 +183,9 @@ def __get_ppl(self, input_texts: List[str], mask_length=None): mask[i][j] = 1 loss = loss * mask - lens = (inputs["input_ids"] != self.tokenizer.pad_token_id).sum(-1).cpu().numpy() + lens = (inputs["input_ids"] != self.tokenizer.pad_token_id).sum(-1) if mask_length is not None: - lens -= np.array(mask_length) - ce_loss = loss.sum(-1).cpu().detach().numpy() / lens + lens -= torch.tensor(mask_length, device=lens.device, dtype=lens.dtype) + # Some new hf models are bfloat16 + ce_loss = (loss.sum(-1) / lens.to(loss.dtype)).detach().to(torch.float32).cpu().numpy() return ce_loss diff --git a/openicl/icl_retriever/icl_topk_retriever.py b/openicl/icl_retriever/icl_topk_retriever.py index 18b412f..203c230 100644 --- a/openicl/icl_retriever/icl_topk_retriever.py +++ b/openicl/icl_retriever/icl_topk_retriever.py @@ -62,8 +62,10 @@ def __init__(self, gen_datalist = self.dataset_reader.generate_input_field_corpus(self.test_ds) self.tokenizer = AutoTokenizer.from_pretrained(tokenizer_name) - self.tokenizer.pad_token = self.tokenizer.eos_token - self.tokenizer.pad_token_id = self.tokenizer.eos_token_id + if self.tokenizer.eos_token is not None: + self.tokenizer.pad_token = self.tokenizer.eos_token + if self.tokenizer.eos_token_id is not None: + self.tokenizer.pad_token_id = self.tokenizer.eos_token_id self.tokenizer.padding_side = "right" self.encode_dataset = DatasetEncoder(gen_datalist, tokenizer=self.tokenizer) diff --git a/openicl/utils/collators.py b/openicl/utils/collators.py index 0e6c9f6..3ed8303 100644 --- a/openicl/utils/collators.py +++ b/openicl/utils/collators.py @@ -62,6 +62,8 @@ def __call__(self, features: List[Dict[str, Union[List[int], torch.Tensor]]]) -> batch.update(res_dict) if self.device: - batch = batch.to(self.device) + for k, v in list(batch.items()): + if hasattr(v, "to"): + batch[k] = v.to(self.device) return batch