Gemma3 4B è il modello che ho scelto per il Mac Mini M1 acceso vicino allo schermo come piccolo nodo di servizio. Avevo bisogno di un modello che rispondesse istantaneamente a domande brevi senza che dovessi accendere altre macchine, e che potesse anche accettare immagini quando capita. Sul chip Apple Silicon, con backend Metal, una 4B in quantizzazione Q4 risponde alla prima parola in una frazione di secondo: la latenza percepita è bassissima, e questo cambia il modo in cui lo interpello durante il lavoro.

Il modello è rilasciato da Google con la Gemma License, semi-permissiva: l’uso è libero entro una use policy che vieta categorie specifiche (armi, malware, contenuti pedopornografici, ecc.), va letta una volta perché differisce da una Apache 2.0 piena. Sul Mac Mini ho macOS aggiornato e Ollama installato con il pacchetto ufficiale. La 4B di Gemma 3 sta in circa 3 GB di RAM unificata e resta caldo abbastanza da non dover ricaricare il modello a ogni invocazione. Uso il terminale in fish, che è la mia shell su macOS, mentre sul server Debian dell’homelab uso bash.

I parametri base: 4B di parametri, contesto nativo 8k che spingo a 8192 effettivi via Modelfile quando serve, multimodalità per immagini singole, quantizzazione Q4 predefinita di Ollama. Knowledge cutoff intorno a metà 2024.

Setup base con Ollama

Su macOS conviene partire dal pacchetto ufficiale di Ollama (o da brew, come preferisco io), poi pull del modello e prima esecuzione interattiva.


brew install ollama
brew services start ollama
ollama pull gemma3:4b
ollama run gemma3:4b

Per la modalità multimodale, dentro la chat passo direttamente un percorso di immagine usando il tag che Ollama riconosce per gli allegati, e il modello la legge come parte del prompt. Per task con prompt più lunghi creo un Modelfile derivato.


ollama show gemma3:4b --modelfile > /tmp/gemma3.Modelfile

Aggiungo PARAMETER num_ctx 8192 al file e registro la variante con ollama create gemma3-long -f /tmp/gemma3.Modelfile. La uso solo per i task che richiedono una finestra più ampia, in modo da non sprecare RAM unificata sul Mac Mini per tutti gli altri usi quotidiani.

Setup avanzato con opencode

Quando devo dare al modello accesso a una cartella di file e non solo a una domanda singola, passo a opencode. La TUI agentica monta la working directory, mi permette di passare file in contesto in modo esplicito, e gestisce sessioni multi-step. Il provider punta a Ollama locale via endpoint OpenAI-compatible.


{
  "provider": {
    "ollama-local": {
      "npm": "@ai-sdk/openai-compatible",
      "options": {
        "apiKey": "ollama",
        "baseURL": "http://localhost:11434/v1"
      },
      "models": {
        "gemma3:4b": { "name": "Gemma 3 4B" }
      }
    }
  }
}

Mi sposto nella cartella di lavoro e apro la TUI.


opencode . --model ollama-local/gemma3:4b

Un esempio di sessione reale

Lunedì sera intorno alle 22 stavo deserializzando un dump JSON di configurazione che mi era arrivato da un collega: un blob da 300 KB di flag e valori per un sistema di feature toggle, con chiavi annidate fino a quattro livelli, e mi serviva tirarne fuori un sottoinsieme specifico (le chiavi che iniziano con experiment_ e che hanno valore booleano) per metterle in una tabella leggibile da incollare in un ticket. Non avevo voglia di scrivere lo script jq a mano in quel momento. Ho aperto opencode sulla cartella del dump, ho dato in contesto il file JSON e ho chiesto a Gemma3 4B di proporre un comando jq che facesse il filtro.

La prima versione che ha proposto era quasi corretta ma usava select(type == "boolean") senza prima fare paths(...) per gestire il nesting, e su un blob annidato come quello non funzionava. Gli ho detto di rifare il filtro tenendo conto della profondità arbitraria, ed è uscito con paths(scalars) as $p | select($p[-1] | tostring | startswith("experiment_")) combinato con un check sul tipo del valore. Ho lanciato il comando, ho ottenuto la lista pulita, l’ho formattata come tabella markdown e l’ho incollata nel ticket. Trenta minuti scarsi per una rogna che mi avrebbe rubato il doppio del tempo a farla in piedi a mano.

Cosa fa bene

La latenza percepita su Apple Silicon è il suo punto di forza assoluto: la prima parola arriva quasi sempre prima che il mio cervello finisca di pensare alla domanda. Per task brevi (spiegazioni di parametri di tool, mini-script, formattazione di dati, domande dirette su sintassi) è imbattibile come compromesso tra qualità e velocità. La multimodalità su immagini singole è utile per descrivere screenshot o leggere testo da una foto.

Cosa fa meno bene

Per task lunghi e complessi i suoi 4B di parametri si vedono: tende a perdere il filo, semplifica troppo, e su pattern di codice non banali sbaglia con grande aplomb. Sulla finestra di contesto, anche spinta a 8k, non regge file molto grandi: meglio passargli un estratto rilevante che il file intero. Per code review serie o reasoning su problemi sfumati va sostituito con modelli più grossi su altre macchine.

Privacy: tutto resta sul mio host

Gemma3 gira interamente sul Mac Mini: nessun provider terzo, nessun upload, nessuna telemetria di default. Ollama si lega su 127.0.0.1:11434 e non parla con l’esterno. I log restano in ~/.ollama/logs/, li cancello con un rm quando voglio, e non c’è alcuna policy esterna da rileggere. Rispetto ai servizi cloud, dove ogni prompt passa per server di terzi (con retention variabile e in qualche caso riuso per training salvo opt-out), qui le immagini, i dump JSON e i frammenti di codice che gli passo non escono mai dalla rete di casa. La Gemma License, pur semi-permissiva, mi lascia comunque libero per gli usi reali che faccio in homelab; vale la pena leggere la use policy una volta e archiviarla.

In pratica

Gemma3 4B sul Mac Mini è il modello istantaneo per task brevi che non vogliono attesa. Quando serve code review seria sul server passo a Qwen2.5-Coder 14B, per reasoning step-by-step apro DeepSeek-R1 7b, e per il motore quotidiano sul laptop tengo qwen3:8b. La differenza la fa avere il modello giusto sulla macchina giusta in base a quanto contesto serve e a quanto tempo voglio aspettare.


Immagine generata con ComfyUI Mac M1 / RealVisXL V5 Lightning.

Articolo originale su rpi.temporiti.net