|
import matplotlib |
|
matplotlib.use('Agg') |
|
|
|
import functools |
|
import gradio as gr |
|
import matplotlib.pyplot as plt |
|
import seaborn as sns |
|
import pandas as pd |
|
|
|
|
|
FIGURE_PATH = "plt.png" |
|
FIG_DPI = 300 |
|
|
|
|
|
def get_plot(task, gpu, omit_offload): |
|
|
|
df = pd.read_csv("data.csv") |
|
df = df[df["task"] == task] |
|
df = df[df["gpu"] == gpu] |
|
if omit_offload == "Yes": |
|
df = df[df["offload"] == 0] |
|
|
|
|
|
df["model and dtype"] = df['model_name'].str.cat(df[['dtype']], sep=', ') |
|
|
|
|
|
df = df.melt( |
|
id_vars=["task", "gpu", "model and dtype", "offload"], |
|
value_vars=["Greedy", "Assisted"], |
|
var_name="generation_type", |
|
value_name="generation_time", |
|
) |
|
|
|
g = sns.catplot( |
|
data=df, |
|
kind="bar", |
|
x="model and dtype", |
|
y="generation_time", |
|
hue="generation_type", |
|
palette={"Greedy": "blue", "Assisted": "orange"}, |
|
alpha=.9, |
|
) |
|
g.despine(left=True) |
|
g.set_axis_labels("Model size and dtype", "Latency (ms/token)") |
|
g.set_xticklabels(fontsize=7) |
|
g.set_yticklabels(fontsize=7) |
|
g.legend.set_title("Generation Type") |
|
plt.setp(g._legend.get_texts(), fontsize='7') |
|
|
|
|
|
ax = g.facet_axis(0, 0) |
|
for i in ax.containers: |
|
ax.bar_label(i, fontsize=7) |
|
|
|
plt.savefig(FIGURE_PATH, dpi=FIG_DPI) |
|
return FIGURE_PATH |
|
|
|
|
|
demo = gr.Blocks() |
|
|
|
with demo: |
|
gr.Markdown( |
|
""" |
|
# Assisted Generation Benchmark |
|
""" |
|
) |
|
|
|
omit_offload_fn = functools.partial( |
|
gr.Radio, ["Yes", "No"], value="No", label="Omit cases with memory offload?", interactive=True |
|
) |
|
|
|
def gpu_selector_fn(gpu_list): |
|
return gr.Dropdown( |
|
gpu_list, value=gpu_list[-1], label="GPU", interactive=True |
|
) |
|
|
|
with gr.Tabs(): |
|
with gr.TabItem("OPT: Open"): |
|
plot_fn = functools.partial(get_plot, "OPT: Open Text Generation") |
|
with gr.Row(): |
|
with gr.Column(): |
|
gpu_selector = gpu_selector_fn(["3090", "T4", "T4 *2", "A100 (80GB)"]) |
|
with gr.Column(): |
|
omit_offload = omit_offload_fn() |
|
|
|
|
|
plot = gr.Image(value=plot_fn("A100 (80GB)", "No")) |
|
gr.Markdown( |
|
""" |
|
### Assistant Model |
|
- `facebook/opt-125m` |
|
|
|
### Model Names: |
|
- 1.3B: `facebook/opt-1.3b` |
|
- 6.7B: `facebook/opt-6.7b` |
|
- 30B: `facebook/opt-30b` |
|
- 66B: `facebook/opt-66b` |
|
|
|
### Dataset used as input prompt: |
|
- C4 (en, validation set) |
|
""" |
|
) |
|
|
|
plot_inputs = [gpu_selector, omit_offload] |
|
gpu_selector.change(fn=plot_fn, inputs=plot_inputs, outputs=plot) |
|
omit_offload.change(fn=plot_fn, inputs=plot_inputs, outputs=plot) |
|
with gr.TabItem("OPT: Summ"): |
|
plot_fn = functools.partial(get_plot, "OPT: Summarization") |
|
with gr.Row(): |
|
with gr.Column(): |
|
gpu_selector = gpu_selector_fn(["3090", "T4", "T4 *2", "A100 (80GB)"]) |
|
with gr.Column(): |
|
omit_offload = omit_offload_fn() |
|
|
|
|
|
plot = gr.Image(value=plot_fn("A100 (80GB)", "No")) |
|
gr.Markdown( |
|
""" |
|
### Assistant Model |
|
- `facebook/opt-125m` |
|
|
|
### Model Names: |
|
- 1.3B: `facebook/opt-1.3b` |
|
- 6.7B: `facebook/opt-6.7b` |
|
- 30B: `facebook/opt-30b` |
|
- 66B: `facebook/opt-66b` |
|
|
|
### Dataset used as input prompt: |
|
- CNN Dailymail (3.0.0, validation set) |
|
""" |
|
) |
|
|
|
plot_inputs = [gpu_selector, omit_offload] |
|
gpu_selector.change(fn=plot_fn, inputs=plot_inputs, outputs=plot) |
|
omit_offload.change(fn=plot_fn, inputs=plot_inputs, outputs=plot) |
|
with gr.TabItem("Whisper: ARS"): |
|
plot_fn = functools.partial(get_plot, "Whisper: ARS") |
|
with gr.Row(): |
|
with gr.Column(): |
|
gpu_selector = gpu_selector_fn(["3090", "T4"]) |
|
with gr.Column(): |
|
omit_offload = omit_offload_fn() |
|
|
|
|
|
plot = gr.Image(value=plot_fn("T4", "No")) |
|
gr.Markdown( |
|
""" |
|
### Assistant Model |
|
- `openai/whisper-tiny` |
|
|
|
### Model Names: |
|
- large-v2: `openai/whisper-large-v2` |
|
|
|
### Dataset used as input prompt: |
|
- Librispeech ARS (clean, validation set) |
|
|
|
|
|
|
|
""" |
|
) |
|
|
|
plot_inputs = [gpu_selector, omit_offload] |
|
gpu_selector.change(fn=plot_fn, inputs=plot_inputs, outputs=plot) |
|
omit_offload.change(fn=plot_fn, inputs=plot_inputs, outputs=plot) |
|
with gr.TabItem("CodeGen: Code"): |
|
plot_fn = functools.partial(get_plot, "CodeGen: Code Generation") |
|
with gr.Row(): |
|
with gr.Column(): |
|
gpu_selector = gpu_selector_fn(["3090", "T4", "T4 *2", "A100 (80GB)"]) |
|
with gr.Column(): |
|
omit_offload = omit_offload_fn() |
|
|
|
plot = gr.Image(value=plot_fn("A100 (80GB)", "No")) |
|
gr.Markdown( |
|
""" |
|
### Assistant Model |
|
- `Salesforce/codegen-350M-mono` |
|
|
|
### Model Names: |
|
- 2B: `Salesforce/codegen-2B-mono` |
|
- 6B: `Salesforce/codegen-6B-mono` |
|
- 16B: `Salesforce/codegen-16B-mono` |
|
|
|
### Dataset used as input prompt: |
|
- The Stack (python) |
|
|
|
""" |
|
) |
|
|
|
plot_inputs = [gpu_selector, omit_offload] |
|
gpu_selector.change(fn=plot_fn, inputs=plot_inputs, outputs=plot) |
|
omit_offload.change(fn=plot_fn, inputs=plot_inputs, outputs=plot) |
|
with gr.TabItem("Flan-T5: Summ"): |
|
plot_fn = functools.partial(get_plot, "Flan-T5: Summarization") |
|
with gr.Row(): |
|
with gr.Column(): |
|
gpu_selector = gpu_selector_fn(["3090", "T4", "T4 *2", "A100 (80GB)"]) |
|
with gr.Column(): |
|
omit_offload = omit_offload_fn() |
|
|
|
|
|
plot = gr.Image(value=plot_fn("A100 (80GB)", "No")) |
|
gr.Markdown( |
|
""" |
|
### Assistant Model |
|
- `google/flan-t5-small` |
|
|
|
### Model Names: |
|
- large: `google/flan-t5-large` |
|
- xl: `google/flan-t5-xl` |
|
- xxl: `google/flan-t5-xxl` |
|
- ul2: `google/flan-ul2` |
|
|
|
### Dataset used as input prompt: |
|
- CNN Dailymail (3.0.0, validation set) |
|
""" |
|
) |
|
|
|
plot_inputs = [gpu_selector, omit_offload] |
|
gpu_selector.change(fn=plot_fn, inputs=plot_inputs, outputs=plot) |
|
omit_offload.change(fn=plot_fn, inputs=plot_inputs, outputs=plot) |
|
with gr.TabItem("Benchmark Info"): |
|
gr.Dataframe( |
|
headers=["Parameter", "Value"], |
|
value=[ |
|
["Transformers Version", "4.29dev0"], |
|
["Pytorch Version", "2.0.0"], |
|
["OS", "22.04 LTS (3090) / Debian 10 (other GPUs)"], |
|
["CUDA", "11.8 (3090) / 11.3 (others GPUs)"], |
|
["Number of input samples", "20-100 (depending on the model size)"], |
|
["Is there code to reproduce?", "Yes -- https://github.com/gante/huggingface-demos/tree/main/experiments/faster_generation"], |
|
], |
|
) |
|
|
|
demo.launch() |
|
|