Ormai è sempre più difficile tenere traccia dei modelli LLM o comunque generativi con annunci che continuamente spostano l’attenzione promettendo prestazioni mirabolanti (che spesso deludono nella realtà di tutti i giorni). È quindi importante cercare di capire come si possa familiarizzare l’esecuzione di questi modelli fino a realizzare sistemi autonomi completamente offline basati su AI generativa.
Mi sono avventurato lungo questa strada per assicurarmi che il sistema OpenSource che ho sviluppato (Oraculum) potesse funzionare anche offline, magari su dispositivi molto piccoli come, ad esempio, il nuovo Raspberry Pi 5.
Il progetto Ollama: una soluzione universale
Tra gli innumerevoli progetti open source capaci di eseguire modelli in vari formati troviamo uno decisamente degno di nota, capace di eseguire su tutte le piattaforme, da Windows a Mac, a Linux, e anche dal grande server fino al Raspberry Pi: ollama.
Il progetto, costruito sul motore di esecuzione di modelli basati sull’architettura Transformers llama.cpp, offre un’incredibile semplicità d’uso sia attraverso una command line che mediante una buona implementazione dell’API di OpenAI. Gli annunci sul sito si susseguono, recentemente è stato aggiunto il supporto per le schede grafiche AMD ed è in arrivo anche per la piattaforma embedded di nvidia Jetson, molto popolare nel settore della robotica.
Degno di nota è l’aggiunta recente del supporto per i modelli di embeddings, modelli molto popolari per calcolare i vettori che i Vector database come Weaviate usano per indicizzare i record; questa novità include non solo l’abilità di eseguire questa particolare tipologia di modelli ma anche l’aggiunta del supporto all’API compatibile con gli endpoint /v1/embeddings di OpenAI.
Come installare ollama
L’installazione del sistema è veramente semplice, su Windows e Mac si tratta di eseguire installer standard, mentre su Linux è sufficiente eseguire la seguente riga di comando:
curl -fsSL https://ollama.com/install.sh | sh
L’installer per linux funziona su tutte le piattaforme che ho provato, incluso Raspian, la variante del sistema operativo in esecuzione su Raspberry Pi. Se si vuole provare l’ebbrezza di eseguire un LLM su un piccolo dispositivo come il Raspberry si raccomanda comunque una versione con almeno 8GB di RAM altrimenti sarà la memoria a rappresentare il vero collo di bottiglia dell’esecuzione.
Al termine dell’installazione sarà disponibile un servizio sulla propria macchina che ascolta sulla porta TCP 11434 dell’indirizzo 127.0.0.1 (ovverosia è accessibile solo localmente). Il server supporta le API di OpenAI, è quindi possibile utilizzare una delle numerose librerie già disponibili per GPT e semplicemente cambiando l’indirizzo del servizio consentire l’esecuzione delle proprie applicazioni AI sulla macchina locale.
Usare ollama
Il funzionamento di ollama è molto semplice anche se richiede un po’ di familiarità con la riga di comando. La convenzione della command line (CLI) è quella a cui ci hanno abituato sistemi come docker: il comando accetta vari sottocomandi passati come argomenti alla linea di comando per poter operare. Se eseguiamo il comando ollama otteniamo naturalmente una breve descrizione dei comandi disponibili:
Il comando serve è di fatto avviato automaticamente e corrisponde al servizio di cui abbiamo già parlato. I comandi più utili sono quindi run, pull, list, rm che rispettivamente consentono di eseguire (e scaricare contestualmente qualora i file non siano disponibili localmente), scaricare, mostrare e rimuovere i modelli ottenuti dal catalogo online:
Quando si esegue un particolare modello (ad esempio mistral) è facile verificare l’uso delle risorse: sul mio laptop Windows con una GPU nVidia è facile vedere come un modello 7B stia all’interno della memoria video:
Siamo quindi pronti ad eseguire un modello e fornire il prompt a riga di comando:
L’esperienza che abbiamo maturato in pochi mesi rende abbastanza semplice formulare prompt che producano risposte interessanti e forniscano informazioni sul comportamento del particolare modello.
Come si può osservare anche la capacità di parlare italiano varia da modello a modello così come variano le sue prestazioni. Nell’esempio il prompt italiano è stato perfettamente compreso ma l’output è in inglese.
L’analisi delle immagini
Possiamo quindi passare il percorso a un’immagine jpeg da analizzare, come ad esempio la seguente:
L’analisi effettuata dal modello è decisamente impressionante, anche tenendo conto del fatto che si tratta di una foto che ho scattato e sicuramente non può essere parte dei dati di addestramento:
La generazione di codice
Oltre ai modelli orientati al linguaggio naturale, troviamo modelli come codellama, codegemma, sqlcoder, ovverosia modelli addestrati per generare codice. È possibile utilizzare questi modelli per analizzare programmi, o generare nuovi programmi con una ragionevole qualità.
L’opzione –verbose del comando run consente di mostrare le statistiche di esecuzione che possono aiutare ad ottenere delle informazioni sulle prestazioni nel restituire il risultato.
È curioso come lo stesso modello possa rispondere sia in italiano che in inglese, e è facile osservare come i modelli più piccoli (in questo caso gemma 2B) tendano a rispondere in modo più fantasioso:
Le prestazioni su Raspberry Pi 5
L’esecuzione di ollama su Raspberry Pi assomiglia in tutto e per tutto a quella su un PC o su un server, anche se le prestazioni sono ovviamente inferiori rispetto ad altri sistemi. Il modello Gemma 2B esegue in modo sufficientemente rapido, nonostante l’esiguità delle risorse di calcolo disponibili. Se proviamo a caricare modelli più grandi le prestazioni degradano significativamente (ho testato su Raspberry Pi 5 con 8GB di RAM). È inoltre difficile eseguire sul Raspberry sia il modello che il codice che lo usa, per ora è quindi più realistica l’esecuzione su un “cluster” di Raspberry Pi piuttosto che su un sistema singolo: su un nodo viene eseguito il modello, mentre su un altro esegue il codice che mediante l’API usa i suoi servizi.
Conclusioni
Ollama è un sistema che consente di sperimentare con i modelli di AI generativa senza troppo sforzo. Grazie all’eccellente implementazione dell’API di OpenAI è possibile integrare modelli arbitrari in sistemi già scritti, consentendo la realizzazione di sistemi capaci di eseguire localmente.
Il framework supporta sempre più acceleratori per i calcoli (per ora non sono supportate le NPU che gli AI PC renderanno decisamente disponibili, ma ritengo si tratti solo di una questione di tempo). Grazie a progetti come questo è possibile sperimentare senza perdersi dietro ad incredibili quantità di documenti e righe di comando Python.