Download reference/code/T3D/train/prompting_utils.py from Ouzhang/hku_diffusion_dllm: direct link, hf CLI and curl.
- Browser
- Download file 3.37 kB
-
https://huggingface.co/Ouzhang/hku_diffusion_dllm/resolve/main/reference/code/T3D/train/prompting_utils.py
- Command line
-
hf download hf://Ouzhang/hku_diffusion_dllm/reference/code/T3D/train/prompting_utils.py
-
curl -L -o prompting_utils.py https://huggingface.co/Ouzhang/hku_diffusion_dllm/resolve/main/reference/code/T3D/train/prompting_utils.py
3.37 kB
| from accelerate.logging import get_logger | |
| logger = get_logger(__name__, log_level="INFO") | |
| import torch | |
| class UniversalPrompting(): | |
| def __init__(self, text_tokenizer, | |
| max_prompt_len=8000, max_gen_length=377, ignore_id=-100, system_prompt=None): | |
| """ | |
| :param text_tokenizer: original text tokenizer | |
| """ | |
| self.text_tokenizer = text_tokenizer | |
| self.max_gen_length = max_gen_length | |
| self.max_prompt_len = max_prompt_len | |
| def lm_prompt(self, text_ids_pairs): | |
| prompts_list, responses_list = text_ids_pairs | |
| pad_id = self.text_tokenizer.pad_token_id | |
| if responses_list.shape[1] < self.max_gen_length: | |
| max_seq_len = prompts_list.shape[1] + responses_list.shape[1] | |
| else: | |
| max_seq_len = prompts_list.shape[1] + self.max_gen_length | |
| sequence_ids = [] | |
| attention_masks = [] | |
| label_ids = [] | |
| for prompt_ids, resp_ids in zip(prompts_list, responses_list): | |
| prompt_ids = prompt_ids.tolist() | |
| resp_ids = resp_ids.tolist() | |
| temp_ids = prompt_ids + resp_ids | |
| temp_masks = [1] * len(temp_ids) | |
| temp_labels = temp_ids.copy() | |
| if len(temp_ids) < max_seq_len: | |
| pad_len = max_seq_len - len(temp_ids) | |
| temp_ids.extend([pad_id] * pad_len) | |
| temp_labels.extend([pad_id] * pad_len) | |
| temp_masks.extend([0] * pad_len) | |
| else: | |
| temp_ids = temp_ids[:max_seq_len] | |
| temp_labels = temp_labels[:max_seq_len] | |
| temp_masks = temp_masks[:max_seq_len] | |
| sequence_ids.append(torch.tensor(temp_ids).unsqueeze(0)) | |
| attention_masks.append(torch.tensor(temp_masks).unsqueeze(0)) | |
| label_ids.append(torch.tensor(temp_labels).unsqueeze(0)) | |
| input_ids = torch.cat(sequence_ids, dim=0) | |
| attention_masks = torch.cat(attention_masks, dim=0) | |
| label_ids = torch.cat(label_ids, dim=0) | |
| return input_ids, label_ids, prompts_list.shape[1] | |
| def mask_prompt(self): | |
| pass | |
| def __call__(self, input): | |
| prompts, responses = input | |
| enc = self.text_tokenizer( | |
| prompts, | |
| padding=False, | |
| truncation=False, | |
| return_length=True | |
| ) | |
| lengths = enc["length"] | |
| keep_indices = [i for i, L in enumerate(lengths) if L <= self.max_prompt_len] | |
| drop_num = len(prompts) - len(keep_indices) | |
| prompts = [self.text_tokenizer.apply_chat_template( | |
| [{"role": "user", "content": prompts[i]}], | |
| tokenize=False, | |
| add_generation_prompt=True | |
| ) for i in keep_indices] | |
| responses = [responses[i] for i in keep_indices] | |
| prompt_ids = self.text_tokenizer( | |
| prompts, | |
| padding=True, | |
| return_tensors="pt", | |
| padding_side = "left" | |
| )['input_ids'] | |
| response_ids = self.text_tokenizer( | |
| responses, | |
| padding=True, | |
| return_tensors="pt", | |
| padding_side = "right" | |
| )['input_ids'] | |
| input_ids_lm, labels_lm, start_pos = self.lm_prompt((prompt_ids, response_ids)) | |
| return input_ids_lm, labels_lm, start_pos, drop_num | |
| if __name__ == '__main__': | |
| pass |