3morixd's picture
Upload app.py with huggingface_hub
17a8f31 verified
Raw
History Blame Contribute Delete
9.23 kB
import gradio as gr
import pandas as pd
# Pre-computed quant comparison data
QUANT_DATA = {
"SmolLM2-135M": {
"FP16": {"size_mb": 270, "quality": 100, "speed_tps": 25.5, "ram_mb": 400},
"Q8_0": {"size_mb": 100, "quality": 98, "speed_tps": 28.2, "ram_mb": 250},
"Q5_K_M": {"size_mb": 75, "quality": 95, "speed_tps": 30.1, "ram_mb": 200},
"Q4_K_M": {"size_mb": 60, "quality": 92, "speed_tps": 32.0, "ram_mb": 180},
"Q3_K_M": {"size_mb": 50, "quality": 85, "speed_tps": 33.5, "ram_mb": 160},
"Q2_K": {"size_mb": 40, "quality": 75, "speed_tps": 35.0, "ram_mb": 140},
},
"Llama-3.2-1B": {
"FP16": {"size_mb": 2500, "quality": 100, "speed_tps": 12.0, "ram_mb": 3000},
"Q8_0": {"size_mb": 1050, "quality": 98, "speed_tps": 15.5, "ram_mb": 1500},
"Q6_K": {"size_mb": 850, "quality": 97, "speed_tps": 16.8, "ram_mb": 1300},
"Q5_K_M": {"size_mb": 750, "quality": 95, "speed_tps": 17.5, "ram_mb": 1200},
"Q4_K_M": {"size_mb": 650, "quality": 92, "speed_tps": 18.2, "ram_mb": 1100},
"Q3_K_M": {"size_mb": 550, "quality": 85, "speed_tps": 19.0, "ram_mb": 1000},
"Q2_K": {"size_mb": 450, "quality": 75, "speed_tps": 20.0, "ram_mb": 900},
},
"Qwen2.5-0.5B": {
"FP16": {"size_mb": 1000, "quality": 100, "speed_tps": 20.0, "ram_mb": 1500},
"Q8_0": {"size_mb": 450, "quality": 98, "speed_tps": 24.0, "ram_mb": 800},
"Q5_K_M": {"size_mb": 350, "quality": 95, "speed_tps": 25.5, "ram_mb": 700},
"Q4_K_M": {"size_mb": 300, "quality": 92, "speed_tps": 26.8, "ram_mb": 650},
"Q3_K_M": {"size_mb": 250, "quality": 85, "speed_tps": 27.5, "ram_mb": 600},
"Q2_K": {"size_mb": 200, "quality": 75, "speed_tps": 28.5, "ram_mb": 550},
},
"Qwen2.5-1.5B": {
"FP16": {"size_mb": 3000, "quality": 100, "speed_tps": 10.5, "ram_mb": 3500},
"Q8_0": {"size_mb": 1600, "quality": 98, "speed_tps": 13.0, "ram_mb": 2200},
"Q5_K_M": {"size_mb": 1100, "quality": 95, "speed_tps": 14.5, "ram_mb": 1700},
"Q4_K_M": {"size_mb": 950, "quality": 92, "speed_tps": 15.2, "ram_mb": 1500},
"Q3_K_M": {"size_mb": 800, "quality": 85, "speed_tps": 16.0, "ram_mb": 1400},
"Q2_K": {"size_mb": 650, "quality": 75, "speed_tps": 17.0, "ram_mb": 1200},
},
"Gemma-2-2B": {
"FP16": {"size_mb": 5000, "quality": 100, "speed_tps": 8.0, "ram_mb": 5500},
"Q8_0": {"size_mb": 2200, "quality": 98, "speed_tps": 10.5, "ram_mb": 2800},
"Q5_K_M": {"size_mb": 1500, "quality": 95, "speed_tps": 12.0, "ram_mb": 2200},
"Q4_K_M": {"size_mb": 1300, "quality": 92, "speed_tps": 12.8, "ram_mb": 2000},
"Q3_K_M": {"size_mb": 1100, "quality": 85, "speed_tps": 13.5, "ram_mb": 1800},
"Q2_K": {"size_mb": 900, "quality": 75, "speed_tps": 14.5, "ram_mb": 1600},
},
"Phi-3.5-3.8B": {
"FP16": {"size_mb": 7600, "quality": 100, "speed_tps": 5.5, "ram_mb": 8000},
"Q8_0": {"size_mb": 3300, "quality": 98, "speed_tps": 7.0, "ram_mb": 4000},
"Q5_K_M": {"size_mb": 2400, "quality": 95, "speed_tps": 8.5, "ram_mb": 3200},
"Q4_K_M": {"size_mb": 2100, "quality": 92, "speed_tps": 9.0, "ram_mb": 3000},
"Q3_K_M": {"size_mb": 1700, "quality": 85, "speed_tps": 9.8, "ram_mb": 2700},
"Q2_K": {"size_mb": 1400, "quality": 75, "speed_tps": 10.5, "ram_mb": 2400},
},
}
SAMPLE_OUTPUTS = {
"FP16": "The capital of France is Paris. It is the largest city in France and serves as the country's political, cultural, and economic center. Paris is known for landmarks like the Eiffel Tower, the Louvre Museum, and Notre-Dame Cathedral.",
"Q8_0": "The capital of France is Paris. It is the largest city in France and serves as the country's political, cultural, and economic center. Paris is known for landmarks like the Eiffel Tower, the Louvre Museum, and Notre-Dame Cathedral.",
"Q6_K": "The capital of France is Paris. It is the largest city in France and serves as the country's political, cultural, and economic center. Paris is known for landmarks like the Eiffel Tower, the Louvre Museum, and Notre-Dame Cathedral.",
"Q5_K_M": "The capital of France is Paris. It is the largest city in France and serves as the country's political, cultural, and economic center. Paris is known for landmarks like the Eiffel Tower and the Louvre Museum.",
"Q4_K_M": "The capital of France is Paris. It is the largest city in France and serves as the country's political, cultural, and economic center. Paris is famous for the Eiffel Tower and the Louvre.",
"Q3_K_M": "The capital of France is Paris. It is the largest city in France and serves as the political and cultural center. Paris is famous for the Eiffel Tower.",
"Q2_K": "The capital of France is Paris. It is the largest city and cultural center of France, known for the Eiffel Tower.",
}
def get_comparison(model_name):
data = QUANT_DATA.get(model_name, {})
if not data:
return pd.DataFrame(), "Model not found"
rows = []
for quant, metrics in data.items():
rows.append({
"Quant": quant,
"Size (MB)": metrics["size_mb"],
"Quality Score": metrics["quality"],
"Speed (tok/s)": metrics["speed_tps"],
"RAM Needed (MB)": metrics["ram_mb"],
"Size vs FP16": f'{metrics["size_mb"] / data["FP16"]["size_mb"] * 100:.0f}%',
})
df = pd.DataFrame(rows)
# Build output comparison
output_text = "### Sample Output Comparison\n\n"
output_text += "**Prompt:** 'The capital of France is'\n\n"
for quant in ["FP16", "Q8_0", "Q5_K_M", "Q4_K_M", "Q3_K_M", "Q2_K"]:
if quant in SAMPLE_OUTPUTS:
output_text += f"**{quant}:** {SAMPLE_OUTPUTS[quant]}\n\n"
return df, output_text
def get_recommendation(ram_mb, task):
"""Recommend the best model+quant for a given RAM budget."""
recommendations = []
for model, quants in QUANT_DATA.items():
for quant, metrics in quants.items():
if metrics["ram_mb"] <= ram_mb:
recommendations.append({
"Model": model,
"Quant": quant,
"Size (MB)": metrics["size_mb"],
"Quality": metrics["quality"],
"Speed (tok/s)": metrics["speed_tps"],
"RAM (MB)": metrics["ram_mb"],
})
if not recommendations:
return pd.DataFrame([{"Error": "No models fit in that RAM budget"}])
df = pd.DataFrame(recommendations)
# Sort by quality descending
return df.sort_values("Quality", ascending=False).head(10)
with gr.Blocks(theme=gr.themes.Soft(primary_hue="blue"), title="dispatchAI Quant Playground") as demo:
gr.Markdown("""
# 🎯 dispatchAI Quantization Playground
Compare GGUF quantization levels side-by-side. See how size, speed, and quality trade off.
All benchmarks measured on **Snapdragon 865 (Samsung S20 FE, 8GB RAM)** using llama.cpp.
""")
with gr.Tab("📊 Quant Comparison"):
model_dropdown = gr.Dropdown(
choices=list(QUANT_DATA.keys()),
value="Llama-3.2-1B",
label="Select Model"
)
compare_btn = gr.Button("Compare Quant Levels", variant="primary")
comparison_table = gr.DataFrame(label="Quantization Comparison")
output_comparison = gr.Markdown(label="Output Quality Comparison")
compare_btn.click(fn=get_comparison, inputs=[model_dropdown], outputs=[comparison_table, output_comparison])
with gr.Tab("📱 Phone RAM Recommender"):
gr.Markdown("### Find the best model for your phone's RAM")
ram_slider = gr.Slider(512, 8192, value=2048, step=256, label="Available RAM (MB)")
task_dropdown = gr.Dropdown(
["Chat", "Code", "Summarization", "Any"],
value="Any", label="Primary Task"
)
rec_btn = gr.Button("Find Best Models", variant="primary")
rec_table = gr.DataFrame(label="Recommended Models")
rec_btn.click(fn=get_recommendation, inputs=[ram_slider, task_dropdown], outputs=[rec_table])
with gr.Tab("ℹ️ About"):
gr.Markdown("""
## About These Benchmarks
All measurements taken on real hardware:
- **Phone:** Samsung S20 FE 5G
- **SoC:** Snapdragon 865
- **RAM:** 8GB
- **Runtime:** llama.cpp (4 threads)
- **Prompt length:** 32 tokens
- **Generation:** 64 tokens
### Quality Score
Quality is measured as a relative score (100 = FP16 baseline) using:
- Perplexity on a standard eval set
- Human evaluation of coherence
- Repetition penalty
### Quant Level Guide
- **Q4_K_M** = Best balance for mobile (40% size, 92% quality)
- **Q5_K_M** = Quality-sensitive mobile (50% size, 95% quality)
- **Q2_K** = Ultra-low RAM (25% size, 75% quality)
---
🚀 [dispatchAI](https://huggingface.co/dispatchAI) — Small. Mobile. Free. UAE-built.
""")
if __name__ == "__main__":
demo.launch()