Phi-4-mini versus Gemma 3n: Microsoft versus Google voor Edge AI
Twee techgiganten, twee verschillende filosofieën, beide met als doel het beste te creëren model onder 5 miljard parameters. Microsoft heeft ingezet op datakwaliteit trainen met Phi-4-mini: je kunt een klein model leren denken als een model geweldig als je het traint op basis van gegevens van leerboekkwaliteit. Google richtte zich op architectuur hardwarebewust met Gemma 3n: een model dat vanaf het begin is ontworpen om efficiënt te werken op mobiele NPU's. Deze directe vergelijking laat zien wanneer je voor het ene moet kiezen en wanneer voor het andere.
Wat je gaat leren
- De Phi-4-mini-architectuur: waarom gegevens van leerboekkwaliteit werken
- Gemma 3n E4B: de MatFormer-architectuur en het concept van "effectieve 4B"
- Side-by-side benchmarks over coderen, redeneren en spreken in het Italiaans
- Sweet spot-hardware voor elk model
- Wanneer kies je voor Phi-4-mini en wanneer Gemma 3n
Phi-4-mini: de filosofie van kwaliteitsgegevens
Phi-4-mini (Microsoft, december 2024) en gebaseerd op een eenvoudige maar krachtige stelling: het probleem Bij kleine modellen gaat het niet om de omvang, maar om de kwaliteit van de trainingsgegevens. De Phi-serie gebruikt synthetische gegevens gegenereerd uit grotere modellen, gefilterd op pedagogische kwaliteit – zoals i studieboeken versus collegeaantekeningen. Het resultaat is dat Phi-4-mini (3.8B) passeert Mixtral 8x7B (46B, twaalf keer groter) op redeneerbenchmark.
# 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)
Sterke punten van 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: hardwarebewuste architectuur
Gemma 3n E4B (Google, april 2025) introduceert een radicaal andere architectuur: MatFormer, die een geneste structuur van transformatoren gebruikt om efficiënte submodellen te creëren. Het achtervoegsel “E4B” betekent “Effectief 4 miljard” – het model heeft technisch gezien meer parameters, maar gebruikt een "matryoshka" -systeem waar het kan werken met het computationele equivalent van 4B-parameters.
# 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 voor mobiel (zijn kracht)
# 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?")
"""
Vergelijkende benchmark naast elkaar
Tests uitgevoerd op RTX 4070 (12GB VRAM) met fp16. Elke taak werd 50 keer getest om statistisch significante gemiddelden te hebben.
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
Overzichtstabel van de vergelijking
| Kenmerkend | Phi-4-mini (3.8B) | Gemma 3n E4B | Winnaar |
|---|---|---|---|
| Wiskundig redeneren | 72% (WISKUNDE) | 67% (WISKUNDE) | Phi-4-mini |
| Genereren van Python-code | 62,3% (menselijke evaluatie) | 58,7% (menselijke evaluatie) | Phi-4-mini |
| Gesprek in het Italiaans | Uitstekend | Uitstekend | Gemma 3n |
| Snelheid (tokens/sec RTX 4070) | 55 tok/sec | 63 tok/sec | Gemma 3n |
| Mobiele efficiëntie (NPU) | Goed | Uitstekend (MatFormer) | Gemma 3n |
| Licentie | MIT (commercieel OK) | Gem ToS (beperkingen) | Phi-4-mini |
| VRAM fp16 | 7,6 GB | 8GB (of 4GB int4) | Vergelijkbaar |
| Contextvenster | 128K-tokens | 128K-tokens | Zelfs |
Wanneer moet u welk model kiezen?
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
Conclusies
Er is geen duidelijke winnaar: Phi-4-mini is superieur voor taken waarvoor redenering vereist is gestructureerde, code- en JSON-uitvoer, met een meer tolerante MIT-licentie voor commercieel gebruik. Gemma 3n E4B blinkt uit in Italiaanse gesprekken, heeft een superieure inferentiesnelheid en en het optimale model voor implementatie op mobiele NPU's voor Android/iOS.
Het volgende artikel gaat over finetuning: hoe u Phi-4-mini of Qwen 3 aan de uwe kunt aanpassen domein met QLoRA op 8-12 GB VRAM consumenten-GPU's, met de volledige end-to-end workflow van het opnemen van de dataset tot het uploaden ervan naar Hugging Face Hub.
Serie: kleine taalmodellen
- Artikel 1: SLM in 2026 - Overzicht en Benchmark
- Artikel 2 (dit): Phi-4-mini versus Gemma 3n - Gedetailleerde vergelijking
- Artikel 3: Afstemming met LoRA en QLoRA
- Artikel 4: Kwantisering voor Edge - GGUF, ONNX, INT4
- Artikel 5: Ollama - SLM Lokaal in 5 minuten







