|
import os |
|
from threading import Thread |
|
from typing import Iterator |
|
|
|
import gradio as gr |
|
import spaces |
|
import torch |
|
from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer |
|
|
|
DESCRIPTION = """\ |
|
# GRAG-PHI-3.5-MINI-4B-MERGED-HESSIAN-AI |
|
|
|
👉 Quick test for multiple references. |
|
""" |
|
|
|
MAX_MAX_NEW_TOKENS = 4096 |
|
DEFAULT_MAX_NEW_TOKENS = 2048 |
|
MAX_INPUT_TOKEN_LENGTH = int(os.getenv("MAX_INPUT_TOKEN_LENGTH", "4096")) |
|
|
|
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu") |
|
|
|
model_id = "avemio/GRAG-PHI-3.5-MINI-4B-MERGED-HESSIAN-AI" |
|
tokenizer = AutoTokenizer.from_pretrained(model_id) |
|
model = AutoModelForCausalLM.from_pretrained( |
|
model_id, |
|
device_map="auto", |
|
torch_dtype=torch.bfloat16, |
|
) |
|
model.config.sliding_window = 4096 |
|
model.eval() |
|
|
|
system_message = """Du bist ein KI-Assistent, der dem Nutzer mit maximaler Genauigkeit antwortet. Um dies zu tun, wirst du zuerst darüber nachdenken, was der Nutzer fragt, und Schritt für Schritt überlegen. Um das Problem zu lösen, sollten Überlegungen und Reflektionen genutzt werden. Die folgenden Schritte sollten dabei beachtet werden: - Erfassen, was der Nutzer fragt und die in der Anfrage erwähnten Einschränkungen verstehen. - Auflisten der vom Nutzer genannten Einschränkungen. - Vorschlagen einer Lösung für die Frage des Nutzers unter Berücksichtigung aller Einschränkungen. - Überprüfen, ob die Lösung mit den Einschränkungen übereinstimmt. - Ausgeben der abschließenden Lösung. Am Ende deiner Überlegungen musst du zu einem Schluss kommen und die Lösung präsentieren.""" |
|
|
|
@spaces.GPU(duration=90) |
|
def generate( |
|
message: str, |
|
chat_history: list[dict], |
|
max_new_tokens: int = 2048, |
|
temperature: float = 0.6, |
|
top_p: float = 0.9, |
|
top_k: int = 50, |
|
repetition_penalty: float = 1.2, |
|
) -> Iterator[str]: |
|
conversation = chat_history.copy() |
|
conversation.append({"role": "system", "content": system_message}) |
|
conversation.append({"role": "user", "content": message}) |
|
|
|
|
|
input_ids = tokenizer.apply_chat_template(conversation, add_generation_prompt=False, return_tensors="pt") |
|
if input_ids.shape[1] > MAX_INPUT_TOKEN_LENGTH: |
|
input_ids = input_ids[:, -MAX_INPUT_TOKEN_LENGTH:] |
|
gr.Warning(f"Trimmed input from conversation as it was longer than {MAX_INPUT_TOKEN_LENGTH} tokens.") |
|
input_ids = input_ids.to(device) |
|
|
|
im_end_token_id = tokenizer.convert_tokens_to_ids('<|end|>') |
|
|
|
|
|
streamer = TextIteratorStreamer(tokenizer, timeout=60.0, skip_prompt=True, skip_special_tokens=True) |
|
generate_kwargs = { |
|
"input_ids": input_ids, |
|
"streamer": streamer, |
|
"max_new_tokens": max_new_tokens, |
|
"do_sample": True, |
|
"top_p": top_p, |
|
"top_k": top_k, |
|
"temperature": temperature, |
|
"num_beams": 1, |
|
"repetition_penalty": repetition_penalty, |
|
"eos_token_id": im_end_token_id, |
|
"pad_token_id": tokenizer.eos_token_id, |
|
} |
|
|
|
|
|
t = Thread(target=model.generate, kwargs=generate_kwargs) |
|
t.start() |
|
t.join() |
|
|
|
outputs = [] |
|
for text in streamer: |
|
outputs.append(text) |
|
yield "".join(outputs) |
|
|
|
chat_interface = gr.ChatInterface( |
|
fn=generate, |
|
additional_inputs=[ |
|
gr.Slider( |
|
label="Max new tokens", |
|
minimum=1, |
|
maximum=MAX_MAX_NEW_TOKENS, |
|
step=1, |
|
value=DEFAULT_MAX_NEW_TOKENS, |
|
), |
|
gr.Slider( |
|
label="Temperature", |
|
minimum=0.1, |
|
maximum=4.0, |
|
step=0.1, |
|
value=0.1, |
|
), |
|
gr.Slider( |
|
label="Top-p (nucleus sampling)", |
|
minimum=0.05, |
|
maximum=1.0, |
|
step=0.05, |
|
value=0.9, |
|
), |
|
gr.Slider( |
|
label="Top-k", |
|
minimum=1, |
|
maximum=1000, |
|
step=1, |
|
value=50, |
|
), |
|
gr.Slider( |
|
label="Repetition penalty", |
|
minimum=1.0, |
|
maximum=2.0, |
|
step=0.05, |
|
value=0.5, |
|
), |
|
], |
|
stop_btn=None, |
|
examples=[ |
|
["Liora, eine Partnerin in einer Anwaltskanzlei, berät eine öffentliche Gesundheitseinrichtung, die mit dem Problem konfrontiert ist, dass drei verschiedene Anbieter von Telemedizin-Diensten in die engere Auswahl gezogen wurden. Jeder Anbieter hat unterschiedliche rechtliche Anforderungen und potenzielle Risiken. Anbieter A hat eine umfassende Erfahrung im Umgang mit Datenschutzgesetzen, Anbieter B ist bekannt für innovative Lösungen, die jedoch noch nicht umfassend rechtlich geprüft wurden, und Anbieter C bietet die kostengünstigste Option, hat jedoch in der Vergangenheit gegen Gesundheitsgesetze verstoßen. Liora muss eine Empfehlung abgeben, welchen Anbieter die Einrichtung wählen sollte, um sicherzustellen, dass sie sowohl rechtlich abgesichert ist als auch den besten Service für die Patienten bietet."], |
|
["Lysander steht vor der Herausforderung, die perfekte Synchronstimme für eine internationale TV-Serie auszuwählen. Die Serie spielt in verschiedenen Ländern und beinhaltet Charaktere aus fünf verschiedenen Kulturen. Er hat fünf Synchronsprecher zur Auswahl, jeder mit einzigartigen Fähigkeiten und kulturellem Hintergrund. Die Sprecher sind: Sprecher A (Spricht Englisch und Spanisch), Sprecher B (Spricht Deutsch und Italienisch), Sprecher C (Spricht Französisch und Arabisch), Sprecher D (Spricht Japanisch und Englisch) und Sprecher E (Spricht Spanisch und Französisch). Die erste Episode erfordert einen Charakter, der in einer spanischen Umgebung agiert, während die zweite Episode einen deutschen Charakter in einem italienischen Setting verlangt. Der Synchronsprecher muss in der Lage sein, die kulturellen Nuancen beider Sprachen zu vermitteln. Welche Synchronsprecher sollten für die ersten beiden Episoden gewählt werden?"], |
|
["Seraphin, ein Sanitäter, plant seinen nächsten Einsatz und muss die Wetterbedingungen für die kommenden Tage berücksichtigen. Er hat Informationen über die Wettervorhersagen für die nächsten fünf Tage erhalten: An Tag 1 wird es sonnig sein, an Tag 2 wird Regen vorhergesagt, an Tag 3 wird starker Wind erwartet, an Tag 4 wird es bewölkt mit gelegentlichen Regenschauern sein, und an Tag 5 wird es wieder sonnig. Seraphin hat einen wichtigen Einsatz, der auf Tag 3 fällt, und er weiß, dass sein Team bei starkem Wind nicht optimal arbeiten kann. Er muss entscheiden, ob er den Einsatz verschieben oder versuchen sollte, ihn an einem anderen Tag durchzuführen. Wenn er den Einsatz auf Tag 1 oder Tag 5 verschiebt, kann er viel besser arbeiten. An Tag 2 ist Regen vorhergesagt, was auch schwierig sein könnte. Seraphin muss die beste Option finden, um die Effizienz seines Teams zu maximieren und die Sicherheit der Patienten zu gewährleisten."] |
|
], |
|
cache_examples=False, |
|
type="messages", |
|
) |
|
|
|
with gr.Blocks(css_paths="style.css", fill_height=True) as demo: |
|
gr.Markdown(DESCRIPTION) |
|
chat_interface.render() |
|
|
|
if __name__ == "__main__": |
|
demo.queue(max_size=20).launch() |