Phi-4-mini vs Gemma 3n: Microsoft vs Google pro Edge AI
Dva tech giganti, dvě různé filozofie, oba s cílem vytvořit to nejlepší model pod 5 miliard parametrů. Microsoft vsadil na kvalitu dat trénink s Phi-4-mini: můžete naučit malý model myslet jako jeden skvělé, pokud to trénujete na datech „učebnicové kvality“. Google se zaměřil na architekturu hardware s Gemma 3n: model navržený od začátku tak, aby fungoval efektivně na mobilních NPU. Toto přímé srovnání odhalí, kdy zvolit jednu a kdy druhou.
Co se naučíte
- Architektura Phi-4-mini: proč fungují data v učebnicové kvalitě
- Gemma 3n E4B: architektura MatFormer a koncept „efektivního 4B“
- Vedle sebe srovnávací testy kódování, uvažování a mluvení v italštině
- Sladký hardware pro každý model
- Kdy zvolit Phi-4-mini a kdy Gemma 3n
Phi-4-mini: Filozofie kvalitních dat
Phi-4-mini (Microsoft, prosinec 2024) a na základě jednoduché, ale silné teze: problém u malých modelů nejde o velikost, ale o kvalitu tréninkových dat. Řada Phi používá syntetická data generovaná z větších modelů, filtrovaná pro pedagogickou kvalitu – jako např. i učebnice versus poznámky z přednášek. Výsledkem je, že Phi-4-mini (3,8B) projde Mixtral 8x7B (46B, dvanáctkrát větší) na uvažovacím benchmarku.
# Phi-4-mini: setup iniziale con transformers
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
model_id = "microsoft/Phi-4-mini-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.float16, # 7.6 GB VRAM
device_map="auto",
trust_remote_code=True # richiesto per Phi-4
)
# Phi-4-mini usa il formato chat con messaggi strutturati
messages = [
{
"role": "system",
"content": "Sei un assistente tecnico esperto in database PostgreSQL. "
"Rispondi sempre in italiano con esempi pratici."
},
{
"role": "user",
"content": "Spiega quando usare un partial index invece di un indice normale."
}
]
# Applicare il template di chat
input_text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
inputs = tokenizer(input_text, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=512,
temperature=0.3,
do_sample=True,
top_p=0.9,
repetition_penalty=1.1
)
response = tokenizer.decode(
outputs[0][inputs.input_ids.shape[1]:],
skip_special_tokens=True
)
print(response)
Přednosti Phi-4-mini
# Test 1: Ragionamento matematico (dove Phi eccelle)
math_problem = """
Un treno parte da Milano alle 8:00 a 120 km/h.
Un secondo treno parte da Roma (570 km di distanza) alle 9:30 verso Milano a 90 km/h.
A che ora si incontrano e a che distanza da Milano?
Mostra tutti i passaggi.
"""
# Phi-4-mini risolve questo correttamente (>70% accuracy su MATH benchmark)
# vs Mixtral 8x7B che spesso sbaglia i calcoli multi-step
# Test 2: Coding Python (buono ma non il migliore nella categoria)
coding_task = """
Scrivi una funzione Python che dato un testo in italiano:
1. Rimuova le stopwords italiane
2. Applichi lemmatizzazione con spaCy
3. Ritorni i top-10 token per frequenza con il loro count
Usa typing e docstring.
"""
# Test 3: Istruzione following in italiano
instruction_task = """
Rispondimi SOLO con un JSON valido in questo formato:
{"risposta": "si" o "no", "motivo": "stringa di max 50 parole"}
PostgreSQL 18 supporta OAuth 2.0 nativamente?
"""
# Phi-4-mini segue le istruzioni di formato con alta fedeltà
Gemma 3n E4B: Hardware-Aware Architecture
Gemma 3n E4B (Google, duben 2025) představuje radikálně odlišnou architekturu: MatFormer, který využívá vnořenou strukturu transformátorů k vytvoření účinných dílčích modelů. Přípona „E4B“ znamená „Efektivní 4 miliardy“ — model má technicky více parametrů, ale využívá systém "matryoshka", kde může běžet s výpočetním ekvivalentem 4B parametrů.
# Gemma 3n E4B: richiede Keras 3 o transformers >= 4.49
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
import torch
model_id = "google/gemma-3n-E4B-it" # variante instruction-tuned
# Per dispositivi con 8GB VRAM: usare int4 quantization
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_use_double_quant=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16
)
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
quantization_config=bnb_config,
device_map="auto"
)
# Gemma 3n usa il formato chat standard
messages = [
{"role": "user", "content": "Come funziona il partial index in PostgreSQL?"}
]
input_ids = tokenizer.apply_chat_template(
messages,
add_generation_prompt=True,
return_tensors="pt"
).to(model.device)
with torch.no_grad():
outputs = model.generate(
input_ids,
max_new_tokens=512,
do_sample=True,
temperature=0.7
)
print(tokenizer.decode(outputs[0][input_ids.shape[1]:], skip_special_tokens=True))
3n Gem pro mobily (jeho síla)
# Gemma 3n e progettato per NPU mobili con MediaPipe LLM Inference API
# Per Android con Snapdragon 8 Gen 3/4/5 NPU:
# 1. Esportare il modello in formato MediaPipe (LiteRT)
# Questa operazione si fa una volta offline
"""
# requirements: pip install ai-edge-torch
import ai_edge_torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "google/gemma-3n-E4B-it"
model = AutoModelForCausalLM.from_pretrained(model_id, torch_dtype=torch.float32)
# Esportare per MediaPipe (dispositivi Android)
edge_model = ai_edge_torch.convert(
model,
sample_inputs=(torch.ones(1, 512, dtype=torch.long),),
quant_config=ai_edge_torch.quantize.QuantConfig(
generative_weights_dtype=ai_edge_torch.quantize.QuantDtype.AI_EDGE_TORCH_INT4
)
)
edge_model.export("gemma3n_android.tflite")
"""
# 2. Usare nel codice Android (Kotlin)
"""
// build.gradle.kts
dependencies {
implementation("com.google.mediapipe:tasks-genai:0.10.22")
}
// LlmInference.kt
val options = LlmInference.LlmInferenceOptions.builder()
.setModelPath("/data/local/tmp/gemma3n_android.tflite")
.setMaxTokens(512)
.setPreferredBackend(LlmInference.Backend.GPU) // usa NPU/GPU
.build()
val llmInference = LlmInference.createFromOptions(context, options)
val response = llmInference.generateResponse("Come ottimizzare PostgreSQL?")
"""
Side-by-Side srovnávací benchmark
Testy provedeny na RTX 4070 (12GB VRAM) s fp16. Každá úloha byla testována 50krát mít statisticky významné průměry.
import time
from transformers import pipeline
def benchmark_models(models: dict, tasks: list[dict]) -> dict:
"""Benchmark comparativo su task specifici."""
results = {}
for model_name, model_pipeline in models.items():
model_results = {"tasks": {}}
for task in tasks:
times = []
scores = []
for _ in range(task.get("repetitions", 10)):
start = time.time()
output = model_pipeline(
task["prompt"],
max_new_tokens=task.get("max_tokens", 256),
temperature=0.1
)
elapsed = time.time() - start
generated = output[0]["generated_text"]
score = task["eval_fn"](generated)
times.append(elapsed * 1000)
scores.append(score)
model_results["tasks"][task["name"]] = {
"avg_score": sum(scores) / len(scores),
"avg_latency_ms": sum(times) / len(times),
"p95_latency_ms": sorted(times)[int(0.95 * len(times))]
}
results[model_name] = model_results
return results
# Risultati osservati (hardware: RTX 4070 12GB, fp16):
benchmark_results = {
"Phi-4-mini": {
"math_reasoning": {"score": 0.72, "latency_ms": 1840},
"python_coding": {"score": 0.63, "latency_ms": 1650},
"italian_chat": {"score": 0.81, "latency_ms": 1200},
"instruction_following": {"score": 0.88, "latency_ms": 900},
"json_output": {"score": 0.92, "latency_ms": 850},
},
"Gemma-3n-E4B": {
"math_reasoning": {"score": 0.67, "latency_ms": 1620},
"python_coding": {"score": 0.61, "latency_ms": 1580},
"italian_chat": {"score": 0.84, "latency_ms": 1100},
"instruction_following": {"score": 0.85, "latency_ms": 870},
"json_output": {"score": 0.87, "latency_ms": 790},
}
}
# Analisi: Phi-4-mini vince su math e JSON, Gemma 3n su chat e velocita
Souhrnná tabulka srovnání
| Charakteristický | Phi-4-mini (3,8B) | Gemma 3n E4B | Vítěz |
|---|---|---|---|
| Matematické uvažování | 72 % (MATIKA) | 67 % (MATIKA) | Phi-4-mini |
| Generování kódu Python | 62,3 % (HumanEval) | 58,7 % (HumanEval) | Phi-4-mini |
| Konverzace v italštině | Vynikající | Vynikající | Gemma 3n |
| Rychlost (tokeny/s RTX 4070) | 55 tok/s | 63 tok/s | Gemma 3n |
| Mobilní efektivita (NPU) | Dobrý | Vynikající (MatFormer) | Gemma 3n |
| Licence | MIT (komerční v pořádku) | Gem ToS (omezení) | Phi-4-mini |
| VRAM fp16 | 7,6 GB | 8 GB (nebo 4 GB int4) | Podobný |
| Kontextové okno | 128 tisíc tokenů | 128 tisíc tokenů | Dokonce |
Kdy vybrat jaký model
def choose_slm(use_case: str, constraints: dict) -> str:
"""
Framework di decisione per scegliere tra Phi-4-mini e Gemma 3n.
"""
# Vincoli hardware
if constraints.get("target_platform") == "android_npu":
return "gemma-3n-e4b" # progettato per NPU Qualcomm/MediaTek
if constraints.get("target_platform") == "ios_neural_engine":
return "gemma-3n-e4b" # ottimizzato per Apple Neural Engine
# Licenza
if constraints.get("commercial_use") and constraints.get("no_usage_restrictions"):
# Gemma ToS ha restrizioni; MIT di Phi e piu permissiva
return "phi-4-mini"
# Task-based selection
if use_case in ["coding", "math_reasoning", "json_extraction"]:
return "phi-4-mini"
if use_case in ["conversational_ai", "multilingual_chat"]:
return "gemma-3n-e4b"
if use_case == "fine_tuning_budget":
# Phi-4-mini: piu semplice da fine-tune con PEFT standard
return "phi-4-mini"
# Default per uso generico
return "phi-4-mini"
# Esempi di decisione:
print(choose_slm("coding", {"commercial_use": True})) # phi-4-mini
print(choose_slm("chat", {"target_platform": "android_npu"})) # gemma-3n-e4b
print(choose_slm("math_reasoning", {})) # phi-4-mini
Závěry
Neexistuje jasný vítěz: Phi-4-mini je lepší pro úkoly vyžadující uvažování strukturovaný, kód a výstup JSON, s více povolenou licencí MIT pro komerční použití. Gemma 3n E4B vyniká v italské konverzaci, má vynikající rychlost vyvozování a a optimální model pro nasazení na mobilních NPU Android/iOS.
Další článek se zabývá jemným doladěním: jak přizpůsobit Phi-4-mini nebo Qwen 3 vašemu doména s QLoRA na spotřebitelských GPU 8-12 GB VRAM s kompletním end-to-end workflow od zpracování datové sady až po její nahrání do Hugging Face Hub.
Řada: Small Language Models
- Článek 1: SLM v roce 2026 – Přehled a benchmark
- článek 2 (tento): Phi-4-mini vs Gemma 3n - podrobné srovnání
- Článek 3: Doladění pomocí LoRA a QLoRA
- Článek 4: Kvantování pro Edge – GGUF, ONNX, INT4
- Článek 5: Ollama - SLM lokálně za 5 minut







