day2 / app.py
ffgtv3's picture
Update app.py
c263cca verified
raw
history blame
2.19 kB
import streamlit as st
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
from PIL import Image
import io
@st.cache_resource
def load_model():
model_name = "Qwen/Qwen2-VL-7B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto")
return tokenizer, model
def generate_response(prompt, image, tokenizer, model):
if image:
image = Image.open(image).convert('RGB')
inputs = tokenizer.from_pretrained(prompt, images=[image], return_tensors='pt').to(model.device)
else:
inputs = tokenizer(prompt, return_tensors='pt').to(model.device)
with torch.no_grad():
outputs = model.generate(**inputs, max_new_tokens=100)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
return response
st.title("Чат с Qwen VL-7B-Instruct")
tokenizer, model = load_model()
if "messages" not in st.session_state:
st.session_state.messages = []
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
if "image" in message:
st.image(message["image"])
prompt = st.chat_input("Введите ваше сообщение")
uploaded_file = st.file_uploader("Загрузите изображение (необязательно)", type=["png", "jpg", "jpeg"])
if prompt or uploaded_file:
if uploaded_file:
image = Image.open(uploaded_file)
st.session_state.messages.append({"role": "user", "content": prompt or "Опишите это изображение", "image": uploaded_file})
with st.chat_message("user"):
if prompt:
st.markdown(prompt)
st.image(image)
else:
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)
with st.chat_message("assistant"):
response = generate_response(prompt, uploaded_file, tokenizer, model)
st.markdown(response)
st.session_state.messages.append({"role": "assistant", "content": response})