BlankTemplate / app.py
otitagan's picture
Update app.py
a9dc8ac verified
Raw
History Blame Contribute Delete
3.11 kB
import gradio as gr
import spaces
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
MODEL_NAME = "cognitivecomputations/dolphin-2.9.3-mistral-nemo-12b"
print("Loading tokenizer...")
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
print("Loading model...")
model = AutoModelForCausalLM.from_pretrained(
MODEL_NAME,
torch_dtype=torch.bfloat16,
device_map="auto",
trust_remote_code=True,
low_cpu_mem_usage=True
)
print("Model loaded successfully!")
@spaces.GPU
def chat(message, history):
# historyがtupleリストかdictリストか両対応にする
messages = []
if history:
for item in history:
if isinstance(item, dict):
# dict形式(role/content)の場合
messages.append(item)
elif isinstance(item, (list, tuple)) and len(item) == 2:
# tuple形式(user, assistant)の場合
user, assistant = item
if user:
messages.append({"role": "user", "content": user})
if assistant:
messages.append({"role": "assistant", "content": assistant})
else:
# 予期せぬ形式ならスキップ or エラー処理
continue
# 今のメッセージを追加
messages.append({"role": "user", "content": message})
# プロンプト作成(dolphinモデルなのでシンプルに)
full_prompt = ""
for msg in messages:
if msg["role"] == "user":
full_prompt += f"ユーザー: {msg['content']}\n"
elif msg["role"] == "assistant":
full_prompt += f"アシスタント: {msg['content']}\n\n"
full_prompt += "アシスタント:"
inputs = tokenizer(full_prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
try:
outputs = model.generate(
**inputs,
max_new_tokens=128,
do_sample=True,
temperature=0.7,
top_p=0.9,
repetition_penalty=1.1,
pad_token_id=tokenizer.eos_token_id
)
response = tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True).strip()
except Exception as e:
response = f"ごめんね、エラー出ちゃった… ({str(e)}) もう一回試してみて~!"
# 返却はGradioが期待するdict形式で追加
history.append({"role": "user", "content": message})
history.append({"role": "assistant", "content": response})
return "", history
with gr.Blocks(title="Uncensored 12B Chat") as demo:
gr.Markdown("# Dolphin 12B Uncensored Chat")
gr.Markdown("軽くて速いよ~!なんでも話してね……検閲なしだぜ!!!")
chatbot = gr.Chatbot(height=600)
msg = gr.Textbox(placeholder="メッセージ入力してEnter...")
clear = gr.Button("クリア")
msg.submit(chat, [msg, chatbot], [msg, chatbot])
clear.click(lambda: None, None, chatbot, queue=False)
demo.launch()