File size: 4,723 Bytes
fec8ab6
 
 
 
 
 
 
 
 
 
 
 
 
 
d322e37
 
fec8ab6
12d8418
fec8ab6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3429d4b
fec8ab6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12d8418
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import os
import sys
import ctypes
import pathlib
from typing import Optional, List
import enum
from pathlib import Path
import argparse
import gradio as gr

import minigpt4_library

from huggingface_hub import hf_hub_download

model_path = hf_hub_download(repo_id='maknee/minigpt4-13b-ggml', filename='minigpt4-13B-f16.bin', repo_type='dataset')
llm_model_path = hf_hub_download(repo_id='maknee/ggml-vicuna-v0-quantized', filename='ggml-vicuna-13B-v0-q5_k.bin', repo_type='dataset')

title = """<h1 align="center">MiniGPT-4.cpp Demo</h1>"""
description = """<h3>This is the demo of MiniGPT-4 with ggml (cpu only!). Upload your images and start chatting!</h3>"""
article = """<div style='display:flex; gap: 0.25rem; '><a href='https://github.com/Vision-CAIR/MiniGPT-4'><img src='https://img.shields.io/badge/Github-Code-blue'></a></div>"""

global minigpt4_chatbot
minigpt4_chatbot: minigpt4_library.MiniGPT4ChatBot

def user(message, history):
    history = history or []
    # Append the user's message to the conversation history
    history.append([message, ""])
    return "", history

def chat(history, limit: int = 1024, temp: float = 0.8, top_k: int = 40, top_p: float = 0.9, repeat_penalty: float = 1.1):
    history = history or []

    message = history[-1][0]

    history[-1][1] = ""
    for output in minigpt4_chatbot.generate(
        message,
        limit = int(limit),
        temp = float(temp),
        top_k = int(top_k),
        top_p = float(top_p),
    ):
        answer = output
        history[-1][1] += answer
        # stream the response
        yield history, history

def clear_state(history, chat_message, image):
    history = []
    minigpt4_chatbot.reset_chat()
    return history, gr.update(value=None, interactive=True), gr.update(placeholder='Upload image first', interactive=False), gr.update(value="Upload & Start Chat", interactive=True)

def upload_image(image, history):
    if image is None:
        return None, None, gr.update(interactive=True), history
    history = []
    minigpt4_chatbot.upload_image(image.convert('RGB'))
    return gr.update(interactive=False), gr.update(interactive=True, placeholder='Type and press Enter'), gr.update(value="Start Chatting", interactive=False), history

def start():
    with gr.Blocks() as demo:
        gr.Markdown(title)
        gr.Markdown(description)
        gr.Markdown(article)

        with gr.Row():
            with gr.Column(scale=0.5):
                image = gr.Image(type="pil")
                upload_button = gr.Button(value="Upload & Start Chat", interactive=True, variant="primary")

                max_tokens = gr.Slider(1, 1024, label="Max Tokens", step=1, value=128)
                temperature = gr.Slider(0.0, 1.0, label="Temperature", step=0.05, value=0.8)
                top_p = gr.Slider(0.0, 1.0, label="Top P", step=0.05, value=0.95)
                top_k = gr.Slider(0, 100, label="Top K", step=1, value=40)
                repeat_penalty = gr.Slider(0.0, 2.0, label="Repetition Penalty", step=0.1, value=1.1)

            with gr.Column():
                chatbot = gr.Chatbot(label='MiniGPT-4')
                message = gr.Textbox(label='User', placeholder='Upload image first', interactive=False)
                history = gr.State()

                with gr.Row():
                    submit = gr.Button(value="Send message", variant="secondary").style(full_width=True)
                    clear = gr.Button(value="Reset", variant="secondary").style(full_width=False)
                    # stop = gr.Button(value="Stop", variant="secondary").style(full_width=False)

        clear.click(clear_state, inputs=[history, image, message], outputs=[history, image, message, upload_button], queue=False)

        upload_button.click(upload_image, inputs=[image, history], outputs=[image, message, upload_button, history])
        
        submit_click_event = submit.click(
            fn=user, inputs=[message, history], outputs=[message, history], queue=True
        ).then(
            fn=chat, inputs=[history, max_tokens, temperature, top_p, top_k, repeat_penalty], outputs=[chatbot, history], queue=True
        )
        message_submit_event = message.submit(
            fn=user, inputs=[message, history], outputs=[message, history], queue=True
        ).then(
            fn=chat, inputs=[history, max_tokens, temperature, top_p, top_k, repeat_penalty], outputs=[chatbot, history], queue=True
        )
        # stop.click(fn=None, inputs=None, outputs=None, cancels=[submit_click_event, message_submit_event], queue=False)

    demo.launch(enable_queue=True)

minigpt4_chatbot = minigpt4_library.MiniGPT4ChatBot(model_path, llm_model_path, verbosity=minigpt4_library.Verbosity.SILENT)
start()