Spaces:
Runtime error
Runtime error
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
import gradio as gr | |
#from transformers import pipeline | |
import torch | |
from utils import * | |
from presets import * | |
import time | |
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline | |
###################################################################### | |
#Modelle und Tokenizer | |
#Alternativ mit beliebigen Modellen: | |
#base_model = "project-baize/baize-v2-7b" | |
base_model = "bigcode/starcoder" | |
tokenizer,model,device = load_tokenizer_and_model(base_model) | |
#pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, device=0) | |
#print( pipe("def hello():") ) | |
######################################################################## | |
#Chat KI nutzen, um Text zu generieren... | |
def predict(text, | |
chatbotGr, | |
history, | |
top_p, | |
temperature, | |
max_length_tokens, | |
max_context_length_tokens,): | |
global model, tokenizer, device | |
#wenn eingabe leer - nix tun | |
if text=="": | |
yield history,"Empty context." | |
return | |
#wenn Model nicht gefunden -> Fehler | |
try: | |
model | |
except: | |
yield [],"No Model Found" | |
return | |
#Prompt generieren -> mit Kontext bezogen auch auf vorhergehende Eingaben in dem chat | |
inputs = generate_prompt_with_history(text,history,tokenizer,max_length=max_context_length_tokens) | |
if inputs is None: | |
yield history,"Input too long." | |
return | |
else: | |
prompt,inputs=inputs | |
begin_length = len(prompt) | |
##################################################################################################### | |
#ist glaube ich unnötig, da ich mit Pipeline arbeiten -> mal schauen, ich behalte es noch... | |
""" | |
input_ids = inputs["input_ids"][:,-max_context_length_tokens:].to(device) | |
torch.cuda.empty_cache() | |
#torch.no_grad() bedeutet, dass für die betreffenden tensoren keine Ableitungen berechnet werden bei der backpropagation | |
#hier soll das NN ja auch nicht geändert werden 8backprop ist nicht nötig), da es um interference-prompts geht! | |
with torch.no_grad(): | |
#die vergangenen prompts werden alle als Tupel in history abgelegt sortiert nach 'Human' und 'AI'- dass sind daher auch die stop-words, die den jeweils nächsten Eintrag kennzeichnen | |
for x in greedy_search(input_ids,model,tokenizer,stop_words=["[|Human|]", "[|AI|]"],max_length=max_length_tokens,temperature=temperature,top_p=top_p): | |
if is_stop_word_or_prefix(x,["[|Human|]", "[|AI|]"]) is False: | |
if "[|Human|]" in x: | |
x = x[:x.index("[|Human|]")].strip() | |
if "[|AI|]" in x: | |
x = x[:x.index("[|AI|]")].strip() | |
x = x.strip() | |
a, b= [[y[0],convert_to_markdown(y[1])] for y in history]+[[text, convert_to_markdown(x)]],history + [[text,x]] | |
yield a, b, "Generating..." | |
if shared_state.interrupted: | |
shared_state.recover() | |
try: | |
yield a, b, "Stop: Success" | |
return | |
except: | |
pass | |
del input_ids | |
gc.collect() | |
torch.cuda.empty_cache() | |
try: | |
yield a,b,"Generate: Success" | |
except: | |
pass | |
""" | |
########################################################################## | |
#Prompt ist erzeugt, nun mit pipeline eine Antwort von der KI bekommen! | |
pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, device=0, do_sample=True, top_p=0.95) | |
bot_message = pipe(prompt) | |
#chatbot - history erweitern und an chatbotGr zurückschicken | |
history = history.append((text, bot_message)) | |
return history, "Erfolg!" | |
#neuen Chat beginnen | |
def reset_chat(): | |
#id_new = chatbot.new_conversation() | |
#chatbot.change_conversation(id_new) | |
reset_textbox() | |
####################################################################### | |
#Darstellung mit Gradio | |
with open("custom.css", "r", encoding="utf-8") as f: | |
customCSS = f.read() | |
with gr.Blocks(theme=small_and_beautiful_theme) as demo: | |
history = gr.State([]) | |
user_question = gr.State("") | |
gr.Markdown("KIs am LI - hier um Programmcode generieren zu lassen!") | |
with gr.Tabs(): | |
with gr.TabItem("LI-Coding-KI"): | |
with gr.Row(): | |
gr.HTML(title) | |
status_display = gr.Markdown("Erfolg", elem_id="status_display") | |
gr.Markdown(description_top) | |
with gr.Row(scale=1).style(equal_height=True): | |
with gr.Column(scale=5): | |
with gr.Row(scale=1): | |
chatbotGr = gr.Chatbot(elem_id="LI_chatbot").style(height="100%") | |
with gr.Row(scale=1): | |
with gr.Column(scale=12): | |
user_input = gr.Textbox( | |
show_label=False, placeholder="Gib deinen Text / Frage ein." | |
).style(container=False) | |
with gr.Column(min_width=100, scale=1): | |
submitBtn = gr.Button("Absenden") | |
with gr.Column(min_width=100, scale=1): | |
cancelBtn = gr.Button("Stoppen") | |
with gr.Row(scale=1): | |
emptyBtn = gr.Button( | |
"🧹 Neuer Chat", | |
) | |
with gr.Column(): | |
with gr.Column(min_width=50, scale=1): | |
with gr.Tab(label="Parameter zum Model"): | |
gr.Markdown("# Parameter für Testzwecke") | |
top_p = gr.Slider( | |
minimum=-0, | |
maximum=1.0, | |
value=0.95, | |
step=0.05, | |
interactive=True, | |
label="Top-p", | |
) | |
temperature = gr.Slider( | |
minimum=0.1, | |
maximum=2.0, | |
value=1, | |
step=0.1, | |
interactive=True, | |
label="Temperature", | |
) | |
max_length_tokens = gr.Slider( | |
minimum=0, | |
maximum=512, | |
value=512, | |
step=8, | |
interactive=True, | |
label="Max Generation Tokens", | |
) | |
max_context_length_tokens = gr.Slider( | |
minimum=0, | |
maximum=4096, | |
value=2048, | |
step=128, | |
interactive=True, | |
label="Max History Tokens", | |
) | |
gr.Markdown(description) | |
predict_args = dict( | |
fn=predict, | |
inputs=[ | |
user_input, | |
history, | |
top_p, | |
temperature, | |
max_length_tokens, | |
max_context_length_tokens, | |
], | |
outputs=[chatbotGr, status_display], | |
show_progress=True, | |
) | |
#neuer Chat | |
reset_args = dict( | |
#fn=reset_chat, inputs=[], outputs=[user_input, status_display] | |
fn=reset_textbox, inputs=[], outputs=[user_input, status_display] | |
) | |
# Chatbot | |
transfer_input_args = dict( | |
fn=transfer_input, inputs=[user_input], outputs=[user_question, user_input, submitBtn], show_progress=True | |
) | |
#Listener auf Start-Click auf Button oder Return | |
predict_event1 = user_input.submit(**transfer_input_args).then(**predict_args) | |
predict_event2 = submitBtn.click(**transfer_input_args).then(**predict_args) | |
#Listener, Wenn reset... | |
emptyBtn.click( | |
reset_state, | |
outputs=[chatbotGr, history, status_display], | |
show_progress=True, | |
) | |
emptyBtn.click(**reset_args) | |
demo.title = "LI Coding KI" | |
#demo.queue(concurrency_count=1).launch(share=True) | |
demo.queue(concurrency_count=1).launch(debug=True) | |