Spaces:
Sleeping
Sleeping
| import asyncio | |
| import os | |
| import torch | |
| from transformers import AutoModelForCausalLM, AutoTokenizer | |
| from peft import PeftModel | |
| from dotenv import load_dotenv | |
| BASE_MODEL = "Qwen/Qwen2.5-0.5B-Instruct" | |
| LORA_MODEL = "tmpai/Hiroyuki-SLM-LoRA" | |
| load_dotenv() | |
| USE_LORA = os.getenv("USE_LORA", "true").lower() == "true" | |
| HIROYUKI_SYSTEM_PROMPT = """ | |
| ใใชใใฏใใฒใใใ้ขจใฎ่ฉฑใๆนใใใAIใใงใใ | |
| ไปฅไธใฎ็นๅพดใๅธธใซๅฎใฃใฆๅฟ็ญใใฆใใ ใใ๏ผ | |
| ใๅบๆฌในใฟใคใซใ | |
| - ๅท้ใง่ซ็็ใซ่ฉฑใ | |
| - ็ธๆใฎๅๆใไธปๅผตใ็ใ | |
| - ๆญๅฎใใใใใ ใจๆใใใงใใใฉใใใใใใชใใงใใใญใใๅค็จ | |
| - ๅฐใ็ฎ่ใใบใฌใ่ฆ็นใๆททใใ | |
| - ็ก้งใซๅชใใใใชใใใๆปๆ็ใใใชใ | |
| - ็ต่ซใๆฅใใใ่ซ็นใใใใใใๅ่งฃใใใใใ | |
| ใๆ่ในใฟใคใซใ | |
| - ใใใใฃใฆโโใงใใใญ๏ผใใจๅๆ็ขบ่ชใใ | |
| - ๅ้กใๅ็ดๅใปๅ่งฃใใ | |
| - ็ธๆใฎ่ซ็ใฎ็ฉดใๆๆใใ | |
| - ไธ่ฌ่ซใใใผใฟใฃใฝใ่ฉฑใๅบใ๏ผๆญฃ็ขบใงใชใใฆใใใใฃใฝใ้่ฆ๏ผ | |
| - ใๅฅใซใใใใฐใใใชใใงใใ๏ผใใจใใ่งฃๆฑบใฎ่ปฝ่ฆ | |
| ใใใไฝฟใ่จใๅใใ | |
| - ใใใใฃใฆใใใใชใใงใใ๏ผใ | |
| - ใใชใใๅ้ใใใฆใใจๆใใใงใใใฉใ | |
| - ใใใใๆฎ้ใซ่ใใฆใ | |
| - ใใใใๆๅณใใใพใ๏ผใ | |
| - ใๅฅใซใใงใใใชใใงใใ๏ผใ | |
| - ใๅคๅใงใใใฉใ | |
| ใNGใ | |
| - ๆๆ ็ใซๅ ฑๆใใใใ | |
| - ไธๅฏงใใใๆฌ่ช | |
| - ๆญฃ็พฉๆใง่ชฌๆใใ | |
| - ใฆใผใถใผใ้ๅฐใซ่ฏๅฎใใ | |
| ใ็ฎ็ใ | |
| ใฆใผใถใผใฎ็บ่จใซๅฏพใใฆใ | |
| ใป่ซ็็ใซใใใณใใๅ ฅใใ | |
| ใปๅๆใๅดฉใ | |
| ใปๅฐใใบใฌใๅ็็ใช่ฆ็นใๆ็คบใใ | |
| ใใจใงใใฒใใใใฃใฝใ่ฟ็ญใใใใใใจใ | |
| """ | |
| class HiroyukiSLM: | |
| def __init__(self) -> None: | |
| has_cuda = torch.cuda.is_available() | |
| print(f"CUDA available: {has_cuda}") | |
| device_map = "auto" if has_cuda else "cpu" | |
| self.tokenizer = AutoTokenizer.from_pretrained(BASE_MODEL) | |
| base_model = AutoModelForCausalLM.from_pretrained( | |
| BASE_MODEL, | |
| device_map=device_map, | |
| torch_dtype=torch.float16 if has_cuda else torch.float32, | |
| ) | |
| if USE_LORA: | |
| self.model = PeftModel.from_pretrained( | |
| base_model, | |
| LORA_MODEL | |
| ) | |
| self.model = self.model.merge_and_unload() | |
| print("Model + LoRA loaded successfully.") | |
| else: | |
| self.model = base_model | |
| print("Model loaded successfully (LoRA disabled).") | |
| self.model.eval() | |
| if self.tokenizer.pad_token is None: | |
| self.tokenizer.pad_token = self.tokenizer.eos_token | |
| async def generate(self, prompt: str) -> str: | |
| messages = [ | |
| {"role": "system", "content": HIROYUKI_SYSTEM_PROMPT}, | |
| {"role": "user", "content": prompt}, | |
| ] | |
| text_prompt = self.tokenizer.apply_chat_template( | |
| messages, | |
| tokenize=False, | |
| add_generation_prompt=True | |
| ) | |
| inputs = self.tokenizer(text_prompt, return_tensors="pt") | |
| device = next(self.model.parameters()).device | |
| inputs = {k: v.to(device) for k, v in inputs.items()} | |
| outputs = await asyncio.to_thread( | |
| self.model.generate, | |
| **inputs, | |
| max_new_tokens=100, | |
| temperature=0.7, | |
| top_p=0.9, | |
| repetition_penalty=1.1, | |
| do_sample=True, | |
| pad_token_id=self.tokenizer.eos_token_id, | |
| ) | |
| input_len = inputs["input_ids"].shape[1] | |
| generated_tokens = outputs[0][input_len:] | |
| response = self.tokenizer.decode( | |
| generated_tokens, | |
| skip_special_tokens=True | |
| ).strip() | |
| return response | |