|
import os |
|
import gradio as gr |
|
import pandas as pd |
|
import plotly.express as px |
|
from apscheduler.schedulers.background import BackgroundScheduler |
|
|
|
from src.assets.text_content import TITLE, INTRODUCTION_TEXT, SINGLE_A100_TEXT, CITATION_BUTTON_LABEL, CITATION_BUTTON_TEXT |
|
from src.utils import restart_space, load_dataset_repo, make_clickable_model, make_clickable_score, num_to_str |
|
from src.assets.css_html_js import custom_css |
|
|
|
|
|
LLM_PERF_LEADERBOARD_REPO = "optimum/llm-perf-leaderboard" |
|
LLM_PERF_DATASET_REPO = "optimum/llm-perf-dataset" |
|
OPTIMUM_TOKEN = os.environ.get("OPTIMUM_TOKEN", None) |
|
|
|
COLUMNS_MAPPING = { |
|
"model": "Model π€", |
|
"backend.name": "Backend π", |
|
"backend.torch_dtype": "Load Dtype π₯", |
|
"num_parameters": "#Parameters π", |
|
"forward.peak_memory(MB)": "Peak Memory (MB) β¬οΈ", |
|
"generate.throughput(tokens/s)": "Throughput (tokens/s) β¬οΈ", |
|
"average": "Average Open LLM Score β¬οΈ", |
|
} |
|
COLUMNS_DATATYPES = ["markdown", "str", "str", |
|
"number", "number", "number", "markdown"] |
|
SORTING_COLUMN = ["Throughput (tokens/s) β¬οΈ"] |
|
|
|
|
|
llm_perf_dataset_repo = load_dataset_repo(LLM_PERF_DATASET_REPO, OPTIMUM_TOKEN) |
|
|
|
|
|
def get_benchmark_df(benchmark="1xA100-80GB"): |
|
if llm_perf_dataset_repo: |
|
llm_perf_dataset_repo.git_pull() |
|
|
|
|
|
bench_df = pd.read_csv( |
|
f"./llm-perf-dataset/reports/{benchmark}.csv") |
|
scores_df = pd.read_csv( |
|
f"./llm-perf-dataset/reports/additional_data.csv") |
|
bench_df = bench_df.merge(scores_df, on="model", how="left") |
|
|
|
return bench_df |
|
|
|
|
|
def get_benchmark_table(bench_df): |
|
|
|
|
|
bench_df = bench_df[list(COLUMNS_MAPPING.keys())] |
|
|
|
bench_df.rename(columns=COLUMNS_MAPPING, inplace=True) |
|
|
|
bench_df.sort_values(by=SORTING_COLUMN, ascending=False, inplace=True) |
|
|
|
bench_df["Model π€"] = bench_df["Model π€"].apply(make_clickable_model) |
|
bench_df["Average Open LLM Score β¬οΈ"] = bench_df["Average Open LLM Score β¬οΈ"].apply( |
|
make_clickable_score) |
|
bench_df["#Parameters π"] = bench_df["#Parameters π"].apply(num_to_str) |
|
|
|
return bench_df |
|
|
|
|
|
def get_benchmark_plot(bench_df): |
|
|
|
|
|
bench_df = bench_df[bench_df["generate.latency(s)"] < 100] |
|
|
|
fig = px.scatter( |
|
bench_df, x="generate.latency(s)", y="average", |
|
color='model_type', symbol='backend.name', size='forward.peak_memory(MB)', |
|
custom_data=['model', 'backend.name', 'backend.torch_dtype', |
|
'forward.peak_memory(MB)', 'generate.throughput(tokens/s)'], |
|
symbol_sequence=['triangle-up', 'circle'], |
|
|
|
color_discrete_sequence=px.colors.qualitative.Light24, |
|
) |
|
|
|
fig.update_layout( |
|
title={ |
|
'text': "Model Score vs. Latency vs. Memory", |
|
'y': 0.95, 'x': 0.5, |
|
'xanchor': 'center', |
|
'yanchor': 'top' |
|
}, |
|
xaxis_title="Per 1000 Tokens Latency (s)", |
|
yaxis_title="Average Open LLM Score", |
|
legend_title="Model Type and Backend", |
|
width=1200, |
|
height=600, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
) |
|
|
|
fig.update_traces( |
|
hovertemplate="<br>".join([ |
|
"Model: %{customdata[0]}", |
|
"Backend: %{customdata[1]}", |
|
"Datatype: %{customdata[2]}", |
|
"Peak Memory (MB): %{customdata[3]}", |
|
"Throughput (tokens/s): %{customdata[4]}", |
|
"Per 1000 Tokens Latency (s): %{y}", |
|
"Average Open LLM Score: %{x}", |
|
]) |
|
) |
|
|
|
return fig |
|
|
|
|
|
def filter_query(text, backends, datatypes, threshold, benchmark="1xA100-80GB"): |
|
|
|
raw_df = get_benchmark_df(benchmark=benchmark) |
|
|
|
filtered_df = raw_df[ |
|
raw_df["model"].str.lower().str.contains(text.lower()) & |
|
raw_df["backend.name"].isin(backends) & |
|
raw_df["backend.torch_dtype"].isin(datatypes) & |
|
(raw_df["average"] >= threshold) |
|
] |
|
|
|
filtered_table = get_benchmark_table(filtered_df) |
|
filtered_plot = get_benchmark_plot(filtered_df) |
|
|
|
return filtered_table, filtered_plot |
|
|
|
|
|
|
|
single_A100_df = get_benchmark_df(benchmark="1xA100-80GB") |
|
single_A100_table = get_benchmark_table(single_A100_df) |
|
single_A100_plot = get_benchmark_plot(single_A100_df) |
|
|
|
|
|
demo = gr.Blocks(css=custom_css) |
|
with demo: |
|
|
|
gr.HTML(TITLE) |
|
|
|
|
|
gr.Markdown(INTRODUCTION_TEXT, elem_classes="markdown-text") |
|
|
|
|
|
gr.HTML("<h2>Control Panel ποΈ</h2>") |
|
|
|
|
|
with gr.Row(): |
|
search_bar = gr.Textbox( |
|
label="Model π€", |
|
info="π Search for a model name", |
|
elem_id="search-bar", |
|
) |
|
backend_checkboxes = gr.CheckboxGroup( |
|
label="Backends π", |
|
choices=["pytorch", "onnxruntime"], |
|
value=["pytorch", "onnxruntime"], |
|
info="βοΈ Select the backends", |
|
elem_id="backend-checkboxes", |
|
) |
|
datatype_checkboxes = gr.CheckboxGroup( |
|
label="Datatypes π₯", |
|
choices=["float32", "float16"], |
|
value=["float32", "float16"], |
|
info="βοΈ Select the load datatypes", |
|
elem_id="datatype-checkboxes", |
|
) |
|
threshold_slider = gr.Slider( |
|
label="Average Open LLM Score π", |
|
info="ποΈ Slide to minimum Average Open LLM score", |
|
value=0.0, |
|
elem_id="threshold-slider", |
|
) |
|
|
|
with gr.Row(): |
|
submit_button = gr.Button( |
|
value="Filter π", |
|
elem_id="submit-button", |
|
) |
|
|
|
|
|
with gr.Tabs(elem_classes="tab-buttons") as tabs: |
|
with gr.TabItem("π₯οΈ A100-80GB Leaderboard π", id=0): |
|
gr.HTML(SINGLE_A100_TEXT) |
|
|
|
|
|
single_A100_leaderboard = gr.components.Dataframe( |
|
value=single_A100_table, |
|
datatype=COLUMNS_DATATYPES, |
|
headers=list(COLUMNS_MAPPING.values()), |
|
elem_id="1xA100-table", |
|
) |
|
|
|
with gr.TabItem("π₯οΈ A100-80GB Plot π", id=1): |
|
|
|
gr.HTML(SINGLE_A100_TEXT) |
|
|
|
|
|
single_A100_plotly = gr.components.Plot( |
|
value=single_A100_plot, |
|
elem_id="1xA100-plot", |
|
show_label=False, |
|
) |
|
|
|
submit_button.click( |
|
filter_query, |
|
[search_bar, backend_checkboxes, datatype_checkboxes, threshold_slider], |
|
[single_A100_leaderboard, single_A100_plotly], |
|
) |
|
|
|
with gr.Row(): |
|
with gr.Accordion("π Citation", open=False): |
|
citation_button = gr.Textbox( |
|
value=CITATION_BUTTON_TEXT, |
|
label=CITATION_BUTTON_LABEL, |
|
elem_id="citation-button", |
|
).style(show_copy_button=True) |
|
|
|
|
|
|
|
scheduler = BackgroundScheduler() |
|
scheduler.add_job(restart_space, "interval", seconds=3600, |
|
args=[LLM_PERF_LEADERBOARD_REPO, OPTIMUM_TOKEN]) |
|
scheduler.start() |
|
|
|
|
|
demo.queue(concurrency_count=40).launch() |
|
|