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() @spaces.GPU(duration=60) 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"\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()