| import base64 |
| import time |
| from typing import Any, Callable, Optional |
| import os |
|
|
| from ..types import MessageList, SamplerBase |
|
|
| import torch |
| import gc |
| from transformers import AutoModel, AutoTokenizer, AutoModelForCausalLM |
|
|
| class LLaMASampler(SamplerBase): |
| """ |
| Sample from LLaDA |
| """ |
| def __init__( |
| self, |
| model_name: str = "meta-llama/Llama-3.1-8B-Instruct", |
| generate_fn: Optional[Callable] = None, |
| generation_kwargs: Optional[dict] = None, |
| kv_cache_masked: Optional[bool] = False, |
| kv_cache_decoded: Optional[bool] = False, |
| ): |
| self.model = AutoModelForCausalLM.from_pretrained( |
| model_name, |
| trust_remote_code=True, |
| torch_dtype=torch.bfloat16, |
| ).eval().requires_grad_(False) |
| self.tokenizer = AutoTokenizer.from_pretrained( |
| model_name, trust_remote_code=True |
| ) |
| self.generation_kwargs = generation_kwargs |
| |
| def init_model(self): |
| self.model = self.model.cuda() |
|
|
| def _handle_text(self, text: str) -> dict[str, Any]: |
| return {"type": "input_text", "text": text} |
|
|
| def _pack_message(self, role: str, content: Any) -> dict[str, Any]: |
| return {"role": role, "content": content} |
|
|
| def _free_memory(self): |
| del self.model |
|
|
| gc.collect() |
| torch.cuda.empty_cache() |
| torch.cuda.ipc_collect() |
|
|
| import time |
| time.sleep(10) |
|
|
| def __call__(self, seq_idx: int, message_list: MessageList) -> str: |
|
|
| with torch.inference_mode(): |
| full_message = [ |
| {'role': 'system', 'content': 'You are a helpful AI assistant.'} |
| ] + message_list |
| prompt = self.tokenizer.apply_chat_template(full_message, add_generation_prompt=True, tokenize=False) |
| |
|
|
| model_inputs = self.tokenizer([prompt], return_tensors="pt").to(self.model.device) |
| generated_ids = self.model.generate( |
| **model_inputs, |
| **self.generation_kwargs |
| ) |
| generated_ids = [ |
| output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids) |
| ] |
| length = len(generated_ids[0]) |
| res = self.tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0] |
| |
| |
| return seq_idx, res |
|
|