import gradio as gr
import pandas as pd
import plotly.express as px
FLASHATTENTIONV2_DATA = [
# open llm
"Model 🤗",
"Arch 🏛️",
"DType 📥",
"Backend 🏭",
"Params (B)",
"Open LLM Score (%)",
# deployment settings
"DType 📥",
"Backend 🏭",
"Quantization 🗜️",
# primary measurements
"Prefill Latency (s)",
"Prefill Latency (s) FlashAttentionV2",
"Decode Throughput (tokens/s)",
"Decode Throughput (tokens/s) FlashAttentionV2",
"E2E Throughput (tokens/s)",
"E2E Throughput (tokens/s) FlashAttentionV2",
# speedups
"Prefill Latency Speedup (%)",
"Decode Throughput Speedup (%)",
]
def get_fa2_df(llm_perf_df):
fa2_df = llm_perf_df.copy()
# seperate original model experiments from FlashAttentionV2 experiments
original_df = fa2_df[(fa2_df["Optimization 🛠️"] == "None") & (fa2_df["DType 📥"] == "float16")]
fa2_df = fa2_df[fa2_df["Optimization 🛠️"] == "FlashAttentionV2"]
# merge the two dataframes
fa2_df = pd.merge(
original_df,
fa2_df,
on=["Model 🤗", "Quantization 🗜️"],
suffixes=["", " FlashAttentionV2"],
)
# compute speedups
fa2_df["Prefill Latency Speedup (%)"] = (
(fa2_df["Prefill Latency (s)"] / fa2_df["Prefill Latency (s) FlashAttentionV2"]) * 100
).round(2) - 100
fa2_df["Decode Throughput Speedup (%)"] = (
(fa2_df["Decode Throughput (tokens/s) FlashAttentionV2"] / fa2_df["Decode Throughput (tokens/s)"]) * 100
).round(2) - 100
# filter speedups > 1000%
fa2_df = fa2_df[fa2_df["Prefill Latency Speedup (%)"] < 1000]
fa2_df = fa2_df[fa2_df["Decode Throughput Speedup (%)"] < 1000]
return fa2_df
def get_fa2_decode_fig(llm_perf_df):
fa2_df = get_fa2_df(llm_perf_df)
# plot
decode_fig = px.box(
fa2_df,
x="Arch 🏛️",
y="Decode Throughput Speedup (%)",
color_discrete_sequence=px.colors.qualitative.Light24,
custom_data=FLASHATTENTIONV2_DATA,
color="Quantization 🗜️",
points="all",
)
# add hover data
decode_fig.update_traces(
hovertemplate="
".join(
[f"{column}: %{{customdata[{i}]}}" for i, column in enumerate(FLASHATTENTIONV2_DATA)]
)
)
# add layout
decode_fig.update_layout(
title={
"text": "Decode Throughput Speedup per Architecture",
"y": 0.95,
"x": 0.5,
"xanchor": "center",
"yanchor": "top",
},
xaxis_title="LLM Architecture",
yaxis_title="Decode Speedup (%)",
legend_title="Quantization Scheme",
width=1200,
height=600,
)
return decode_fig
def get_fa2_prefill_fig(llm_perf_df):
fa2_df = get_fa2_df(llm_perf_df)
# plot
prefill_fig = px.box(
fa2_df,
x="Arch 🏛️",
y="Prefill Latency Speedup (%)",
color_discrete_sequence=px.colors.qualitative.Light24,
custom_data=FLASHATTENTIONV2_DATA,
color="Quantization 🗜️",
points="all",
)
# add hover data
prefill_fig.update_traces(
hovertemplate="
".join(
[f"{column}: %{{customdata[{i}]}}" for i, column in enumerate(FLASHATTENTIONV2_DATA)]
)
)
# add layout
prefill_fig.update_layout(
title={
"text": "Prefill Latency Speedup per Architecture",
"y": 0.95,
"x": 0.5,
"xanchor": "center",
"yanchor": "top",
},
xaxis_title="LLM Architecture",
yaxis_title="Prefill Speedup (%)",
legend_title="Quantization Scheme",
width=1200,
height=600,
)
return prefill_fig
def create_fa2_plots(llm_perf_df):
# descriptive text
gr.HTML("👆 Hover over the points 👆 for additional information.", elem_id="text")
# get figures
prefill_fig = get_fa2_prefill_fig(llm_perf_df)
decode_fig = get_fa2_decode_fig(llm_perf_df)
# create plots
prefill_plot = gr.components.Plot(value=prefill_fig, elem_id="plot", show_label=False)
decode_plot = gr.components.Plot(value=decode_fig, elem_id="plot", show_label=False)
return prefill_plot, decode_plot