|
from collections import Counter |
|
from streamlit_echarts import st_echarts |
|
import numpy as np |
|
import pandas as pd |
|
import streamlit as st |
|
import plotly.figure_factory as ff |
|
from plotly import graph_objs as go |
|
import plotly.express as px |
|
from statistics import median |
|
|
|
colors = { |
|
"blue": "#5470c6", |
|
"orange": "#FF7F0E", |
|
"green": "#94cc74", |
|
"saffron_mango": "#fac858", |
|
"red": "#ee6666", |
|
"light_blue": "#73c0de", |
|
"ocean_green": "#3ba272", |
|
} |
|
device_colors = { |
|
"x86": colors["blue"], |
|
"nvidia": colors["green"], |
|
"groq": colors["orange"], |
|
} |
|
|
|
|
|
class StageCount: |
|
def __init__(self, df: pd.DataFrame) -> None: |
|
self.all_models = len(df) |
|
self.base_onnx = int(np.sum(df["base_onnx"])) |
|
self.optimized_onnx = int(np.sum(df["optimized_onnx"])) |
|
self.all_ops_supported = int(np.sum(df["all_ops_supported"])) |
|
self.fp16_onnx = int(np.sum(df["fp16_onnx"])) |
|
self.compiles = int(np.sum(df["compiles"])) |
|
self.assembles = int(np.sum(df["assembles"])) |
|
|
|
|
|
class DeviceStageCount: |
|
def __init__(self, df: pd.DataFrame) -> None: |
|
self.all_models = len(df) |
|
self.base_onnx = int(np.sum(df["onnx_exported"])) |
|
self.optimized_onnx = int(np.sum(df["onnx_optimized"])) |
|
self.fp16_onnx = int(np.sum(df["onnx_converted"])) |
|
self.x86 = df.loc[df.x86_latency != "-", "x86_latency"].count() |
|
self.nvidia = df.loc[df.nvidia_latency != "-", "nvidia_latency"].count() |
|
self.groq = df.loc[ |
|
df.groq_estimated_latency != "-", "groq_estimated_latency" |
|
].count() |
|
|
|
|
|
def stages_count_summary(current_df: pd.DataFrame, prev_df: pd.DataFrame) -> None: |
|
""" |
|
Show count of how many models compile, assemble, etc |
|
""" |
|
current = StageCount(current_df) |
|
prev = StageCount(prev_df) |
|
|
|
kpi = st.columns(7) |
|
|
|
kpi[0].metric( |
|
label="All models", |
|
value=current.all_models, |
|
delta=current.all_models - prev.all_models, |
|
) |
|
|
|
kpi[1].metric( |
|
label="Converts to ONNX", |
|
value=current.base_onnx, |
|
delta=current.base_onnx - prev.base_onnx, |
|
) |
|
|
|
kpi[2].metric( |
|
label="Optimizes ONNX file", |
|
value=current.optimized_onnx, |
|
delta=current.optimized_onnx - prev.optimized_onnx, |
|
) |
|
|
|
kpi[3].metric( |
|
label="Supports all ops", |
|
value=current.all_ops_supported, |
|
delta=current.all_ops_supported - prev.all_ops_supported, |
|
) |
|
|
|
kpi[4].metric( |
|
label="Converts to FP16", |
|
value=current.fp16_onnx, |
|
delta=current.fp16_onnx - prev.fp16_onnx, |
|
) |
|
|
|
kpi[5].metric( |
|
label="Compiles", |
|
value=current.compiles, |
|
delta=current.compiles - prev.compiles, |
|
) |
|
|
|
kpi[6].metric( |
|
label="Assembles", |
|
value=current.assembles, |
|
delta=current.assembles - prev.assembles, |
|
) |
|
|
|
|
|
sk_val = { |
|
"All models": "100%", |
|
"Converts to ONNX": str(int(100 * current.base_onnx / current.all_models)) |
|
+ "%", |
|
"Optimizes ONNX file": str( |
|
int(100 * current.optimized_onnx / current.all_models) |
|
) |
|
+ "%", |
|
"Supports all ops": str( |
|
int(100 * current.all_ops_supported / current.all_models) |
|
) |
|
+ "%", |
|
"Converts to FP16": str(int(100 * current.fp16_onnx / current.all_models)) |
|
+ "%", |
|
"Compiles": str(int(100 * current.compiles / current.all_models)) + "%", |
|
"Assembles": str(int(100 * current.assembles / current.all_models)) + "%", |
|
} |
|
option = { |
|
"series": { |
|
"type": "sankey", |
|
"animationDuration": 1, |
|
"top": "0%", |
|
"bottom": "20%", |
|
"left": "0%", |
|
"right": "13.5%", |
|
"darkMode": "true", |
|
"nodeWidth": 2, |
|
"textStyle": {"fontSize": 16}, |
|
"lineStyle": {"curveness": 0}, |
|
"layoutIterations": 0, |
|
"layout": "none", |
|
"emphasis": {"focus": "adjacency"}, |
|
"data": [ |
|
{ |
|
"name": "All models", |
|
"value": sk_val["All models"], |
|
"itemStyle": {"color": "white", "borderColor": "white"}, |
|
}, |
|
{ |
|
"name": "Converts to ONNX", |
|
"value": sk_val["Converts to ONNX"], |
|
"itemStyle": {"color": "white", "borderColor": "white"}, |
|
}, |
|
{ |
|
"name": "Optimizes ONNX file", |
|
"value": sk_val["Optimizes ONNX file"], |
|
"itemStyle": {"color": "white", "borderColor": "white"}, |
|
}, |
|
{ |
|
"name": "Supports all ops", |
|
"value": sk_val["Supports all ops"], |
|
"itemStyle": {"color": "white", "borderColor": "white"}, |
|
}, |
|
{ |
|
"name": "Converts to FP16", |
|
"value": sk_val["Converts to FP16"], |
|
"itemStyle": {"color": "white", "borderColor": "white"}, |
|
}, |
|
{ |
|
"name": "Compiles", |
|
"value": sk_val["Compiles"], |
|
"itemStyle": {"color": "white", "borderColor": "white"}, |
|
}, |
|
{ |
|
"name": "Assembles", |
|
"value": sk_val["Assembles"], |
|
"itemStyle": {"color": "white", "borderColor": "white"}, |
|
}, |
|
], |
|
"label": { |
|
"position": "insideTopLeft", |
|
"borderWidth": 0, |
|
"fontSize": 16, |
|
"color": "white", |
|
"textBorderWidth": 0, |
|
"formatter": "{c}", |
|
}, |
|
"links": [ |
|
{ |
|
"source": "All models", |
|
"target": "Converts to ONNX", |
|
"value": current.base_onnx, |
|
}, |
|
{ |
|
"source": "Converts to ONNX", |
|
"target": "Optimizes ONNX file", |
|
"value": current.optimized_onnx, |
|
}, |
|
{ |
|
"source": "Optimizes ONNX file", |
|
"target": "Supports all ops", |
|
"value": current.all_ops_supported, |
|
}, |
|
{ |
|
"source": "Supports all ops", |
|
"target": "Converts to FP16", |
|
"value": current.fp16_onnx, |
|
}, |
|
{ |
|
"source": "Converts to FP16", |
|
"target": "Compiles", |
|
"value": current.compiles, |
|
}, |
|
{ |
|
"source": "Compiles", |
|
"target": "Assembles", |
|
"value": current.assembles, |
|
}, |
|
], |
|
} |
|
} |
|
st_echarts( |
|
options=option, |
|
height="50px", |
|
) |
|
|
|
|
|
def workload_origin(df: pd.DataFrame) -> None: |
|
""" |
|
Show pie chart that groups models by author |
|
""" |
|
all_authors = list(df.loc[:, "author"]) |
|
author_count = {i: all_authors.count(i) for i in all_authors} |
|
all_models = len(df) |
|
|
|
options = { |
|
"darkMode": "true", |
|
"textStyle": {"fontSize": 16}, |
|
"tooltip": {"trigger": "item"}, |
|
"series": [ |
|
{ |
|
"name": "Name of corpus:", |
|
"type": "pie", |
|
"radius": ["70%", "70%"], |
|
"data": [ |
|
{"value": author_count[k], "name": k} for k in author_count.keys() |
|
], |
|
"label": { |
|
"formatter": "{b}\n{d}%", |
|
}, |
|
}, |
|
{ |
|
|
|
"name": "Name of corpus:", |
|
"type": "pie", |
|
"radius": ["50%", "70%"], |
|
"data": [ |
|
{"value": author_count[k], "name": k} for k in author_count.keys() |
|
], |
|
"emphasis": { |
|
"itemStyle": { |
|
"shadowBlur": 10, |
|
"shadowOffsetX": 0, |
|
"shadowColor": "rgba(0, 0, 0, 0.5)", |
|
} |
|
}, |
|
"label": { |
|
"position": "inner", |
|
"formatter": "{c}", |
|
"color": "black", |
|
"textBorderWidth": 0, |
|
}, |
|
}, |
|
{ |
|
|
|
"name": "Total number of models:", |
|
"type": "pie", |
|
"radius": ["0%", "0%"], |
|
"data": [{"value": all_models, "name": "Total"}], |
|
"silent": "true", |
|
"label": { |
|
"position": "inner", |
|
"formatter": "{c}", |
|
"color": "white", |
|
"fontSize": 30, |
|
"textBorderWidth": 0, |
|
}, |
|
}, |
|
], |
|
} |
|
st_echarts( |
|
options=options, |
|
height="400px", |
|
) |
|
|
|
|
|
def parameter_histogram(df: pd.DataFrame, show_assembled=True) -> None: |
|
|
|
all_models = [float(x) / 1000000 for x in df["params"] if x != "-"] |
|
|
|
hist_data = [] |
|
group_labels = [] |
|
|
|
if all_models != []: |
|
hist_data.append(all_models) |
|
if show_assembled: |
|
group_labels.append("Models we tried compiling") |
|
else: |
|
group_labels.append("All models") |
|
|
|
if show_assembled: |
|
assembled_models = df[ |
|
df["assembles"] == True |
|
] |
|
assembled_models = [ |
|
float(x) / 1000000 for x in assembled_models["params"] if x != "-" |
|
] |
|
if assembled_models != []: |
|
hist_data.append(assembled_models) |
|
group_labels.append("Assembled models") |
|
|
|
if hist_data: |
|
fig = ff.create_distplot( |
|
hist_data, |
|
group_labels, |
|
bin_size=25, |
|
histnorm="", |
|
colors=list(colors.values()), |
|
curve_type="normal", |
|
) |
|
fig.layout.update(xaxis_title="Parameters in millions") |
|
fig.layout.update(yaxis_title="count") |
|
fig.update_xaxes(range=[1, 1000]) |
|
|
|
st.plotly_chart(fig, use_container_width=True) |
|
|
|
else: |
|
st.markdown( |
|
"""At least one model needs to reach the compiler to show this graph 😅""" |
|
) |
|
|
|
|
|
def speedup_bar_chart_legacy(df: pd.DataFrame) -> None: |
|
""" |
|
This function will be removed when we start getting CPU numbers for the daily tests |
|
""" |
|
|
|
|
|
assembles = np.sum(df["assembles"]) |
|
df = df[["model_name", "groq_nvidia_compute_ratio", "groq_nvidia_e2e_ratio"]] |
|
df = df.sort_values(by=["model_name"]) |
|
df = df[(df.groq_nvidia_compute_ratio != "-")] |
|
df = df[(df.groq_nvidia_e2e_ratio != "-")] |
|
df["groq_nvidia_compute_ratio"] = df["groq_nvidia_compute_ratio"].astype(float) |
|
df["groq_nvidia_e2e_ratio"] = df["groq_nvidia_e2e_ratio"].astype(float) |
|
|
|
if len(df) == 0 and assembles > 0: |
|
st.markdown( |
|
( |
|
"We do not have GPU numbers for the model(s) mapped to the GroqChip." |
|
" This is potentially due to lack of out-of-the-box TensorRT support." |
|
) |
|
) |
|
elif assembles == 0: |
|
st.markdown( |
|
"Nothing to show here since no models have been successfully assembled." |
|
) |
|
else: |
|
data = [ |
|
go.Bar( |
|
x=df["model_name"], |
|
y=df["groq_nvidia_compute_ratio"], |
|
name="Compute only", |
|
), |
|
go.Bar( |
|
x=df["model_name"], |
|
y=df["groq_nvidia_e2e_ratio"], |
|
name="Compute + estimated I/O", |
|
), |
|
] |
|
|
|
layout = go.Layout( |
|
barmode="overlay", |
|
yaxis_title="Speedup compared to A100 GPU", |
|
colorway=list(colors.values()), |
|
) |
|
|
|
fig = dict(data=data, layout=layout) |
|
st.plotly_chart(fig, use_container_width=True) |
|
|
|
st.markdown( |
|
( |
|
"<sup>*</sup>Estimated I/O does NOT include delays caused by Groq's runtime. " |
|
"See FAQ for details." |
|
), |
|
unsafe_allow_html=True, |
|
) |
|
|
|
|
|
def speedup_text_summary_legacy(df: pd.DataFrame) -> None: |
|
|
|
""" |
|
This function will be removed when we start getting CPU numbers for the daily tests |
|
""" |
|
|
|
|
|
df = df[(df.groq_nvidia_compute_ratio != "-")] |
|
df = df[(df.groq_nvidia_e2e_ratio != "-")] |
|
df["groq_nvidia_compute_ratio"] = df["groq_nvidia_compute_ratio"].astype(float) |
|
df["groq_nvidia_e2e_ratio"] = df["groq_nvidia_e2e_ratio"].astype(float) |
|
|
|
|
|
st.markdown( |
|
f"""<br><br><br><br><br><br> |
|
<p style="font-family:sans-serif; font-size: 20px;text-align: center;">Average speedup of GroqChip™ considering compute only:</p> |
|
<p style="font-family:sans-serif; color:{colors["blue"]}; font-size: 26px;text-align: center;"> {round(df["groq_nvidia_compute_ratio"].mean(),2)}x</p> |
|
<p style="font-family:sans-serif; color:{colors["blue"]}; font-size: 20px;text-align: center;"> min {round(df["groq_nvidia_compute_ratio"].min(),2)}x; median {round(median(df["groq_nvidia_compute_ratio"]),2)}x; max {round(df["groq_nvidia_compute_ratio"].max(),2)}x</p> |
|
<br><br> |
|
<p style="font-family:sans-serif; font-size: 20px;text-align: center;">Average speedup of GroqChip™ considering compute + estimated I/O<sup>*</sup>:</p> |
|
<p style="font-family:sans-serif; color:{colors["orange"]}; font-size: 26px;text-align: center;"> {round(df["groq_nvidia_e2e_ratio"].mean(),2)}x</p> |
|
<p style="font-family:sans-serif; color:{colors["orange"]}; font-size: 20px;text-align: center;"> min {round(df["groq_nvidia_e2e_ratio"].min(),2)}x; median {round(median(df["groq_nvidia_e2e_ratio"]),2)}x; max {round(df["groq_nvidia_e2e_ratio"].max(),2)}x</p>""", |
|
unsafe_allow_html=True, |
|
) |
|
|
|
|
|
def process_latency_data(df, baseline): |
|
df = df[["model_name", "groq_estimated_latency", "nvidia_latency", "x86_latency"]] |
|
df = df.rename(columns={"groq_estimated_latency": "groq_latency"}) |
|
df = df.sort_values(by=["model_name"]) |
|
|
|
df.x86_latency.replace(["-"], [float("inf")], inplace=True) |
|
df.nvidia_latency.replace(["-"], [float("inf")], inplace=True) |
|
df.groq_latency.replace(["-"], [float("inf")], inplace=True) |
|
|
|
df["groq_latency"] = df["groq_latency"].astype(float) |
|
df["nvidia_latency"] = df["nvidia_latency"].astype(float) |
|
df["x86_latency"] = df["x86_latency"].astype(float) |
|
|
|
df["groq_compute_ratio"] = df[f"{baseline}_latency"] / df["groq_latency"] |
|
df["nvidia_compute_ratio"] = df[f"{baseline}_latency"] / df["nvidia_latency"] |
|
df["x86_compute_ratio"] = df[f"{baseline}_latency"] / df["x86_latency"] |
|
|
|
return df |
|
|
|
|
|
def speedup_bar_chart(df: pd.DataFrame, baseline) -> None: |
|
|
|
if len(df) == 0: |
|
st.markdown( |
|
("Nothing to show here since no models have been successfully benchmarked.") |
|
) |
|
else: |
|
df = process_latency_data(df, baseline) |
|
bar_chart = {} |
|
bar_chart["nvidia"] = go.Bar( |
|
x=df["model_name"], |
|
y=df["nvidia_compute_ratio"], |
|
name="NVIDIA A100", |
|
) |
|
bar_chart["groq"] = go.Bar( |
|
x=df["model_name"], |
|
y=df["groq_compute_ratio"], |
|
name="GroqChip 1", |
|
) |
|
bar_chart["x86"] = go.Bar( |
|
x=df["model_name"], |
|
y=df["x86_compute_ratio"], |
|
name="Intel(R) Xeon(R)", |
|
) |
|
|
|
|
|
plot_sequence = list(bar_chart.keys()) |
|
plot_sequence.insert(0, plot_sequence.pop(plot_sequence.index(baseline))) |
|
|
|
|
|
data = [bar_chart[device_type] for device_type in plot_sequence] |
|
color_sequence = [device_colors[device_type] for device_type in plot_sequence] |
|
|
|
layout = go.Layout( |
|
barmode="overlay", |
|
legend={ |
|
"orientation": "h", |
|
"xanchor": "center", |
|
"x": 0.5, |
|
"y": 1.2, |
|
}, |
|
yaxis_title="Latency Speedup", |
|
colorway=color_sequence, |
|
height=500, |
|
) |
|
|
|
fig = dict(data=data, layout=layout) |
|
st.plotly_chart(fig, use_container_width=True) |
|
|
|
st.markdown( |
|
"<sup>*</sup>Estimated I/O does NOT include delays caused by Groq's runtime.", |
|
unsafe_allow_html=True, |
|
) |
|
|
|
|
|
def kpi_to_markdown( |
|
compute_ratio, device, num_baseline_models, is_baseline=False, color="blue" |
|
): |
|
|
|
if is_baseline: |
|
title = f"""<br><br> |
|
<p style="font-family:sans-serif; font-size: 20px;text-align: center;">Median {device} Acceleration ({len(compute_ratio)} models):</p>""" |
|
return ( |
|
title |
|
+ f"""<p style="font-family:sans-serif; color:{colors[color]}; font-size: 26px;text-align: center;"> {1}x (Baseline)</p>""" |
|
) |
|
|
|
title = f"""<br><br> |
|
<p style="font-family:sans-serif; font-size: 20px;text-align: center;">Median {device} Acceleration ({len(compute_ratio)}/{num_baseline_models} models):</p>""" |
|
|
|
if len(compute_ratio) > 0: |
|
kpi_min, kpi_median, kpi_max = ( |
|
round(compute_ratio.min(), 2), |
|
round(median(compute_ratio), 2), |
|
round(compute_ratio.max(), 2), |
|
) |
|
else: |
|
kpi_min, kpi_median, kpi_max = 0, 0, 0 |
|
|
|
return ( |
|
title |
|
+ f"""<p style="font-family:sans-serif; color:{colors[color]}; font-size: 26px;text-align: center;"> {kpi_median}x</p> |
|
<p style="font-family:sans-serif; color:{colors[color]}; font-size: 20px;text-align: center;"> min {kpi_min}x; max {kpi_max}x</p> |
|
""" |
|
) |
|
|
|
|
|
def speedup_text_summary(df: pd.DataFrame, baseline) -> None: |
|
|
|
df = process_latency_data(df, baseline) |
|
|
|
|
|
|
|
df = df[(df[baseline + "_latency"] != float("inf"))] |
|
|
|
|
|
|
|
x86_compute_ratio = df["x86_compute_ratio"].to_numpy() |
|
nvidia_compute_ratio = df["nvidia_compute_ratio"].to_numpy() |
|
groq_compute_ratio = df["groq_compute_ratio"].to_numpy() |
|
x86_compute_ratio = x86_compute_ratio[x86_compute_ratio != 0] |
|
nvidia_compute_ratio = nvidia_compute_ratio[nvidia_compute_ratio != 0] |
|
groq_compute_ratio = groq_compute_ratio[groq_compute_ratio != 0] |
|
|
|
num_baseline_models = len(df[f"{baseline}_compute_ratio"]) |
|
x86_text = kpi_to_markdown( |
|
x86_compute_ratio, |
|
device="Intel(R) Xeon(R) X40 CPU @ 2.00GHz", |
|
num_baseline_models=num_baseline_models, |
|
color="blue", |
|
is_baseline=baseline == "x86", |
|
) |
|
groq_text = kpi_to_markdown( |
|
groq_compute_ratio, |
|
device="GroqChip 1 Estimated", |
|
num_baseline_models=num_baseline_models, |
|
color="orange", |
|
is_baseline=baseline == "groq", |
|
) |
|
nvidia_text = kpi_to_markdown( |
|
nvidia_compute_ratio, |
|
device="NVIDIA A100-PCIE-40GB", |
|
num_baseline_models=num_baseline_models, |
|
color="green", |
|
is_baseline=baseline == "nvidia", |
|
) |
|
|
|
cols = st.columns(3) |
|
with cols[0]: |
|
st.markdown(f"""{x86_text}""", unsafe_allow_html=True) |
|
with cols[1]: |
|
st.markdown(f"""{nvidia_text}""", unsafe_allow_html=True) |
|
with cols[2]: |
|
st.markdown(f"""{groq_text}""", unsafe_allow_html=True) |
|
|
|
|
|
def compiler_errors(df: pd.DataFrame) -> None: |
|
compiler_errors = df[df["compiler_error"] != "-"]["compiler_error"] |
|
compiler_errors = Counter(compiler_errors) |
|
if len(compiler_errors) > 0: |
|
compiler_errors = pd.DataFrame.from_dict( |
|
compiler_errors, orient="index" |
|
).reset_index() |
|
compiler_errors = compiler_errors.set_axis( |
|
["error", "count"], axis=1, inplace=False |
|
) |
|
compiler_errors["error"] = [ce[:80] for ce in compiler_errors["error"]] |
|
fig = px.bar( |
|
compiler_errors, |
|
x="count", |
|
y="error", |
|
orientation="h", |
|
height=400, |
|
) |
|
fig.update_traces(marker_color=colors["blue"]) |
|
|
|
st.plotly_chart(fig, use_container_width=True) |
|
else: |
|
st.markdown("""No compiler errors found :tada:""") |
|
|
|
|
|
def io_fraction(df: pd.DataFrame) -> None: |
|
fig = go.Figure() |
|
for chips in ["1", "2", "4", "8"]: |
|
tmp = df[[model_entry == chips for model_entry in df["groq_chips_used"]]] |
|
if len(tmp) == 0: |
|
continue |
|
tmp = tmp[[model_entry != "-" for model_entry in tmp["groq_compute_latency"]]] |
|
if len(tmp) == 0: |
|
continue |
|
tmp = tmp[[model_entry != "-" for model_entry in tmp["groq_latency"]]] |
|
if len(tmp) == 0: |
|
continue |
|
print(len(tmp)) |
|
compute_latency = tmp["groq_compute_latency"].astype("float") |
|
e2e_latency = tmp["groq_latency"].astype("float") |
|
|
|
io_fraction = 1 - compute_latency / e2e_latency |
|
if chips == "1": |
|
name = f"{chips} GroqChip ({len(tmp)} models)" |
|
else: |
|
name = f"{chips} GroqChips \n({len(tmp)} models)" |
|
fig.add_trace( |
|
go.Box( |
|
y=io_fraction, |
|
name=name, |
|
) |
|
) |
|
|
|
fig.layout.update(xaxis_title="Models compiled for X GroqChip Processors") |
|
fig.layout.update(yaxis_title="Estimated fraction of time (in %) spent on I/O") |
|
fig.layout.update(colorway=list(colors.values())) |
|
st.plotly_chart(fig, use_container_width=True) |
|
|
|
|
|
def results_table(df: pd.DataFrame): |
|
model_name = st.text_input("", placeholder="Filter model by name") |
|
if model_name != "": |
|
df = df[[model_name in x for x in df["Model Name"]]] |
|
|
|
st.dataframe(df, height=min((len(df) + 1) * 35, 35 * 21)) |
|
|
|
|
|
def device_funnel_metrics(num_models: int, num_total_models: int) -> str: |
|
""" |
|
Calculates the percentage between models and total_models |
|
Avoids ZeroDivisionError when dividend is zero |
|
""" |
|
models_message = f"{num_models} model" |
|
models_message = models_message + "s" if num_models != 1 else models_message |
|
percentage_message = "" |
|
if num_total_models > 0: |
|
model_ratio = num_models / num_total_models |
|
if model_ratio < 0.01 and model_ratio != 0: |
|
percentage_message = " - < 1%" |
|
else: |
|
percentage_message = f" - {int(100*num_models / num_total_models)}%" |
|
return f"{models_message}{percentage_message}" |
|
|
|
|
|
def device_funnel(df: pd.DataFrame) -> None: |
|
""" |
|
Show count of how many models compile, assemble, etc |
|
""" |
|
summ = DeviceStageCount(df) |
|
|
|
stages = [ |
|
"All models", |
|
"Export to ONNX", |
|
"Optimize ONNX file", |
|
"Convert to FP16", |
|
"Acquire Performance", |
|
] |
|
cols = st.columns(len(stages)) |
|
|
|
for idx, stage in enumerate(stages): |
|
with cols[idx]: |
|
st.markdown(stage) |
|
|
|
|
|
sk_val = { |
|
"All models": device_funnel_metrics(summ.all_models, summ.all_models), |
|
"Converts to ONNX": device_funnel_metrics(summ.base_onnx, summ.all_models), |
|
"Optimizes ONNX file": device_funnel_metrics( |
|
summ.optimized_onnx, summ.all_models |
|
), |
|
"Converts to FP16": device_funnel_metrics(summ.fp16_onnx, summ.all_models), |
|
"Acquires Nvidia Perf": device_funnel_metrics(summ.nvidia, summ.all_models) |
|
+ " (Nvidia)", |
|
"Acquires Groq Perf": device_funnel_metrics(summ.groq, summ.all_models) |
|
+ " (Groq)", |
|
"Acquires x86 Perf": device_funnel_metrics(summ.x86, summ.all_models) |
|
+ " (x86)", |
|
} |
|
|
|
|
|
|
|
default_bar_size = 1 |
|
target_combined_height = max(default_bar_size, summ.fp16_onnx) |
|
device_bar_size = target_combined_height / 3 |
|
|
|
option = { |
|
"series": { |
|
"type": "sankey", |
|
"animationDuration": 1, |
|
"top": "0%", |
|
"bottom": "20%", |
|
"left": "0%", |
|
"right": "19%", |
|
"darkMode": "true", |
|
"nodeWidth": 2, |
|
"textStyle": {"fontSize": 16}, |
|
"nodeAlign": "left", |
|
"lineStyle": {"curveness": 0}, |
|
"layoutIterations": 0, |
|
"nodeGap": 12, |
|
"layout": "none", |
|
"emphasis": {"focus": "adjacency"}, |
|
"data": [ |
|
{ |
|
"name": "All models", |
|
"value": sk_val["All models"], |
|
"itemStyle": {"color": "white", "borderColor": "white"}, |
|
}, |
|
{ |
|
"name": "Converts to ONNX", |
|
"value": sk_val["Converts to ONNX"], |
|
"itemStyle": {"color": "white", "borderColor": "white"}, |
|
}, |
|
{ |
|
"name": "Optimizes ONNX file", |
|
"value": sk_val["Optimizes ONNX file"], |
|
"itemStyle": {"color": "white", "borderColor": "white"}, |
|
}, |
|
{ |
|
"name": "Converts to FP16", |
|
"value": sk_val["Converts to FP16"], |
|
"itemStyle": {"color": "white", "borderColor": "white"}, |
|
}, |
|
{ |
|
"name": "Acquires Nvidia Perf", |
|
"value": sk_val["Acquires Nvidia Perf"], |
|
"itemStyle": { |
|
"color": device_colors["nvidia"], |
|
"borderColor": device_colors["nvidia"], |
|
}, |
|
}, |
|
{ |
|
"name": "Acquires Groq Perf", |
|
"value": sk_val["Acquires Groq Perf"], |
|
"itemStyle": { |
|
"color": device_colors["groq"], |
|
"borderColor": device_colors["groq"], |
|
}, |
|
}, |
|
{ |
|
"name": "Acquires x86 Perf", |
|
"value": sk_val["Acquires x86 Perf"], |
|
"itemStyle": { |
|
"color": device_colors["x86"], |
|
"borderColor": device_colors["x86"], |
|
}, |
|
}, |
|
], |
|
"label": { |
|
"position": "insideTopLeft", |
|
"borderWidth": 0, |
|
"fontSize": 16, |
|
"color": "white", |
|
"textBorderWidth": 0, |
|
"formatter": "{c}", |
|
}, |
|
"links": [ |
|
{ |
|
"source": "All models", |
|
"target": "Converts to ONNX", |
|
"value": max(default_bar_size, summ.all_models), |
|
}, |
|
{ |
|
"source": "Converts to ONNX", |
|
"target": "Optimizes ONNX file", |
|
"value": max(default_bar_size, summ.optimized_onnx), |
|
}, |
|
{ |
|
"source": "Optimizes ONNX file", |
|
"target": "Converts to FP16", |
|
"value": max(default_bar_size, summ.fp16_onnx), |
|
}, |
|
{ |
|
"source": "Converts to FP16", |
|
"target": "Acquires Nvidia Perf", |
|
"value": device_bar_size, |
|
}, |
|
{ |
|
"source": "Converts to FP16", |
|
"target": "Acquires Groq Perf", |
|
"value": device_bar_size, |
|
}, |
|
{ |
|
"source": "Converts to FP16", |
|
"target": "Acquires x86 Perf", |
|
"value": device_bar_size, |
|
}, |
|
], |
|
} |
|
} |
|
st_echarts( |
|
options=option, |
|
height="70px", |
|
) |
|
|