Spaces:
Sleeping
Sleeping
| import gradio | |
| import argparse | |
| import os | |
| import boto3 | |
| import pandas as pd | |
| from copy import copy | |
| from random import choice | |
| import queue | |
| from constants import css, js_code, js_light, BANNER | |
| from utils import model_response, clear_chat | |
| from models import get_tinyllama, get_qwen2ins1b, GigaChat, response_gigachat, response_qwen2ins1b, response_tinyllama | |
| INIT_MODELS = dict() | |
| S3_SESSION = None | |
| HEADER_MD = None | |
| ABOUT_MD = None | |
| CURRENT_MODELS = queue.LifoQueue() | |
| MODEL_LIB = {'TINYLLAMA': get_tinyllama, "QWEN2INS1B": get_qwen2ins1b, "RUBASE": GigaChat.get_giga} | |
| GEN_LIB = {'TINYLLAMA': response_tinyllama, "QWEN2INS1B": response_qwen2ins1b, "RUBASE": response_gigachat} | |
| MODEL_LIST = ["TINYLLAMA", "QWEN2INS1B", "RUBASE"] | |
| css = """ | |
| #small span{ | |
| font-size: 0.7em; | |
| } | |
| """ | |
| async def model_gen( | |
| content, | |
| chat_history, | |
| model_name: str, | |
| top_p, | |
| temp, | |
| max_tokens, | |
| no_context=False | |
| ): | |
| global INIT_MODELS, S3_SESSION, GEN_LIB, MODEL_LIB | |
| model_manager(model_name, MODEL_LIB, 3) | |
| if content is None: | |
| return '', [] | |
| if len(content) == 0: | |
| return '', [] | |
| chat_history = [] if no_context else chat_history | |
| res = await model_response( | |
| content, | |
| chat_history, | |
| S3_SESSION, | |
| INIT_MODELS, | |
| GEN_LIB, | |
| model_name, | |
| {"top_p": top_p, "temperature": temp, "max_tokens": max_tokens} | |
| ) | |
| return res | |
| async def model_regen( | |
| content, | |
| chat_history, | |
| model_name: str, | |
| top_p, | |
| temp, | |
| max_tokens, | |
| no_context=False | |
| ): | |
| global INIT_MODELS, S3_SESSION, GEN_LIB, MODEL_LIB | |
| model_manager(model_name, MODEL_LIB, 3) | |
| if chat_history is None: | |
| return '', [] | |
| chat_history = chat_history[-1] if no_context else chat_history | |
| content = copy(chat_history[-1][0]) | |
| res = await model_response( | |
| content, | |
| chat_history[:-1], | |
| S3_SESSION, | |
| INIT_MODELS, | |
| GEN_LIB, | |
| model_name, | |
| {"top_p": top_p, "temperature": temp, "max_tokens": max_tokens} | |
| ) | |
| return res | |
| def model_manager( | |
| add_model, | |
| model_lib, | |
| max_models=3 | |
| ): | |
| global INIT_MODELS, CURRENT_MODELS | |
| while CURRENT_MODELS.qsize() >= max_models: | |
| model_del = CURRENT_MODELS.get() | |
| INIT_MODELS[model_del] = None | |
| CURRENT_MODELS.put(add_model) | |
| INIT_MODELS[add_model] = model_lib[add_model]() | |
| def tab_online_arena(): | |
| global S3_SESSION, GEN_LIB, MODEL_LIB, INIT_MODELS, CURRENT_MODELS, MODEL_LIST | |
| with gradio.Row(): | |
| with gradio.Column(): | |
| model_left = gradio.Dropdown(MODEL_LIST, value=choice(MODEL_LIST), interactive=True, multiselect=False, label="Left model") | |
| chatbot_left = gradio.Chatbot() | |
| with gradio.Column(): | |
| model_right = gradio.Dropdown(MODEL_LIST, value=choice(MODEL_LIST), interactive=True, multiselect=False, label="Right model") | |
| chatbot_right = gradio.Chatbot() | |
| with gradio.Row(): | |
| msg = gradio.Textbox(label='Prompt', placeholder='Put your prompt here') | |
| with gradio.Row(): | |
| both_good = gradio.Button('Both Good') | |
| left_better = gradio.Button('Left Better') | |
| right_better = gradio.Button('Right Better') | |
| both_bad = gradio.Button('Both Bad') | |
| with gradio.Row(): | |
| with gradio.Accordion("Parameters", open=False): | |
| no_context = gradio.Checkbox(label="No context", value=False) | |
| top_p = gradio.Slider(label='Top P', minimum=0, maximum=1, value=1, step=0.05, interactive=True) | |
| temp = gradio.Slider(label='Temperature', minimum=0, maximum=1, value=0.7, step=0.05, interactive=True) | |
| max_tokens = gradio.Slider(label='Max ouput tokens', minimum=1, maximum=2048, value=256, step=1, interactive=True) | |
| with gradio.Row(): | |
| clear = gradio.ClearButton([msg, chatbot_left, chatbot_right], value='Clear history') | |
| regen_left = gradio.Button(value='Regenerate left answer') | |
| regen_right = gradio.Button(value='Regenerate right answer') | |
| regen_left.click( | |
| model_regen, | |
| [msg, chatbot_left, model_left, top_p, temp, max_tokens, no_context], | |
| [msg, chatbot_left] | |
| ) | |
| regen_right.click( | |
| model_regen, | |
| [msg, chatbot_right, model_right, top_p, temp, max_tokens, no_context], | |
| [msg, chatbot_right] | |
| ) | |
| with gradio.Blocks(): | |
| model_left.change(clear_chat, [], [msg, chatbot_left]) | |
| model_right.change(clear_chat, [], [msg, chatbot_right]) | |
| msg.submit( | |
| model_gen, | |
| [msg, chatbot_left, model_left, top_p, temp, max_tokens, no_context], | |
| [msg, chatbot_left] | |
| ) | |
| msg.submit( | |
| model_gen, | |
| [msg, chatbot_right, model_right, top_p, temp, max_tokens, no_context], | |
| [msg, chatbot_right] | |
| ) | |
| def tab_leaderboard(): | |
| df = pd.DataFrame({ | |
| "Model" : ['A', 'B', 'C',], | |
| "Test 1" : [0, 1, 0], | |
| "Test 2" : [1, 0, 1,], | |
| }) | |
| # Function to apply text color | |
| def highlight_cols(x): | |
| df = x.copy() | |
| # df.loc[:, :] = 'color: purple' | |
| df[['Model']] = 'color: green' | |
| return df | |
| # Applying the style function | |
| # s = df.style.apply(highlight_cols, axis = None) | |
| # Displaying the styled dataframe in Gradio | |
| with gradio.TabItem("Autogen Metrics", id=0): | |
| with gradio.Blocks() as demo: | |
| gradio.DataFrame(df) | |
| with gradio.TabItem("Autometrics", id=1): | |
| with gradio.Blocks() as demo: | |
| gradio.DataFrame(df) | |
| with gradio.TabItem("SBS metrics", id=2): | |
| with gradio.Blocks() as demo: | |
| gradio.DataFrame(df) | |
| with gradio.TabItem("Arena ELO rating", id=3): | |
| with gradio.Blocks() as demo: | |
| gradio.DataFrame(df) | |
| def tab_offline_arena(): | |
| global MODEL_LIST | |
| with gradio.Row(): | |
| with gradio.Column(scale=1): | |
| with gradio.Accordion("Choose models to sample from", open=False): | |
| model_options = MODEL_LIST | |
| selected_models = gradio.CheckboxGroup(model_options, info="", value=model_options, show_label=False, interactive=True) | |
| clear_button = gradio.Button("Clear", scale=1) | |
| # clear the selected_models | |
| clear_button.click(lambda: {selected_models: {"value": [], "__type__": "update"}}, inputs=[], outputs=[selected_models]) | |
| with gradio.Column(scale=1): | |
| with gradio.Accordion("Choose task types to sample from", open=False): | |
| select_tasks = gradio.CheckboxGroup(['Task 1', "Task 2", "Task 3"], info="", value=['Task 1', "Task 2", "Task 3"], show_label=False, interactive=True) | |
| clear_task_button = gradio.Button("Clear", scale=1) | |
| # clear the select_tasks | |
| clear_task_button.click(lambda: {select_tasks: {"value": [], "__type__": "update"}}, inputs=[], outputs=[select_tasks]) | |
| btn_show_history = gradio.Button("Click to get sample and models' ouputs") | |
| with gradio.Column(scale=1): | |
| with gradio.Accordion("Choose criteria to sample", open=False): | |
| with gradio.Row(): | |
| with gradio.Tab("Task 1"): | |
| select_criteria_1 = gradio.CheckboxGroup(['Criterion 1', "Criterion 2", "Criterion 3"], info="", value=['Criterion 1', "Criterion 2", "Criterion 3"], show_label=False, interactive=True) | |
| with gradio.Tab("Task 2"): | |
| select_criteria_2 = gradio.CheckboxGroup(['Criterion 1', "Criterion 2", "Criterion 3"], info="", value=['Criterion 1', "Criterion 2", "Criterion 3"], show_label=False, interactive=True) | |
| with gradio.Tab("Task 3"): | |
| select_criteria_3 = gradio.CheckboxGroup(['Criterion 1', "Criterion 2", "Criterion 3"], info="", value=['Criterion 1', "Criterion 2", "Criterion 3"], show_label=False, interactive=True) | |
| clear_criteria_button = gradio.Button("Clear", scale=1) | |
| # clear the select_tasks | |
| clear_criteria_button.click(lambda: {select_criteria_1: {"value": [], "__type__": "update"}, | |
| select_criteria_2: {"value": [], "__type__": "update"}, | |
| select_criteria_3: {"value": [], "__type__": "update"}}, | |
| inputs=[], outputs=[select_criteria_1, select_criteria_2, select_criteria_3]) | |
| chatbot_data = [['hey', 'Hey!'], ["are we testing something?", None]] | |
| text_data = ["Are we?", "Indeed we are."] | |
| eval_text = '1. Twist it\n2. Bop it\n3. Crank it' | |
| with gradio.Accordion("History", open=False) as acc_history: | |
| with gradio.Row(): | |
| with gradio.Column(): | |
| pass | |
| with gradio.Column(scale=0.8): | |
| chatbot_history = gradio.Chatbot(container=True, elem_id="small") | |
| with gradio.Column(): | |
| pass | |
| with gradio.Row(): | |
| model_a = gradio.Text(label='Model A') | |
| model_b = gradio.Text(label='Model B') | |
| with gradio.Row(): | |
| eval_guide = gradio.Text('Get samples and outputs in order to generate guide', label='Evaluation guide') | |
| with gradio.Row(): | |
| both_good = gradio.Button('Both Good') | |
| left_better = gradio.Button('Left Better') | |
| right_better = gradio.Button('Right Better') | |
| both_bad = gradio.Button('Both Bad') | |
| with gradio.Row(): | |
| with gradio.Column(): | |
| reason = gradio.Textbox(label='Reasoning', placeholder='Put your reasoning here...', lines=5) | |
| with gradio.Column(): | |
| gradio.Textbox(value='You have chosen: None', interactive=False, show_label=False) | |
| submit_next = gradio.Button("Submit your evaluation and get next") | |
| skip_next = gradio.Button("Skip this example and get next one") | |
| btn_show_history.click(lambda: (gradio.Accordion("History", open=True), chatbot_data, text_data[0], text_data[1], eval_text), inputs=[], outputs=[acc_history, chatbot_history, model_a, model_b, eval_guide]) | |
| def build_demo(): | |
| with gradio.Blocks(theme=gradio.themes.Soft(text_size=gradio.themes.sizes.text_lg), css=css) as demo: # , css=css, js=js_light | |
| gradio.HTML(BANNER, elem_id="banner") | |
| gradio.Markdown(HEADER_MD) | |
| with gradio.Tabs() as tabs: | |
| with gradio.TabItem("πΌ MERA leaderboard", id=0): | |
| tab_leaderboard() | |
| with gradio.TabItem("π SBS by categories and criteria", id=1): | |
| tab_offline_arena() | |
| with gradio.TabItem("π₯ Model arena", id=2): | |
| tab_online_arena() | |
| # _tab_explore() | |
| with gradio.TabItem("πͺ About MERA", id=3): | |
| gradio.Markdown(ABOUT_MD) | |
| return demo | |
| if __name__ == "__main__": | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument("--share", action="store_true") | |
| # parser.add_argument("--bench_table", help="Path to MERA table", default="data_dir/MERA_jun2024.jsonl") | |
| args = parser.parse_args() | |
| # data_load(args.result_file) | |
| # TYPES = ["number", "markdown", "number"] | |
| with open("header.md", "r") as f: | |
| HEADER_MD = f.read() | |
| with open("about.md", "r") as f: | |
| ABOUT_MD = f.read() | |
| try: | |
| session = boto3.session.Session() | |
| S3_SESSION = session.client( | |
| service_name='s3', | |
| endpoint_url=os.getenv('S3_ENDPOINT'), | |
| aws_access_key_id=os.getenv('S3_ACCESS_KEY'), | |
| aws_secret_access_key=os.getenv('S3_SECRET_KEY'), | |
| ) | |
| except: | |
| print('Failed to start s3 session') | |
| app = build_demo() | |
| app.launch(share=args.share, height=3000, width="110%", allowed_paths=["."]) # share=args.share | |
| # demo = gradio.Interface(fn=gen, inputs="text", outputs="text") | |
| # demo.launch() | |