Spaces:
Runtime error
Runtime error
| #!pip install -U transformers gradio pillow | |
| import torch | |
| import gradio as gr | |
| from transformers import AutoProcessor, AutoModelForImageTextToText | |
| from PIL import Image | |
| # โโ ่ผๅ ฅๆจกๅ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| MODEL_ID = "google/gemma-4-12B" | |
| print(f"่ผๅ ฅๆจกๅ๏ผ{MODEL_ID} ...") | |
| processor = AutoProcessor.from_pretrained(MODEL_ID) | |
| model = AutoModelForImageTextToText.from_pretrained( | |
| MODEL_ID, | |
| torch_dtype=torch.float16, | |
| device_map="auto", | |
| ) | |
| model.eval() | |
| print("ๆจกๅ่ผๅ ฅๅฎๆ๏ผ") | |
| # โโ ๆจ่ซๅฝๅผ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| def build_messages(history: list[dict], user_text: str, image=None) -> list[dict]: | |
| """ๅฐ Gradio ๆญทๅฒ่จ้่ฝๆๆ HuggingFace messages ๆ ผๅผใ""" | |
| messages = [] | |
| # ๅ ๅ ฅๆญทๅฒๅฐ่ฉฑ | |
| for turn in history: | |
| messages.append({"role": "user", "content": [{"type": "text", "text": turn["content"] if turn["role"] == "user" else ""}]}) | |
| messages.append({"role": "assistant", "content": [{"type": "text", "text": turn["content"] if turn["role"] == "assistant" else ""}]}) | |
| # ๅ ๅ ฅๆฌ่ผชไฝฟ็จ่ ่จๆฏ | |
| user_content = [] | |
| if image is not None: | |
| user_content.append({"type": "image", "image": image}) | |
| user_content.append({"type": "text", "text": user_text}) | |
| messages.append({"role": "user", "content": user_content}) | |
| return messages | |
| def chat( | |
| user_message: str, | |
| image, | |
| history: list[dict], | |
| max_new_tokens: int, | |
| temperature: float, | |
| top_p: float, | |
| ): | |
| """ไธปๅฐ่ฉฑๅฝๅผ๏ผๅๅณๆดๆฐๅพ็ๆญทๅฒ่ๆธ ็ฉบ็่ผธๅ ฅใ""" | |
| if not user_message.strip() and image is None: | |
| return history, history, gr.update(value=""), gr.update(value=None) | |
| # ๅปบๆง messages | |
| messages = build_messages(history, user_message, image) | |
| # Processor ๅ่็ | |
| pil_images = [image] if image is not None else None | |
| inputs = processor.apply_chat_template( | |
| messages, | |
| add_generation_prompt=True, | |
| tokenize=True, | |
| return_tensors="pt", | |
| return_dict=True, | |
| images=pil_images, | |
| ).to(model.device, dtype=torch.float16) | |
| # ็ๆๅ่ฆ | |
| with torch.inference_mode(): | |
| output_ids = model.generate( | |
| **inputs, | |
| max_new_tokens=max_new_tokens, | |
| do_sample=temperature > 0, | |
| temperature=temperature if temperature > 0 else 1.0, | |
| top_p=top_p, | |
| ) | |
| # ๅชๅๆฐ็ๆ็้จๅ | |
| input_len = inputs["input_ids"].shape[-1] | |
| generated_ids = output_ids[:, input_len:] | |
| response = processor.decode(generated_ids[0], skip_special_tokens=True).strip() | |
| # ๆดๆฐๆญทๅฒ๏ผไฝฟ็จ Gradio messages ๆ ผๅผ๏ผ | |
| history = history + [ | |
| {"role": "user", "content": user_message}, | |
| {"role": "assistant", "content": response}, | |
| ] | |
| return history, history, gr.update(value=""), gr.update(value=None) | |
| def clear_history(): | |
| return [], [], gr.update(value=""), gr.update(value=None) | |
| # โโ Gradio UI โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| with gr.Blocks( | |
| title="Gemma-4 Chat", | |
| theme=gr.themes.Soft(primary_hue="emerald"), | |
| css=""" | |
| #chatbot { height: 550px; } | |
| .send-btn { background: #10b981 !important; color: white !important; } | |
| footer { display: none !important; } | |
| """, | |
| ) as demo: | |
| # โโ ๆจ้ก โโ | |
| gr.Markdown( | |
| """ | |
| # ๐ค Gemma-4 ๅคๆจกๆ ๅฐ่ฉฑๅฉ็ | |
| ๆฏๆด็ดๆๅญๅฐ่ฉฑ๏ผไบฆๅฏไธๅณๅ็้ฒ่กๅๆๅ็ญใ | |
| """ | |
| ) | |
| # โโ ๅฐ่ฉฑ็ๆ โโ | |
| state = gr.State([]) # ๅฒๅญ messages ๆญทๅฒ | |
| with gr.Row(): | |
| # โโ ๅทฆๆฌ๏ผ่ๅคฉ่ฆ็ช โโ | |
| with gr.Column(scale=3): | |
| chatbot = gr.Chatbot( | |
| elem_id="chatbot", | |
| label="ๅฐ่ฉฑ่ฆ็ช", | |
| type="messages", # ไฝฟ็จ dict ๆ ผๅผ | |
| avatar_images=(None, "https://huggingface.co/datasets/huggingface/brand-assets/resolve/main/hf-logo.svg"), | |
| ) | |
| with gr.Row(): | |
| user_input = gr.Textbox( | |
| placeholder="่ผธๅ ฅ่จๆฏ๏ผๆ Enter ๆ้ปๆ้ๅบโฆ", | |
| show_label=False, | |
| lines=2, | |
| scale=5, | |
| ) | |
| send_btn = gr.Button("้ๅบ โถ", elem_classes="send-btn", scale=1) | |
| # โโ ๅณๆฌ๏ผ่จญๅฎ่ๅ็ไธๅณ โโ | |
| with gr.Column(scale=1): | |
| image_input = gr.Image( | |
| label="ไธๅณๅ็๏ผ้ธๅกซ๏ผ", | |
| type="pil", | |
| height=220, | |
| ) | |
| gr.Markdown("### โ๏ธ ็ๆๅๆธ") | |
| max_new_tokens = gr.Slider(64, 2048, value=512, step=64, label="ๆๅคง็ๆ้ทๅบฆ") | |
| temperature = gr.Slider(0.0, 2.0, value=0.7, step=0.05, label="Temperature๏ผ0 = ็ขบๅฎๆง๏ผ") | |
| top_p = gr.Slider(0.1, 1.0, value=0.9, step=0.05, label="Top-p") | |
| clear_btn = gr.Button("๐๏ธ ๆธ ้คๅฐ่ฉฑ", variant="secondary") | |
| # โโ ไบไปถ็ถๅฎ โโ | |
| send_inputs = [user_input, image_input, state, max_new_tokens, temperature, top_p] | |
| send_outputs = [chatbot, state, user_input, image_input] | |
| send_btn.click(chat, inputs=send_inputs, outputs=send_outputs) | |
| user_input.submit(chat, inputs=send_inputs, outputs=send_outputs) | |
| clear_btn.click(clear_history, outputs=[chatbot, state, user_input, image_input]) | |
| # โโ ๅๅ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ | |
| if __name__ == "__main__": | |
| demo.launch( | |
| server_name="0.0.0.0", # ๅ ่จฑๅค้จ้ฃ็ท๏ผColab / ้ ็ซฏไผบๆๅจ็จ๏ผ | |
| server_port=7860, | |
| share=False, # ่จญ็บ True ๅฏ็ข็ๅ ฌ้้ฃ็ต๏ผColab ้่ฆ๏ผ | |
| inbrowser=True, | |
| ) |