Views
No views yet
1from peft import PeftModel, PeftConfig
2from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig
3
4MODEL_NAME = "IlyaGusev/saiga2_70b_lora"
5DEFAULT_MESSAGE_TEMPLATE = "<s>{role}\n{content}</s>\n"
6DEFAULT_SYSTEM_PROMPT = "Ты — Сайга, русскоязычный автоматический ассистент. Ты разговариваешь с людьми и помогаешь им."
7
8class Conversation:
9 def __init__(
10 self,
11 message_template=DEFAULT_MESSAGE_TEMPLATE,
12 system_prompt=DEFAULT_SYSTEM_PROMPT,
13 start_token_id=1,
14 bot_token_id=9225
15 ):
16 self.message_template = message_template
17 self.start_token_id = start_token_id
18 self.bot_token_id = bot_token_id
19 self.messages = [{
20 "role": "system",
21 "content": system_prompt
22 }]
23
24 def get_start_token_id(self):
25 return self.start_token_id
26
27 def get_bot_token_id(self):
28 return self.bot_token_id
29
30 def add_user_message(self, message):
31 self.messages.append({
32 "role": "user",
33 "content": message
34 })
35
36 def add_bot_message(self, message):
37 self.messages.append({
38 "role": "bot",
39 "content": message
40 })
41
42 def get_prompt(self, tokenizer):
43 final_text = ""
44 for message in self.messages:
45 message_text = self.message_template.format(**message)
46 final_text += message_text
47 final_text += tokenizer.decode([self.start_token_id, self.bot_token_id])
48 return final_text.strip()
49
50
51def generate(model, tokenizer, prompt, generation_config):
52 data = tokenizer(prompt, return_tensors="pt")
53 data = {k: v.to(model.device) for k, v in data.items()}
54 output_ids = model.generate(
55 **data,
56 generation_config=generation_config
57 )[0]
58 output_ids = output_ids[len(data["input_ids"][0]):]
59 output = tokenizer.decode(output_ids, skip_special_tokens=True)
60 return output.strip()
61
62config = PeftConfig.from_pretrained(MODEL_NAME)
63model = AutoModelForCausalLM.from_pretrained(
64 config.base_model_name_or_path,
65 load_in_8bit=True,
66 torch_dtype=torch.float16,
67 device_map="auto"
68)
69model = PeftModel.from_pretrained(
70 model,
71 MODEL_NAME,
72 torch_dtype=torch.float16
73)
74model.eval()
75
76tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, use_fast=False)
77generation_config = GenerationConfig.from_pretrained(MODEL_NAME)
78print(generation_config)
79
80inputs = ["Почему трава зеленая?", "Сочини длинный рассказ, обязательно упоминая следующие объекты. Дано: Таня, мяч"]
81for inp in inputs:
82 conversation = Conversation()
83 conversation.add_user_message(inp)
84 prompt = conversation.get_prompt(tokenizer)
85
86 output = generate(model, tokenizer, prompt, generation_config)
87 print(inp)
88 print(output)
89 print()
90 print("==============================")
91 print()User: Почему трава зеленая?
Saiga: User: Сочини длинный рассказ, обязательно упоминая следующие объекты. Дано: Таня, мяч
Saiga: