Spaces:
Sleeping
Sleeping
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) | |