Spaces:
Running on Zero
Running on Zero
| import os | |
| import torch | |
| import gradio as gr | |
| import spaces | |
| from PIL import Image | |
| from transformers import AutoModel, AutoTokenizer | |
| from transformers.modeling_utils import PreTrainedModel | |
| # Kurşun geçirmez yama: Qwen modeli "None" atasa bile biz her zaman "{}" (boş sözlük) döndürüyoruz. | |
| if not hasattr(PreTrainedModel, "all_tied_weights_keys"): | |
| def _get_tied_keys(self): | |
| return getattr(self, "_tied_weights_keys", {}) or {} | |
| def _set_tied_keys(self, value): | |
| self._tied_weights_keys = value or {} | |
| PreTrainedModel.all_tied_weights_keys = property(_get_tied_keys, _set_tied_keys) | |
| MODEL_ID = "OpenGVLab/InternVL3-8B" | |
| print("Model ve tokenizer yükleniyor...") | |
| tokenizer = AutoTokenizer.from_pretrained( | |
| MODEL_ID, | |
| trust_remote_code=True, | |
| use_fast=False | |
| ) | |
| model = AutoModel.from_pretrained( | |
| MODEL_ID, | |
| torch_dtype=torch.bfloat16, | |
| trust_remote_code=True | |
| ).eval() | |
| def generate_response(image, text, max_tokens, temperature): | |
| if image is None and not text.strip(): | |
| return "Lütfen en azından bir metin veya görsel girin." | |
| model.to("cuda") | |
| pixel_values = None | |
| if image is not None: | |
| image = image.convert("RGB") | |
| if hasattr(model, "preprocess_image"): | |
| pixel_values = model.preprocess_image(image).to(torch.bfloat16).cuda() | |
| else: | |
| import torchvision.transforms as T | |
| transform = T.Compose([ | |
| T.Resize((448, 448)), | |
| T.ToTensor(), | |
| T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) | |
| ]) | |
| pixel_values = transform(image).unsqueeze(0).to(torch.bfloat16).cuda() | |
| generation_config = dict( | |
| max_new_tokens=max_tokens, | |
| do_sample=True if temperature > 0 else False, | |
| temperature=temperature, | |
| top_p=0.8, | |
| ) | |
| question = text if text.strip() else "Describe this image in detail." | |
| if pixel_values is not None: | |
| prompt = f"<image>\n{question}" | |
| response = model.chat(tokenizer, pixel_values, prompt, generation_config) | |
| else: | |
| response = model.chat(tokenizer, None, question, generation_config) | |
| return response | |
| with gr.Blocks(theme=gr.themes.Soft(), title="InternVL3-8B Demo") as demo: | |
| gr.Markdown("# 👁️ InternVL3-8B Vision-Language Demo") | |
| with gr.Row(): | |
| with gr.Column(scale=1): | |
| image_input = gr.Image(type="pil", label="Görsel Yükle (İsteğe Bağlı)") | |
| text_input = gr.Textbox( | |
| lines=3, | |
| placeholder="Görsel hakkında soru sorun veya metin girin...", | |
| label="Mesaj" | |
| ) | |
| with gr.Accordion("Parametreler", open=False): | |
| max_tokens = gr.Slider(64, 2048, 512, step=64, label="Max New Tokens") | |
| temperature = gr.Slider(0.0, 1.0, 0.2, step=0.05, label="Temperature") | |
| submit_btn = gr.Button("Gönder 🚀", variant="primary") | |
| clear_btn = gr.Button("Temizle") | |
| with gr.Column(scale=1): | |
| output_text = gr.Textbox(lines=12, label="Model Yanıtı", interactive=False) | |
| submit_btn.click( | |
| fn=generate_response, | |
| inputs=[image_input, text_input, max_tokens, temperature], | |
| outputs=output_text | |
| ) | |
| clear_btn.click( | |
| fn=lambda: (None, "", ""), | |
| inputs=[], | |
| outputs=[image_input, text_input, output_text] | |
| ) | |
| if __name__ == "__main__": | |
| demo.queue().launch() |