import gradio as gr
import matplotlib.pyplot as plt
from inference import RelationsInference
from attention_viz import AttentionVisualizer
from utils import KGType, Model_Type, Data_Type
#prep
import nltk
nltk.download('popular')
#############################
# Constants
#############################
#examples = [["What's the meaning of life?", "eli5", "constraint"],
# ["boat, water, bird", "commongen", "constraint"],
# ["What flows under a bridge?", "commonsense_qa", "constraint"]]
commongen_bart = RelationsInference(
model_path='MrVicente/commonsense_bart_commongen',
kg_type=KGType.CONCEPTNET,
model_type=Model_Type.RELATIONS,
max_length=32
)
qa_bart = RelationsInference(
model_path='MrVicente/commonsense_bart_absqa',
kg_type=KGType.CONCEPTNET,
model_type=Model_Type.RELATIONS,
max_length=128
)
att_viz = AttentionVisualizer(device='cpu')
#############################
# Helper
#############################
def infer_bart(context, task_type, decoding_type_str):
if Data_Type(task_type) == Data_Type.COMMONGEN:
if decoding_type_str =='default':
response, _, _ = commongen_bart.generate_based_on_context(context, use_kg=False)
else:
response, _, _ = commongen_bart.generate_contrained_based_on_context([context], use_kg=True)
elif Data_Type(task_type) == Data_Type.ELI5:
response, _, _ = qa_bart.generate_based_on_context(context, use_kg=False)
else:
raise NotImplementedError()
return response[0]
def plot_attention(context, task_type, layer, head):
fig = plt.figure()
if Data_Type(task_type) == Data_Type.COMMONGEN:
model = commongen_bart
elif Data_Type(task_type) == Data_Type.ELI5:
model = qa_bart
else:
raise NotImplementedError()
response, examples, relations = model.prepare_context_for_visualization(context)
att_viz.plot_attn_lines_concepts_ids('Input text importance visualized',
examples,
layer, head,
relations)
return fig
#############################
# Interface
#############################
app = gr.Blocks()
with app:
gr.Markdown(
"""
# Demo
### Test Commonsense Relation-Aware BART (BART-RA) model
Tutorial:
1) Select the possible model variations and tasks;
2) Change the inputs and Click the buttons to produce results;
3) See attention visualisations, by choosing a specific layer and head;
""")
with gr.Row():
context_input = gr.Textbox(lines=2, value="What's the meaning of life?", label='Input:')
model_result_output = gr.Textbox(lines=2, label='Model result:')
with gr.Column():
task_type_choice = gr.Radio(
["eli5", "commongen"], value="eli5", label="What task do you want to try?"
)
decoding_type_choice = gr.Radio(
["default", "constraint"], value="default", label="What decoding strategy do you want to use?"
)
with gr.Row():
model_btn = gr.Button(value="See Model Results")
gr.Markdown(
"""
---
Observe Attention
"""
)
with gr.Row():
with gr.Column():
layer = gr.Slider(0, 11, 0, step=1, label="Layer")
head = gr.Slider(0, 15, 0, step=1, label="Head")
with gr.Column():
plot_output = gr.Plot()
with gr.Row():
vis_btn = gr.Button(value="See Attention Scores")
model_btn.click(fn=infer_bart, inputs=[context_input, task_type_choice, decoding_type_choice],
outputs=[model_result_output])
vis_btn.click(fn=plot_attention, inputs=[context_input, task_type_choice, layer, head], outputs=[plot_output])
if __name__ == '__main__':
app.launch()