muellerzr's picture
muellerzr HF staff
First version
198d05b
raw
history blame
2.2 kB
import re
import pandas as pd
import gradio as gr
from py_markdown_table.markdown_table import markdown_table
from model_sizer.utils import get_sizes, create_empty_model, convert_bytes
def convert_url_to_name(url:str):
"Converts a model URL to its name on the Hub"
results = re.findall(r"huggingface.co\/(.*?)#", url)
if len(results) < 1:
raise ValueError(f"URL {url} is not a valid model URL to the Hugging Face Hub")
return results[0]
def calculate_memory(model_name:str, library:str, options:list):
"Calculates the memory usage for a model"
if library == "auto":
library = None
if "huggingface.co" in model_name:
model_name = convert_url_to_name(model_name)
model = create_empty_model(model_name, library_name=library)
total_size, largest_layer = get_sizes(model)
data = []
title = f"Memory Usage for `{model_name}`"
for dtype in options:
dtype_total_size = total_size
dtype_largest_layer = largest_layer[0]
if dtype == "float16":
dtype_total_size /= 2
dtype_largest_layer /= 2
elif dtype == "int8":
dtype_total_size /= 4
dtype_largest_layer /= 4
elif dtype == "int4":
dtype_total_size /= 8
dtype_largest_layer /= 8
dtype_training_size = convert_bytes(dtype_total_size * 4)
dtype_total_size = convert_bytes(dtype_total_size)
dtype_largest_layer = convert_bytes(dtype_largest_layer)
data.append({
"dtype": dtype,
"Largest Layer": dtype_largest_layer,
"Total Size": dtype_total_size,
"Training using Adam": dtype_training_size
})
return pd.DataFrame(data)
# return f"## {title}\n\n" + markdown_table(data).set_params(
# row_sep="markdown", quote=False,
# ).get_markdown()
options = gr.CheckboxGroup(
["float32", "float16", "int8", "int4"],
)
library = gr.Radio(["auto", "transformers", "timm"], label="Library", value="auto")
iface = gr.Interface(
fn=calculate_memory,
inputs=[
"text",
library,
options,
],
outputs="dataframe"
)
iface.launch()