Phi-4-mini kontra Gemma 3n: Microsoft kontra Google dla Edge AI
Dwóch gigantów technologicznych, dwie różne filozofie, a każda z nich ma na celu tworzenie tego, co najlepsze model poniżej 5 miliardów parametrów. Microsoft postawił na jakość danych trening z Phi-4-mini: możesz nauczyć małego modela myśleć jak on świetnie, jeśli trenujesz go na danych „podręcznikowej jakości”. Google skupiło się na architekturze sprzętowo obsługujący Gemma 3n: model zaprojektowany od początku z myślą o wydajnej pracy na mobilnych jednostkach NPU. To bezpośrednie porównanie pokazuje, kiedy wybrać jedno, a kiedy drugie.
Czego się nauczysz
- Architektura Phi-4-mini: dlaczego działają dane o jakości podręcznikowej
- Gemma 3n E4B: architektura MatFormer i koncepcja „efektywnego 4B”
- Porównawcze testy porównawcze dotyczące kodowania, rozumowania i mówienia po włosku
- Sprzęt typu Sweet Spot dla każdego modelu
- Kiedy wybrać Phi-4-mini, a kiedy Gemma 3n
Phi-4-mini: Filozofia danych jakościowych
Phi-4-mini (Microsoft, grudzień 2024) i w oparciu o prostą, ale potężną tezę: problem w małych modelach nie chodzi o rozmiar, ale o jakość danych uczących. Seria Phi wykorzystuje syntetyczne dane wygenerowane z większych modeli, przefiltrowane pod kątem jakości pedagogicznej – np podręczniki zamiast notatek z wykładów. W rezultacie Phi-4-mini (3,8B) przechodzi Mixtral 8x7B (46B, dwanaście razy większy) w teście porównawczym rozumowania.
# 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)
Mocne strony 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: architektura uwzględniająca sprzęt
Gemma 3n E4B (Google, kwiecień 2025) wprowadza radykalnie inną architekturę: MatFormer, który wykorzystuje zagnieżdżoną strukturę transformatorów do tworzenia wydajnych podmodeli. Sufiks „E4B” oznacza „Efektywne 4 miliardy” — model technicznie ma więcej parametrów, ale wykorzystuje system „matrioszki”, w którym może działać z obliczeniowym odpowiednikiem parametrów 4B.
# 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 dla telefonów komórkowych (jego siła)
# 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?")
"""
Bezpośrednie porównanie porównawcze
Testy przeprowadzono na RTX 4070 (12 GB VRAM) z fp16. Każde zadanie było sprawdzane 50 razy mieć statystycznie istotne średnie.
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
Tabela podsumowująca porównanie
| Charakterystyczny | Phi-4-mini (3,8B) | Gemma 3n E4B | Zwycięzca |
|---|---|---|---|
| Rozumowanie matematyczne | 72% (MAtematyka) | 67% (MAtematyka) | Phi-4-mini |
| Generowanie kodu w Pythonie | 62,3% (Ewaluacja Ludzkości) | 58,7% (Ewaluacja Ludzkości) | Phi-4-mini |
| Rozmowa w języku włoskim | Doskonały | Doskonały | Gemma 3n |
| Szybkość (tokeny/s RTX 4070) | 55 tok/s | 63 tok/s | Gemma 3n |
| Wydajność mobilna (NPU) | Dobry | Doskonały (matformer) | Gemma 3n |
| Licencja | MIT (reklama OK) | ToS Gem (ograniczenia) | Phi-4-mini |
| VRAM fp16 | 7,6 GB | 8 GB (lub 4 GB int4) | Podobny |
| Okno kontekstowe | 128 tys. tokenów | 128 tys. tokenów | Nawet |
Kiedy wybrać który 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
Wnioski
Nie ma wyraźnego zwycięzcy: Phi-4-mini jest lepszy w przypadku zadań wymagających rozumowania ustrukturyzowany, kod i dane wyjściowe w formacie JSON, z bardziej liberalną licencją MIT do użytku komercyjnego. Gemma 3n E4B doskonale radzi sobie z konwersacjami po włosku, ma doskonałą szybkość wnioskowania i oraz optymalny model wdrożenia na mobilnych jednostkach NPU z systemem Android/iOS.
Następny artykuł dotyczy dostrajania: jak dostosować Phi-4-mini lub Qwen 3 do swojego domena z QLoRA na konsumenckich procesorach graficznych VRAM 8–12 GB, z pełnym, kompleksowym przepływem pracy od spożycia zbioru danych po przesłanie go do Hugging Face Hub.
Seria: Małe modele językowe
- Artykuł 1: SLM w 2026 r. – przegląd i benchmark
- Artykuł 2 (ten): Phi-4-mini vs Gemma 3n - szczegółowe porównanie
- Artykuł 3: Dostrajanie z LoRA i QLoRA
- Artykuł 4: Kwantyzacja dla Edge - GGUF, ONNX, INT4
- Artykuł 5: Ollama – SLM lokalnie w 5 minut







