| | 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", |
| | ) |
| |
|