Spaces:
Runtime error
Runtime error
| 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) | |