File size: 3,390 Bytes
285bf0b
 
 
 
b0b43c1
285bf0b
be676b9
285bf0b
 
 
 
 
69306c5
b0b43c1
57f92c6
 
 
 
69306c5
285bf0b
38f0467
285bf0b
a260b60
285bf0b
 
57f92c6
285bf0b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
from peft import PeftModel
from transformers import LlamaTokenizer, LlamaForCausalLM, GenerationConfig
import gradio as gr
from torch.cuda import is_available
from torch import bfloat16

if is_available():
    options = dict(
        load_in_8bit=True,
        device_map="auto",
    )
else:
    options = {
        "torch_dtype": bfloat16
        #"low_cpu_mem_usage": True,
        #"offload_state_dict": True,
        #"offload_folder": "offload",
        #"device_map": "auto",
    }

tokenizer = LlamaTokenizer.from_pretrained("openlm-research/open_llama_3b_v2")
model = LlamaForCausalLM.from_pretrained(
    "openlm-research/open_llama_3b_v2",
    **options
)
model = PeftModel.from_pretrained(model, "robinhad/open_llama_3b_uk", )#offload_state_dict=True, offload_folder=".")


def generate_prompt(instruction, input=None, output=""):
    if input:
        return f"""Унизу надається інструкція, яка описує завдання разом із вхідними даними, які надають додатковий контекст. Напиши відповідь, яка правильно доповнює запит.
### Інструкція:
{instruction}
### Вхідні дані:
{input}
### Відповідь:
{output}"""
    else:
        return f"""Унизу надається інструкція, яка описує завдання. Напиши відповідь, яка правильно доповнює запит.
### Інструкція:
{instruction}
### Відповідь:
{output}"""


generation_config = GenerationConfig(
    temperature=0.2,
    top_p=0.75,
    num_beams=4,
)

def evaluate(instruction, input=None):
    if input.strip() == "":
        input = None
    prompt = generate_prompt(instruction, input)
    inputs = tokenizer(prompt, return_tensors="pt")
    input_ids = inputs["input_ids"]
    if is_available():
        input_ids = input_ids.cuda()
    generation_output = model.generate(
        input_ids=input_ids,
        generation_config=generation_config,
        return_dict_in_generate=True,
        output_scores=True,
        max_new_tokens=64
    )
    for s in generation_output.sequences:
        output = tokenizer.decode(s, skip_special_tokens=True)
        print("============")
        print(output)
        return output.split("### Відповідь:")[1].strip()


gr.Interface(
    evaluate,
    [
        gr.inputs.Textbox(lines=5, label="Інструкція"),
        gr.inputs.Textbox(lines=5, label="Вхідні дані (необов'язково)"),
    ],
    gr.outputs.Textbox(label="Відповідь"),
    title="Kruk",
    description="Open Llama is a Ukrainian language model trained on the machine-translated Dolly dataset.",
    examples=[
        [
            "Яка найвища гора в Україні?",
            "",
        ],
        [
            "Розкажи історію про Івасика-Телесика.",
            "",
        ],
        [
            "Яка з цих гір не знаходиться у Європі?",
            "Говерла, Монблан, Гран-Парадізо, Еверест"
        ],
        [
            "Чому качки жовтоногі?",
            "",
        ],
        [
            "Чому у качки жовті ноги?",
            "",
        ],
    ]
).launch()