joaogante's picture
joaogante HF staff
fiddle with plots
918037c
raw
history blame
10.2 kB
import matplotlib
matplotlib.use('Agg')
import functools
import gradio as gr
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
# benchmark order: pytorch, tf eager, tf xla; units = ms
BENCHMARK_DATA = {
"Greedy Search": {
"DistilGPT2": {
"T4": [336.22, 3976.23, 115.84],
"3090": [158.38, 1835.82, 46.56],
"A100": [371.49, 4073.84, 60.94],
},
"GPT2": {
"T4": [607.31, 7140.23, 185.12],
"3090": [297.03, 3308.31, 76.68],
"A100": [691.75, 7323.60, 110.72],
},
"OPT-1.3B": {
"T4": [1303.41, 15939.07, 1488.15],
"3090": [428.33, 7259.43, 468.37],
"A100": [1125.00, 16713.63, 384.52],
},
"GPTJ-6B": {
"T4": [0, 0, 0],
"3090": [0, 0, 0],
"A100": [2664.28, 32783.09, 1440.06],
},
"T5 Small": {
"T4": [99.88, 1527.73, 18.78],
"3090": [55.09, 665.70, 9.25],
"A100": [124.91, 1642.07, 13.72],
},
"T5 Base": {
"T4": [416.56, 6095.05, 106.12],
"3090": [223.00, 2503.28, 46.67],
"A100": [550.76, 6504.11, 64.57],
},
"T5 Large": {
"T4": [645.05, 9587.67, 225.17],
"3090": [377.74, 4216.41, 97.92],
"A100": [944.17, 10572.43, 116.52],
},
"T5 3B": {
"T4": [1493.61, 13629.80, 1494.80],
"3090": [694.75, 6316.79, 489.33],
"A100": [1801.68, 16707.71, 411.93],
},
},
"Sample": {
"DistilGPT2": {
"T4": [617.40, 6078.81, 221.65],
"3090": [310.37, 2843.73, 85.44],
"A100": [729.05, 7140.05, 121.83],
},
"GPT2": {
"T4": [1205.34, 12256.98, 378.69],
"3090": [577.12, 5637.11, 160.02],
"A100": [1377.68, 15605.72, 234.47],
},
"OPT-1.3B": {
"T4": [2166.72, 19126.25, 2341.32],
"3090": [706.50, 9616.97, 731.58],
"A100": [2019.70, 28621.09, 690.36],
},
"GPTJ-6B": {
"T4": [0, 0, 0],
"3090": [0, 0, 0],
"A100": [5150.35, 70554.07, 2744.49],
},
"T5 Small": {
"T4": [235.93, 3599.47, 41.07],
"3090": [100.41, 1093.33, 23.24],
"A100": [267.42, 3366.73, 28.53],
},
"T5 Base": {
"T4": [812.59, 7966.73, 196.85],
"3090": [407.81, 4904.54, 97.56],
"A100": [1033.05, 11521.97, 123.93],
},
"T5 Large": {
"T4": [1114.22, 16433.31, 424.91],
"3090": [647.61, 7184.71, 160.97],
"A100": [1668.73, 19962.78, 200.75],
},
"T5 3B": {
"T4": [2282.56, 20891.22, 2196.02],
"3090": [1011.32, 9735.97, 734.40],
"A100": [2769.64, 26440.65, 612.98],
},
},
"Beam Search": {
"DistilGPT2": {
"T4": [2407.89, 19442.60, 3313.92],
"3090": [998.52, 8286.03, 900.28],
"A100": [2237.41, 21771.40, 760.47],
},
"GPT2": {
"T4": [3767.43, 34813.93, 5559.42],
"3090": [1633.04, 14606.93, 1533.55],
"A100": [3705.43, 34586.23, 1295.87],
},
"OPT-1.3B": {
"T4": [16649.82, 78500.33, 21894.31],
"3090": [508518, 32822.81, 5762.46],
"A100": [5967.32, 78334.56, 4096.38],
},
"GPTJ-6B": {
"T4": [0, 0, 0],
"3090": [0, 0, 0],
"A100": [15119.10, 134000.40, 10214.17],
},
"T5 Small": {
"T4": [283.64, 25089.12, 1391.66],
"3090": [137.38, 10680.28, 486.96],
"A100": [329.28, 24747.38, 513.99],
},
"T5 Base": {
"T4": [1383.21, 44809.14, 3920.40],
"3090": [723.11, 18657.48, 1258.60],
"A100": [2360.85, 45085.07, 1107.58],
},
"T5 Large": {
"T4": [1663.50, 81902.41, 9551.29],
"3090": [922.53, 35524.30, 2838.86],
"A100": [2168.22, 86890.00, 2373.04],
},
"T5 3B": {
"T4": [0, 0, 0],
"3090": [1521.05, 35337.30, 8282.09],
"A100": [3162.54, 88453.65, 5585.20],
},
},
}
def get_plot(model_name, plot_eager, generate_type):
df = pd.DataFrame(BENCHMARK_DATA[generate_type][model_name])
df["framework"] = ["PyTorch", "TF (Eager Execition)", "TF (XLA)"]
df = pd.melt(df, id_vars=["framework"], value_vars=["T4", "3090", "A100"])
if plot_eager == "No":
df = df[df["framework"] != "TF (Eager Execition)"]
g = sns.catplot(
data=df,
kind="bar",
x="variable",
y="value",
hue="framework",
ci="sd",
palette={"PyTorch": "blue", "TF (Eager Execition)": "orange", "TF (XLA)": "red"},
alpha=.6,
height=6
)
g.despine(left=True)
g.set_axis_labels("GPU", "Generation time (ms)")
g.legend.set_title("Framework")
return plt.gcf()
demo = gr.Blocks()
with demo:
gr.Markdown(
"""
# TensorFlow XLA Text Generation Benchmark
Pick a tab for the type of generation (or other information), and then select a model from the dropdown menu.
You can also omit results from TensorFlow Eager Execution, if you wish to better compare the performance of
PyTorch to TensorFlow with XLA.
"""
)
with gr.Tabs():
with gr.TabItem("Greedy Search"):
gr.Markdown(
"""
### Greedy Search benchmark parameters
- `max_new_tokens = 64`;
- `pad_to_multiple_of = 64` for Tensorflow XLA models. Others do not pad (input prompts between 2 and 33 tokens).
"""
)
with gr.Row():
model_selector = gr.Dropdown(
choices=["DistilGPT2", "GPT2", "OPT-1.3B", "GPTJ-6B", "T5 Small", "T5 Base", "T5 Large", "T5 3B"],
value="T5 Small",
label="Model",
interactive=True,
)
eager_enabler = gr.Radio(
["Yes", "No"],
value="Yes",
label="Plot TF Eager Execution?",
interactive=True
)
plot_fn = functools.partial(get_plot, generate_type="Greedy Search")
plot = gr.Plot(value=plot_fn("T5 Small", "Yes")) # Show plot when the gradio app is initialized
model_selector.change(fn=plot_fn, inputs=[model_selector, eager_enabler], outputs=plot)
eager_enabler.change(fn=plot_fn, inputs=[model_selector, eager_enabler], outputs=plot)
with gr.TabItem("Sample"):
gr.Markdown(
"""
### Sample benchmark parameters
- `max_new_tokens = 128`;
- `temperature = 2.0`;
- `top_k = 50`;
- `pad_to_multiple_of = 64` for Tensorflow XLA models. Others do not pad (input prompts between 2 and 33 tokens).
"""
)
with gr.Row():
model_selector = gr.Dropdown(
choices=["DistilGPT2", "GPT2", "OPT-1.3B", "GPTJ-6B", "T5 Small", "T5 Base", "T5 Large", "T5 3B"],
value="T5 Small",
label="Model",
interactive=True,
)
eager_enabler = gr.Radio(
["Yes", "No"],
value="Yes",
label="Plot TF Eager Execution?",
interactive=True
)
plot_fn = functools.partial(get_plot, generate_type="Sample")
plot = gr.Plot(value=plot_fn("T5 Small", "Yes")) # Show plot when the gradio app is initialized
model_selector.change(fn=plot_fn, inputs=[model_selector, eager_enabler], outputs=plot)
eager_enabler.change(fn=plot_fn, inputs=[model_selector, eager_enabler], outputs=plot)
with gr.TabItem("Beam Search"):
gr.Markdown(
"""
### Beam Search benchmark parameters
- `max_new_tokens = 256`;
- `num_beams = 16`;
- `pad_to_multiple_of = 64` for Tensorflow XLA models. Others do not pad (input prompts between 2 and 33 tokens).
"""
)
with gr.Row():
model_selector = gr.Dropdown(
choices=["DistilGPT2", "GPT2", "OPT-1.3B", "GPTJ-6B", "T5 Small", "T5 Base", "T5 Large", "T5 3B"],
value="T5 Small",
label="Model",
interactive=True,
)
eager_enabler = gr.Radio(
["Yes", "No"],
value="Yes",
label="Plot TF Eager Execution?",
interactive=True
)
plot_fn = functools.partial(get_plot, generate_type="Beam Search")
plot = gr.Plot(value=plot_fn("T5 Small", "Yes")) # Show plot when the gradio app is initialized
model_selector.change(fn=plot_fn, inputs=[model_selector, eager_enabler], outputs=plot)
eager_enabler.change(fn=plot_fn, inputs=[model_selector, eager_enabler], outputs=plot)
with gr.TabItem("Benchmark Information"):
gr.Dataframe(
headers=["Parameter", "Value"],
value=[
["Transformers Version", "4.22.dev0"],
["TensorFlow Version", "2.9.1"],
["Pytorch Version", "1.11.0"],
["OS", "22.04 LTS (3090) / Debian 10 (other GPUs)"],
["CUDA", "11.6 (3090) / 11.3 (others GPUs)"],
["Number of Runs", "100 (the first run was discarded to ignore compilation time)"],
["Is there code to reproduce?", "Yes -- https://gist.github.com/gante/f0017e3f13ac11b0c02e4e4db351f52f"],
],
)
demo.launch()