AskMoondream / app_v2.py
hanzla's picture
Update app_v2.py
818cb74 verified
raw
history blame contribute delete
No virus
3.26 kB
import gradio as gr
import os
import time
import spaces
import torch
import re
import gradio as gr
from threading import Thread
from transformers import TextIteratorStreamer, AutoTokenizer, AutoModelForCausalLM
from PIL import Image
import subprocess
subprocess.run('pip install flash-attn --no-build-isolation', env={'FLASH_ATTENTION_SKIP_CUDA_BUILD': "TRUE"}, shell=True)
model_id = "vikhyatk/moondream2"
revision = "2024-04-02"
tokenizer = AutoTokenizer.from_pretrained(model_id, revision=revision)
moondream = AutoModelForCausalLM.from_pretrained(
model_id, trust_remote_code=True, revision=revision,
torch_dtype=torch.bfloat16, device_map={"": "cuda"},
attn_implementation="flash_attention_2"
)
moondream.eval()
def print_like_dislike(x: gr.LikeData):
print(x.index, x.value, x.liked)
def add_message(history, message):
# Handle image and text input
if message["files"]:
for x in message["files"]:
history.append(((x,), None))
if message["text"] is not None:
history.append((message["text"], None))
return history, gr.MultimodalTextbox(value=None, interactive=False)
@spaces.GPU(duration=10)
def bot(history):
# Reverse search through the last 5 messages for an image file
last_five_messages = history[-5:] # Get the last five messages
image_path = None
last_message = None
for message in last_five_messages:
if isinstance(message[0], tuple) and isinstance(message[0][0], str):
image_path = message[0][0]
if isinstance(message[0],str):
last_message = message[0]
if image_path:
try:
image = Image.open(image_path) # Try to open the image using Pillow
image_embeds = moondream.encode_image(image)
print(image_embeds.shape)
response = moondream.answer_question(image_embeds, last_message, tokenizer)
except IOError:
response = "Failed to open image. Please check the image path or file permissions."
else:
image_embeds = torch.zeros(1, 729, 2048, dtype=torch.bfloat16, device='cuda')
response = moondream.answer_question(image_embeds, last_message, tokenizer)
history[-1][1] = ""
for character in response:
history[-1][1] += character
yield history
with gr.Blocks(theme=gr.themes.Default(primary_hue="green", secondary_hue="emerald")) as demo:
gr.Markdown(
"""
# AskMoondream: Moondream 2 Demonstration Space
## Modularity AI presents this open source huggingface space for running fast experimental inferences on Moondream2.
"""
)
chatbot = gr.Chatbot(
[],
elem_id="chatbot",
bubble_full_width=False,
height = 550
)
chat_input = gr.MultimodalTextbox(interactive=True, file_types=["image"], placeholder="Enter message or upload file...", show_label=False)
chat_msg = chat_input.submit(add_message, inputs=[chatbot, chat_input], outputs=[chatbot, chat_input])
bot_msg = chat_msg.then(bot, inputs=chatbot, outputs=chatbot, api_name="bot_response")
bot_msg.then(lambda: gr.MultimodalTextbox(interactive=True), None, outputs=[chat_input])
chatbot.like(print_like_dislike, None, None)
demo.queue()
demo.launch()