Skip to content

Commit 7d97d0a

Browse files
Add genai usage (#2757)
CVS-162423
1 parent 0b4b204 commit 7d97d0a

File tree

3 files changed

+154
-189
lines changed

3 files changed

+154
-189
lines changed

.ci/spellcheck/.pyspelling.wordlist.txt

+1
Original file line numberDiff line numberDiff line change
@@ -1020,6 +1020,7 @@ VITS
10201020
vitt
10211021
VL
10221022
vl
1023+
vlm
10231024
VLM
10241025
VLModel
10251026
VLMPipeline

notebooks/phi-3-vision/gradio_helper.py

+61-54
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,39 @@
22
import requests
33
import gradio as gr
44
from PIL import Image
5-
from threading import Thread
6-
from transformers import TextIteratorStreamer
5+
from threading import Event, Thread
6+
from queue import Queue
77

8+
import openvino_genai as ov_genai
89

9-
def make_demo(model, processor):
10-
model_name = Path(model.config._name_or_path).parent.name
1110

11+
class TextQueue:
12+
def __init__(self) -> None:
13+
self.text_queue = Queue()
14+
self.stop_signal = None
15+
self.stop_tokens = []
16+
17+
def __call__(self, text):
18+
self.text_queue.put(text)
19+
20+
def __iter__(self):
21+
return self
22+
23+
def __next__(self):
24+
value = self.text_queue.get()
25+
if value == self.stop_signal or value in self.stop_tokens:
26+
raise StopIteration()
27+
else:
28+
return value
29+
30+
def reset(self):
31+
self.text_queue = Queue()
32+
33+
def end(self):
34+
self.text_queue.put(self.stop_signal)
35+
36+
37+
def make_demo(pipe, read_images, model_name):
1238
example_image_urls = [
1339
("https://github.com/openvinotoolkit/openvino_notebooks/assets/29454499/dd5105d6-6a64-4935-8a34-3058a82c8d5d", "small.png"),
1440
("https://github.com/openvinotoolkit/openvino_notebooks/assets/29454499/1221e2a8-a6da-413a-9af6-f04d56af3754", "chart.png"),
@@ -23,69 +49,50 @@ def bot_streaming(message, history):
2349
print(f"history is - {history}")
2450
files = message["files"] if isinstance(message, dict) else message.files
2551
message_text = message["text"] if isinstance(message, dict) else message.text
52+
53+
image = None
2654
if files:
2755
# message["files"][-1] is a Dict or just a string
2856
if isinstance(files[-1], dict):
2957
image = files[-1]["path"]
3058
else:
31-
image = files[-1] if isinstance(files[-1], (list, tuple, str)) else files[-1].path
32-
else:
33-
# if there's no image uploaded for this turn, look for images in the past turns
34-
# kept inside tuples, take the last one
35-
for hist in history:
36-
if type(hist[0]) == tuple:
37-
image = hist[0][0]
59+
if isinstance(files[-1], (str, Path)):
60+
image = files[-1]
61+
else:
62+
image = files[-1] if isinstance(files[-1], (list, tuple)) else files[-1].path
3863
try:
3964
if image is None:
4065
# Handle the case where image is None
4166
raise gr.Error("You need to upload an image for Phi3-Vision to work. Close the error and try again with an Image.")
4267
except NameError:
4368
# Handle the case where 'image' is not defined at all
4469
raise gr.Error("You need to upload an image for Phi3-Vision to work. Close the error and try again with an Image.")
70+
image = read_images(image)
4571

46-
conversation = []
47-
flag = False
48-
for user, assistant in history:
49-
if assistant is None:
50-
# pass
51-
flag = True
52-
conversation.extend([{"role": "user", "content": ""}])
53-
continue
54-
if flag == True:
55-
conversation[0]["content"] = f"<|image_1|>\n{user}"
56-
conversation.extend([{"role": "assistant", "content": assistant}])
57-
flag = False
58-
continue
59-
conversation.extend([{"role": "user", "content": user}, {"role": "assistant", "content": assistant}])
60-
61-
if len(history) == 0:
62-
conversation.append({"role": "user", "content": f"<|image_1|>\n{message_text}"})
63-
else:
64-
conversation.append({"role": "user", "content": message_text})
65-
print(f"prompt is -\n{conversation}")
66-
prompt = processor.tokenizer.apply_chat_template(conversation, tokenize=False, add_generation_prompt=True)
67-
image = Image.open(image)
68-
inputs = processor(prompt, image, return_tensors="pt")
69-
70-
streamer = TextIteratorStreamer(
71-
processor,
72-
**{
73-
"skip_special_tokens": True,
74-
"skip_prompt": True,
75-
"clean_up_tokenization_spaces": False,
76-
},
77-
)
78-
generation_kwargs = dict(
79-
inputs,
80-
streamer=streamer,
81-
max_new_tokens=1024,
82-
do_sample=False,
83-
temperature=0.0,
84-
eos_token_id=processor.tokenizer.eos_token_id,
85-
)
86-
87-
thread = Thread(target=model.generate, kwargs=generation_kwargs)
88-
thread.start()
72+
print(f"prompt is -\n{message_text}")
73+
74+
config = ov_genai.GenerationConfig()
75+
config.max_new_tokens = 200
76+
config.do_sample = False
77+
config.set_eos_token_id(pipe.get_tokenizer().get_eos_token_id())
78+
79+
streamer = TextQueue()
80+
stream_complete = Event()
81+
82+
def generate_and_signal_complete():
83+
"""
84+
generation function for single thread
85+
"""
86+
streamer.reset()
87+
generation_kwargs = {"prompt": message_text, "generation_config": config, "streamer": streamer}
88+
if image is not None:
89+
generation_kwargs["images"] = image
90+
pipe.generate(**generation_kwargs)
91+
stream_complete.set()
92+
streamer.end()
93+
94+
t1 = Thread(target=generate_and_signal_complete)
95+
t1.start()
8996

9097
buffer = ""
9198
for new_text in streamer:

0 commit comments

Comments
 (0)