File size: 3,555 Bytes
7f5d544
 
 
 
 
 
d245beb
7f5d544
460f0bb
d245beb
936e52b
460f0bb
936e52b
460f0bb
936e52b
d245beb
7f5d544
 
 
 
 
 
 
 
d245beb
7f5d544
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d245beb
7f5d544
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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"<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()