# import gradio as gr
# from transformers import Qwen2_5_VLForConditionalGeneration, AutoProcessor, TextIteratorStreamer
# from threading import Thread
# from qwen_vl_utils import process_vision_info
# import torch
# import time
# # Check if a GPU is available
# device = "cuda" if torch.cuda.is_available() else "cpu"
# local_path = "Fancy-MLLM/R1-OneVision-7B"
# # Load the model on the appropriate device (GPU if available, otherwise CPU)
# model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
# local_path, torch_dtype="auto", device_map=device
# )
# processor = AutoProcessor.from_pretrained(local_path)
# def generate_output(image, text, button_click):
# # Prepare input data
# messages = [
# {
# "role": "user",
# "content": [
# {"type": "image", "image": image, 'min_pixels': 1003520, 'max_pixels': 12845056},
# {"type": "text", "text": text},
# ],
# }
# ]
# # Prepare inputs for the model
# text_input = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
# image_inputs, video_inputs = process_vision_info(messages)
# inputs = processor(
# text=[text_input],
# images=image_inputs,
# videos=video_inputs,
# padding=True,
# return_tensors="pt",
# )
# # Move inputs to the same device as the model
# inputs = inputs.to(model.device)
# streamer = TextIteratorStreamer(processor, skip_prompt=True, skip_special_tokens=True)
# generation_kwargs = dict(
# **inputs,
# streamer=streamer,
# max_new_tokens=4096,
# top_p=0.001,
# top_k=1,
# temperature=0.01,
# repetition_penalty=1.0,
# )
# thread = Thread(target=model.generate, kwargs=generation_kwargs)
# thread.start()
# generated_text = ''
# try:
# for new_text in streamer:
# generated_text += new_text
# yield f"{generated_text}"
# except Exception as e:
# print(f"Error: {e}")
# yield f"Error occurred: {str(e)}"
# Css = """
# #output-markdown {
# overflow-y: auto;
# white-space: pre-wrap;
# word-wrap: break-word;
# }
# #output-markdown .math {
# overflow-x: auto;
# max-width: 100%;
# }
# .markdown-text {
# white-space: pre-wrap;
# word-wrap: break-word;
# }
# .markdown-output {
# min-height: 20vh;
# max-width: 100%;
# overflow-y: auto;
# }
# #qwen-md .katex-display { display: inline; }
# #qwen-md .katex-display>.katex { display: inline; }
# #qwen-md .katex-display>.katex>.katex-html { display: inline; }
# """
# with gr.Blocks(css=Css) as demo:
# gr.HTML("""
🦖 R1-OneVision Demo""")
# with gr.Row():
# with gr.Column():
# input_image = gr.Image(type="pil", label="Upload") # **改回 PIL 处理**
# input_text = gr.Textbox(label="Input your question")
# with gr.Row():
# clear_btn = gr.ClearButton([input_image, input_text])
# submit_btn = gr.Button("Submit", variant="primary")
# with gr.Column():
# output_text = gr.Markdown(elem_id="qwen-md", container=True, elem_classes="markdown-output")
# submit_btn.click(fn=generate_output, inputs=[input_image, input_text], outputs=output_text)
# demo.launch(share=False)
import gradio as gr
from transformers import AutoProcessor, Qwen2_5_VLForConditionalGeneration, TextIteratorStreamer
from transformers.image_utils import load_image
from threading import Thread
import time
import torch
import spaces
MODEL_ID = "Fancy-MLLM/R1-OneVision-7B"
processor = AutoProcessor.from_pretrained(MODEL_ID, trust_remote_code=True)
model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
MODEL_ID,
trust_remote_code=True,
torch_dtype=torch.bfloat16
).to("cuda").eval()
@spaces.GPU
def model_inference(input_dict, history):
text = input_dict["text"]
files = input_dict["files"]
# Load images if provided
if len(files) > 1:
images = [load_image(image) for image in files]
elif len(files) == 1:
images = [load_image(files[0])]
else:
images = []
# Validate input
if text == "" and not images:
gr.Error("Please input a query and optionally image(s).")
return
if text == "" and images:
gr.Error("Please input a text query along with the image(s).")
return
# Prepare messages for the model
messages = [
{
"role": "user",
"content": [
*[{"type": "image", "image": image} for image in images],
{"type": "text", "text": text},
],
}
]
# Apply chat template and process inputs
prompt = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = processor(
text=[prompt],
images=images if images else None,
return_tensors="pt",
padding=True,
).to("cuda")
# Set up streamer for real-time output
streamer = TextIteratorStreamer(processor, skip_prompt=True, skip_special_tokens=True)
generation_kwargs = dict(inputs, streamer=streamer, max_new_tokens=2048)
# Start generation in a separate thread
thread = Thread(target=model.generate, kwargs=generation_kwargs)
thread.start()
# Stream the output
buffer = ""
yield "Thinking..."
for new_text in streamer:
buffer += new_text
time.sleep(0.01)
yield buffer
demo = gr.ChatInterface(
fn=model_inference,
description="# **Fancy-MLLM/R1-OneVision-7B**",
textbox=gr.MultimodalTextbox(label="Query Input", file_types=["image"], file_count="multiple"),
stop_btn="Stop Generation",
multimodal=True,
cache_examples=False,
)
demo.launch(debug=True)