Spaces:
Sleeping
Sleeping
File size: 8,973 Bytes
d0b32be f068274 d0b32be 2d6369f d0b32be f068274 d0b32be 2f394e3 d0b32be f068274 d0b32be f068274 d0b32be f068274 d0b32be f068274 d0b32be f068274 2e7b3be 45c5911 2d6369f 45c5911 f9ce600 45c5911 f9ce600 45c5911 f9ce600 45c5911 f9ce600 2d6369f d0b32be 29ab382 f3dde0c 29ab382 1dec5a8 45c5911 2d6369f d0b32be 2d6369f 1dec5a8 2d6369f f9ce600 2d6369f f3dde0c 45c5911 2d6369f 29ab382 2d6369f 29ab382 2d6369f 29ab382 45c5911 f3dde0c 45c5911 29ab382 d0b32be 29ab382 d0b32be 45c5911 2d6369f d0b32be 2d6369f d0b32be 2d6369f d0b32be 2d6369f d0b32be 2d6369f d0b32be 2f394e3 2d6369f 45c5911 d0b32be 2e7b3be f3dde0c 2d6369f 45c5911 2d6369f f3dde0c 2d6369f |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 |
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)
|