Genie / app.py
dror201031's picture
Update app.py
45c5911 verified
import os
import sys
import subprocess
import gradio as gr
import time
# 诪转拽讬谉 讞讘讬诇讜转 谞讚专砖讜转 讗诐 讞住专讜转
print("===== Application Startup at", os.popen('date "+%Y-%m-%d %H:%M:%S"').read().strip(), "=====")
try:
import transformers
import huggingface_hub
import torch
except ImportError:
print("诪转拽讬谉 讞讘讬诇讜转 谞讚专砖讜转...")
packages = [
"transformers>=4.38.0",
"huggingface_hub>=0.20.0",
"torch>=2.0.0",
"accelerate>=0.25.0"
]
subprocess.check_call([sys.executable, "-m", "pip", "install"] + packages)
print("讛转拽谞转 讛讞讘讬诇讜转 讛讜砖诇诪讛 讘讛爪诇讞讛!")
# 诪讬讬讘讗 讗转 讛住驻专讬讜转 讗讞专讬 讛转拽谞讛 讘诪讬讚转 讛爪讜专讱
try:
import transformers
from huggingface_hub import login
import torch
import gradio as gr
print("讬讘讜讗 讛住驻专讬讜转 讛爪诇讬讞!")
except ImportError as e:
print(f"砖讙讬讗讛 讘讬讘讜讗 讛住驻专讬讜转: {str(e)}")
sys.exit(1)
# 专砖讬诪转 诪讜讚诇讬诐 Qwen3-Coder
MODELS = {
"Qwen/Qwen1.5-0.5B-Chat": "诪讜讚诇 Qwen 拽讟谉 - 转讜诪讱 讘注讘专讬转 讜诪转讗讬诐 诇砖讬讞讛 讜转讻谞讜转",
"Qwen/Qwen1.5-1.8B-Chat": "诪讜讚诇 Qwen 讘讬谞讜谞讬 - 转讜诪讱 讘砖驻讜转 专讘讜转 讻讜诇诇 注讘专讬转",
"Qwen/Qwen1.5-4B-Chat": "诪讜讚诇 Qwen 讞讝拽 讬讜转专 - 转讜诪讱 讘砖驻讜转 专讘讜转 讜拽讬讚讜讚",
"Qwen/Qwen1.5-7B-Chat": "诪讜讚诇 Qwen 讞讝拽 诪讗讜讚 - 诪转讗讬诐 诇砖讬讞讛 讜转讻谞讜转 诪转拽讚诪转",
"Qwen/Qwen1.5-7B-Coder": "诪讜讚诇 Qwen3-Coder - 诪砖讜驻专 诇转讻谞讜转 讜诪砖讬诪讜转 拽讜讚"
}
# 诪讬诇讜谉 讛讙讚专讜转 讗讜驻讟讬诪诇讬讜转 诇驻讬 住讜讙讬 诪讜讚诇讬诐
MODEL_CONFIGS = {
"qwen": { # 诇诪讜讚诇讬 Qwen
"max_new_tokens": 512,
"do_sample": True,
"temperature": 0.7,
"top_p": 0.95,
"repetition_penalty": 1.05,
"no_repeat_ngram_size": 3
},
"default": { # 诇诪讜讚诇讬诐 讗讞专讬诐
"max_new_tokens": 256,
"do_sample": True,
"temperature": 0.7,
"top_p": 0.92,
"repetition_penalty": 1.1,
"no_repeat_ngram_size": 2
}
}
# 诪转讞讘专 诇讞砖讘讜谉 Hugging Face
token = os.environ.get("HF_TOKEN")
if token:
login(token)
print("讛转讞讘专讜转 诇-Hugging Face 讛爪诇讬讞讛!")
else:
print("讗讝讛专讛: 讟讜拽谉 HF_TOKEN 诇讗 诪讜讙讚专 讘住讘讬讘转 讛注讘讜讚讛. 讬讬转讻谉 砖诇讗 转讛讬讛 讙讬砖讛 诇诪讜讚诇讬诐 诪讜讙讘诇讬诐.")
# 讛讙讚专转 诪砖转谞讬诐 讙诇讜讘诇讬讬诐
default_model_name = "Qwen/Qwen1.5-7B-Coder"
current_model_name = default_model_name
generator = None
# 诪讙讚讬专 讗转 generator 讻诪砖转谞讛 讙诇讜讘诇讬 讘讻诇 讛驻讜谞拽爪讬讜转
def init_globals():
global generator, current_model_name
# 砖诐 诪砖转谞讬诐 讙诇讜讘诇讬讬诐 诪讗讜转讞诇讬诐
# 诪讗转讞诇 讗转 讛诪砖转谞讬诐 讛讙诇讜讘诇讬讬诐
init_globals()
def load_model(model_name, status_box=None):
"""讟注讬谞转 诪讜讚诇 讜注讚讻讜谉 住讟讟讜住"""
global generator, current_model_name
# 砖讞专讜专 诪砖讗讘讬诐 砖诇 诪讜讚诇 拽讜讚诐 讗诐 拽讬讬诐
if generator is not None:
import gc
del generator
gc.collect()
if torch.cuda.is_available():
torch.cuda.empty_cache()
current_model_name = model_name
if status_box is not None:
status_box = gr.Markdown(f"讟讜注谉 讗转 讛诪讜讚诇: {model_name}...")
try:
# Qwen 诪讜讚诇讬诐 诪转讗讬诪讬诐 诇爪'讗讟
generator = transformers.pipeline(
"text-generation",
model=model_name,
device_map="auto",
torch_dtype="auto"
)
if status_box is not None:
status_box = gr.Markdown(f"**讛诪讜讚诇 {model_name} 谞讟注谉 讘讛爪诇讞讛!**")
return f"讛诪讜讚诇 {model_name} 谞讟注谉 讘讛爪诇讞讛!", status_box
except Exception as e:
error_msg = f"砖讙讬讗讛 讘讟注讬谞转 讛诪讜讚诇 {model_name}: {str(e)}"
print(error_msg)
if status_box is not None:
status_box = gr.Markdown(f"**砖讙讬讗讛:** {error_msg}")
return error_msg, status_box
# 讟注讬谞转 诪讜讚诇 讘专讬专转 诪讞讚诇
print(f"讟讜注谉 诪讜讚诇 讘专讬专转 诪讞讚诇 {default_model_name}...")
_, _ = load_model(default_model_name)
def ask_model(prompt):
global generator, current_model_name
if generator is None:
return "讛诪讜讚诇 诇讗 谞讟注谉 讘讛爪诇讞讛. 谞住讛 诇讟注讜谉 诪讜讚诇 转讞讬诇讛."
try:
# 讟讬驻讜诇 讘诪讜讚诇讬 Qwen
outputs = generator(
prompt,
max_new_tokens=512, # 讗讜专讱 转讜爪讗讛 诪拽住讬诪诇讬 - 讛讙讚诇谞讜 注讘讜专 Qwen
do_sample=True, # 讚讙讬诪讛 讗拽专讗讬转 讘诪拽讜诐 greedy
temperature=0.7, # 讗讬讝讜谉 讘讬谉 讚讬讜拽 讜讬爪讬专转讬讜转
top_p=0.95, # 谞讜拽诇讬讜住 讚讙讬诪讛 - 砖讜诪专 注诇 诪讙讜讜谉 转砖讜讘讜转
repetition_penalty=1.05, # 诪讜谞注 讞讝专讜转
no_repeat_ngram_size=3, # 诪谞讬注转 讞讝专讛 注诇 讘讬讙专诪讜转 (讝讜讙讜转 诪讬诇讬诐)
return_full_text=False # 诪讞讝讬专 专拽 讗转 讛讟拽住讟 讛讞讚砖 砖谞讜爪专
)
# 诪讞讝讬专 讗转 讛讟拽住讟 砖谞讜爪专
if isinstance(outputs, list) and len(outputs) > 0:
return outputs[0]["generated_text"]
else:
return str(outputs)
except Exception as e:
return f"砖讙讬讗讛 讘讛驻注诇转 讛诪讜讚诇: {str(e)}"
# 讬爪讬专转 诪诪砖拽 诪砖转诪砖
with gr.Blocks() as demo:
gr.Markdown("# 诪注专讻转 爪'讗讟 注诐 诪讜讚诇讬 Qwen3-Coder")
# 讗讝讜专 讘讞讬专转 诪讜讚诇 讜讟注讬谞讛
with gr.Row():
with gr.Column(scale=3):
# 专砖讬诪讛 谞驻转讞转 诇讘讞讬专转 诪讜讚诇
model_dropdown = gr.Dropdown(
choices=list(MODELS.keys()),
value=default_model_name,
label="讘讞专 诪讜讚诇",
info="讘讞专 诪讜讚诇 诪讛专砖讬诪讛 讜诇讞抓 注诇 '讟注谉 诪讜讚诇'"
)
# 转讬讗讜专 讛诪讜讚诇 讛谞讘讞专
model_description = gr.Markdown(f"**转讬讗讜专 讛诪讜讚诇:** {MODELS[default_model_name]}")
with gr.Column(scale=1):
# 讻驻转讜专 讟注讬谞转 诪讜讚诇
load_button = gr.Button("讟注谉 诪讜讚诇", variant="primary")
# 讗讝讜专 住讟讟讜住 讟注讬谞转 诪讜讚诇
model_status = gr.Markdown(f"**诪讜讚诇 谞讜讻讞讬:** {default_model_name}")
# 驻讜谞拽爪讬讛 诇讛爪讙转 转讬讗讜专 讛诪讜讚诇 讘注转 讘讞讬专讛
def update_model_description(model_name):
return f"**转讬讗讜专 讛诪讜讚诇:** {MODELS[model_name]}"
model_dropdown.change(fn=update_model_description, inputs=model_dropdown, outputs=model_description)
# 驻讜谞拽爪讬讛 诇讟注讬谞转 讛诪讜讚诇 讛谞讘讞专
def load_selected_model(model_name):
message, _ = load_model(model_name)
return message, f"**诪讜讚诇 谞讜讻讞讬:** {model_name}"
load_button.click(fn=load_selected_model, inputs=model_dropdown, outputs=[gr.Textbox(visible=False), model_status])
gr.Markdown("---")
gr.Markdown("### 砖讗诇 讗转 讛诪讜讚诇")
# 讗讝讜专 砖讗诇讜转 讜转砖讜讘讜转
with gr.Row():
input_text = gr.Textbox(
placeholder="讻转讜讘 讻讗谉 讗转 讛砖讗诇讛 砖诇讱...",
lines=3,
label="砖讗诇讛/讘拽砖讛"
)
output_text = gr.Textbox(label="转砖讜讘转 讛诪讜讚诇", lines=10)
submit_btn = gr.Button("砖诇讞", variant="primary")
submit_btn.click(fn=ask_model, inputs=input_text, outputs=output_text)
# 讚讜讙诪讗讜转 诇砖讗诇讜转
gr.Markdown("### 讚讜讙诪讗讜转 诇砖讗诇讜转:")
examples = gr.Examples(
[
"住驻专 诇讬 注诇 讘讬谞讛 诪诇讗讻讜转讬转",
"诪讛 讚注转讱 注诇 讛砖驻讛 讛注讘专讬转?",
"讻转讜讘 住讬驻讜专 拽爪专 注诇 讬专讜砖诇讬诐",
"讻转讜讘 诇讬 拽讜讚 讘驻讬讬转讜谉 砖诪讞砖讘 讗转 诪住驻专讬 驻讬讘讜谞讗爪'讬",
"讻转讜讘 诇讬 拽讜讚 讘-JavaScript 砖讬讜爪专 讗驻诇讬拽爪讬讬转 专砖讬诪转 诪砖讬诪讜转",
"讛住讘专 诇讬 注诇 诪注专讻讜转 诪讘讜住住讜转 讟专谞住驻讜专诪专讬诐"
],
input_text
)
gr.Markdown("""
### 讛注专讜转:
- 讘讞专 诪讜讚诇 诪讛专砖讬诪讛 讜诇讞抓 注诇 '讟注谉 诪讜讚诇' 讻讚讬 诇讛讞诇讬祝 讗转 讛诪讜讚诇 讛谞讜讻讞讬
- 诪讜讚诇讬 Qwen 诪转讗讬诪讬诐 讘诪讬讜讞讚 诇爪'讗讟 讜转讻谞讜转
- 诪讜诪诇抓 诇讛转讞讬诇 注诐 讛诪讜讚诇 讛拽讟谉 讬讜转专 (0.5B) 讜诇讛砖转诪砖 讘诪讜讚诇讬诐 讛讙讚讜诇讬诐 讬讜转专 专拽 注讘讜专 诪砖讬诪讜转 诪讜专讻讘讜转
- 讛讟注讬谞讛 讛专讗砖讜谞讬转 砖诇 讻诇 诪讜讚诇 注砖讜讬讛 诇拽讞转 诪住驻专 砖谞讬讜转 注讚 讚拽讜转
""")
# 讛驻注诇转 讛诪诪砖拽 注诐 讛讙讚专讜转 谞讜住驻讜转
demo.launch(show_error=True)