File size: 6,107 Bytes
ff9fe5c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3259356
ff9fe5c
 
 
 
 
 
 
 
 
 
 
 
 
 
1ed96a9
 
ff9fe5c
 
 
 
 
 
 
 
 
 
 
 
3259356
8dcb42d
242bf17
 
ff9fe5c
 
 
 
8dcb42d
ff9fe5c
 
 
 
 
 
 
 
 
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
import gradio as gr
import spaces
from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer, AutoModelForSeq2SeqLM
import os
import torch
from threading import Thread
from transformers.utils import logging
from typing import List
from sentence_splitter import split_text_into_sentences 


logging.set_verbosity_error()
logger = logging.get_logger("transformers")

model_name="olemeyer/simplex-7B-de-v0.1"


tokenizer = AutoTokenizer.from_pretrained(model_name,token=os.environ["HF_TOKEN"])
model = AutoModelForCausalLM.from_pretrained(model_name,token=os.environ["HF_TOKEN"],torch_dtype=torch.float16,device_map={"":"cuda"})


model=torch.compile(model,mode="reduce-overhead")

template = """
<|language_level|> {STYLE}
<|previous_text|> {PREVIOUS_TEXT}
<|previous_translated|> {PREVIOUS_TRANSLATED}
<|sentence|> {SENTENCE}
<|translated|>
"""

end_tokens=[
    tokenizer.eos_token_id,
    tokenizer.encode("<|end_translated|>")[-1]
]


def build_template(
        language_level: str,
        previous_text: str=None,
        previous_translated: str=None,
        sentence: str=None,
):
    assert language_level in ["einfache_sprache","leichte_sprache"], "language_level must be einfache_sprache or leichte_sprache"
    assert sentence is not None, "sentence and translated must be provided"

    return template.format(
        STYLE=language_level,
        PREVIOUS_TEXT=previous_text if previous_text is not None else "",
        PREVIOUS_TRANSLATED=previous_translated if previous_translated is not None else "",
        SENTENCE=sentence
    ).strip()

model.eval()

def gen_sentence(style,sentence,last_sentences=[],last_translations=[],temperature=1.0,top_k=50,top_p=0.5):

    #use up to last three sentences
    prev_text=" ".join(last_sentences[-5:]) if len(last_sentences)>0 else None
    prev_translated=" ".join(last_translations[-5:]) if len(last_translations)>0 else None

    prompt = build_template(language_level=style,previous_text=prev_text,previous_translated=prev_translated,sentence=sentence)

    inputs=tokenizer(prompt,return_tensors="pt").to("cuda")

    streamer=TextIteratorStreamer(
        tokenizer=tokenizer,
        skip_prompt=True,

    )

    def gen_fn():
        with torch.no_grad():
            out= model.generate(**inputs,streamer=streamer,do_sample=True,max_new_tokens=256,eos_token_id=end_tokens,temperature=temperature,top_k=top_k,top_p=top_p, penalty_alpha=.6)

    Thread(target=gen_fn).start()

    gen_texts=[]
    for text in streamer:
        gen_texts.append(text)

        output = "".join(gen_texts)

        yield output.replace("<|end_translated|>","").strip()


@spaces.GPU
def generate_text(complex_text:str,style:str,temperature,top_k,top_p):

    complex_text=complex_text[:1000]
    
    style="einfache_sprache" if style=="einfache Sprache" else "leichte_sprache"

    sentences=split_text_into_sentences(complex_text,language="de")

    last_sentences=[]
    last_translations=[]


    for sentence in sentences:
        translation=""
        for translation in gen_sentence(style,sentence,last_sentences=last_sentences,last_translations=last_translations,temperature=temperature,top_k=top_k,top_p=top_p):
            translation=translation.strip()

            text="\n".join(last_translations) + "\n" + translation
            yield text.strip()

        last_sentences.append(sentence)
        last_translations.append(translation)



  

    


iface = gr.Interface(fn=generate_text, inputs=[
    gr.TextArea(label="Text", placeholder="Komplizierter Text...", info="Maximal 1000 Zeichen werden in dieser Demo verarbeitet."),
    gr.Dropdown(["einfache Sprache","leichte Sprache"],label="Sprachniveau",value="einfache Sprache"),
],
additional_inputs=[
    gr.Slider(0.0, 1.0, 0.3, label="Temperatur"),
    gr.Slider(0, 100, 15, label="Top-k"),
    gr.Slider(0.0, 1.0, 0.8, label="Top-p")
], outputs=[
    gr.TextArea(label="Übersetzung",show_copy_button=True)
], title="Simplex 7B 💬", examples=[
    ["Aufgrund der aktuellen Wetterlage mit starkem Schneefall und Glatteis kommt es im gesamten Stadtgebiet zu erheblichen Verkehrsbehinderungen. Wir bitten die Bevölkerung, möglichst auf Fahrten mit dem eigenen PKW zu verzichten und stattdessen öffentliche Verkehrsmittel zu nutzen.","leichte Sprache", .3, 15, .8],
    ["Patienten mit chronischer Nierenerkrankung im Stadium 5 (CKD-5) weisen eine glomeruläre Filtrationsrate (GFR) von weniger als 15 ml/min/1,73 m² auf und benötigen eine Nierenersatztherapie (RRT) in Form von Dialyse oder Nierentransplantation. Die Prävalenz von CKD-5 nimmt weltweit zu, hauptsächlich aufgrund der steigenden Inzidenz von Diabetes mellitus und Bluthochdruck.", "leichte Sprache", .3, 15, .8],
    ["Das Bundesverfassungsgericht hat das Klimaschutzgesetz der Bundesregierung teilweise für verfassungswidrig erklärt. Die Richter kritisierten, dass das Gesetz die Freiheitsrechte der jüngeren Generationen unzureichend schützt. Die Bundesregierung muss nun nachbessern und die Reduktionsziele für Treibhausgasemissionen für die Zeit nach 2030 konkretisieren.", "einfache Sprache", .3, 15, .8],
    ["Die Europäische Kommission hat heute eine neue Strategie für die Finanzierung des Übergangs zu einer nachhaltigen Wirtschaft vorgestellt. Die Strategie zielt darauf ab, mehr private Investitionen für nachhaltige Projekte zu mobilisieren. Ein zentrales Element der Strategie ist ein Klassifizierungssystem für nachhaltige Wirtschaftstätigkeiten, die sogenannte Taxonomie. Die Taxonomie soll Anlegern helfen, nachhaltige Investitionen zu identifizieren und Greenwashing zu vermeiden.","einfache Sprache", .3, 15, .8],
    ["Die fotosynthetische Aktivität der Pflanze wird durch verschiedene Umweltfaktoren beeinflusst, darunter Lichtintensität, CO2-Konzentration, Temperatur und Wasserverfügbarkeit. Eine Erhöhung der Lichtintensität kann bis zu einem gewissen Grad zu einer Steigerung der fotosynthetischen Rate führen, da mehr Energie für die Lichtreaktionen der Fotosynthese zur Verfügung steht.", "leichte Sprache", .3, 15, .8]
])

iface.launch()