Spaces:
Runtime error
Runtime error
import argparse | |
import torch | |
from transformers import AutoModel, AutoTokenizer | |
import gradio as gr | |
from PIL import Image | |
import traceback | |
import spaces | |
# Argument Parsing | |
parser = argparse.ArgumentParser(description='demo') | |
parser.add_argument('--device', type=str, default='cuda', help='cuda or mps') | |
args = parser.parse_args() | |
device = args.device | |
assert device in ['cuda', 'mps'] | |
# Load model and tokenizer manually | |
model_path = 'openbmb/MiniCPM-Llama3-V-2_5' | |
if 'int4' in model_path: | |
if device == 'mps': | |
print('Error: running int4 model with bitsandbytes on Mac is not supported right now.') | |
exit() | |
model = AutoModel.from_pretrained(model_path, trust_remote_code=True) | |
else: | |
model = AutoModel.from_pretrained(model_path, trust_remote_code=True).to(dtype=torch.float16) | |
model = model.to(device=device) | |
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True) | |
model.eval() | |
model_name = 'MiniCPM-Llama3-V 2.5' | |
def chat(image, msgs, sampling=True, temperature=0.7, stream=False): | |
try: | |
image = image.convert('RGB') | |
if stream: | |
res = model.chat( | |
image=image, | |
msgs=msgs, | |
tokenizer=tokenizer, | |
sampling=sampling, | |
temperature=temperature, | |
stream=True | |
) | |
generated_text = "" | |
for new_text in res: | |
generated_text += new_text | |
yield new_text | |
else: | |
res = model.chat( | |
image=image, | |
msgs=msgs, | |
tokenizer=tokenizer, | |
sampling=sampling, | |
temperature=temperature | |
) | |
yield res | |
except Exception as err: | |
print(err) | |
traceback.print_exc() | |
yield ERROR_MSG | |
def upload_img(image, _chatbot, _app_session): | |
image = Image.fromarray(image) | |
_app_session['sts'] = None | |
_app_session['ctx'] = [] | |
_app_session['img'] = image | |
_chatbot.append(('', 'Image uploaded successfully, you can talk to me now')) | |
return _chatbot, _app_session | |
def respond(_chat_bot, _app_cfg): | |
_question = _chat_bot[-1][0] | |
print('<Question>:', _question) | |
if _app_cfg.get('ctx', None) is None: | |
_chat_bot[-1][1] = 'Please upload an image to start' | |
yield (_chat_bot, _app_cfg) | |
else: | |
_context = _app_cfg['ctx'].copy() | |
if _context: | |
_context.append({"role": "user", "content": _question}) | |
else: | |
_context = [{"role": "user", "content": _question}] | |
gen = chat(_app_cfg['img'], _context) | |
_chat_bot[-1][1] = "" | |
for _char in gen: | |
_chat_bot[-1][1] += _char | |
_context[-1]["content"] += _char | |
yield (_chat_bot, _app_cfg) | |
def request(_question, _chat_bot, _app_cfg): | |
_chat_bot.append((_question, None)) | |
return '', _chat_bot, _app_cfg | |
def regenerate_button_clicked(_question, _chat_bot, _app_cfg): | |
if len(_chat_bot) <= 1: | |
_chat_bot.append(('Regenerate', 'No question for regeneration.')) | |
return '', _chat_bot, _app_cfg | |
elif _chat_bot[-1][0] == 'Regenerate': | |
return '', _chat_bot, _app_cfg | |
else: | |
_question = _chat_bot[-1][0] | |
_chat_bot = _chat_bot[:-1] | |
_app_cfg['ctx'] = _app_cfg['ctx'][:-2] | |
return request(_question, _chat_bot, _app_cfg) | |
def clear_button_clicked(_question, _chat_bot, _app_cfg, _bt_pic): | |
_chat_bot.clear() | |
_app_cfg['sts'] = None | |
_app_cfg['ctx'] = None | |
_app_cfg['img'] = None | |
_bt_pic = None | |
return '', _chat_bot, _app_cfg, _bt_pic | |
with gr.Blocks() as demo: | |
with gr.Row(): | |
with gr.Column(scale=1, min_width=300): | |
regenerate = gr.Button(value='Regenerate', interactive=True) | |
clear = gr.Button(value='Clear', interactive=True) | |
with gr.Column(scale=3, min_width=500): | |
app_session = gr.State({'sts': None, 'ctx': None, 'img': None}) | |
bt_pic = gr.Image(label="Upload an image to start") | |
chat_bot = gr.Chatbot(label=f"Chat with {model_name}") | |
txt_message = gr.Textbox(label="Input text") | |
clear.click( | |
clear_button_clicked, | |
[txt_message, chat_bot, app_session, bt_pic], | |
[txt_message, chat_bot, app_session, bt_pic], | |
queue=False | |
) | |
txt_message.submit( | |
request, | |
[txt_message, chat_bot, app_session], | |
[txt_message, chat_bot, app_session], | |
queue=False | |
).then( | |
respond, | |
[chat_bot, app_session], | |
[chat_bot, app_session] | |
) | |
regenerate.click( | |
regenerate_button_clicked, | |
[txt_message, chat_bot, app_session], | |
[txt_message, chat_bot, app_session], | |
queue=False | |
).then( | |
respond, | |
[chat_bot, app_session], | |
[chat_bot, app_session] | |
) | |
bt_pic.upload(lambda: None, None, chat_bot, queue=False).then(upload_img, inputs=[bt_pic, chat_bot, app_session], outputs=[chat_bot, app_session]) | |
# launch | |
demo.queue() | |
demo.launch() | |