Sperimentiamo in locale l’LLM Google Gemma con Ollama e Hugging Face
Indice dell'articolo
Recentemente, Google ha rilasciato una nuova serie di modelli che prende il nome di Google Gemma, in due diversi dimensionamenti, il 7b a 7 miliardi di parametri ed il 2b a 2 miliardi. Gemma mira quindi a presentarsi come LLM estremamente leggero, tale quindi da poter essere usato anche su hardware senza configurazioni particolarmente spinte, soprattutto in termini di memoria della GPU. Al contempo, però, i modelli Gemma sono pensati per avere una buona accuratezza ed efficienza. Si tratta di un modello linguistico open source che, insieme a Gemini, rientra nei nuovi scenari che Google propone per l’Intelligenza Artificiale: non a caso, Gemma è stato presentato dal suo creatore come lo stato dell’arte dei modelli open.
In questo articolo, vedremo Gemma al lavoro e grazie al suo agevole innesto nei contesti attuali per la distribuzione dei modelli il suo utilizzo all’interno dei nostri programmi sarà estremamente comodo. Sulle pagine di questo sito abbiamo visto almeno due opzioni che permettono di sperimentare comodamente un modello:
- Ollama, un tool comodissimo per utilizzare un modello in locale che soprattutto nella versione come immagine Docker presenta un avvio altrettanto rapido;
- Hugging Face, un hub di modelli e dataset con librerie di transformer e tokenizer utilizzabili in Google Colab o altri ambienti Python.
Dopo un pò di orientamento iniziale, possiamo a questo punto iniziare.
Gemma su Ollama
Facciamo subito la conoscenza del modello provandolo su Ollama. Noi, come già detto, prediligiamo la velocità dell’approccio con Docker ma si può procedere come meglio si crede.
Lanciamo Ollama in Docker con:
$ docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
e non appena avremo il container running richiamiamo il modello: scegliamo in questo caso gemma:7b
.
$ docker exec -it ollama ollama run gemma:7b
In realtà non si tratta di altro che dell’esecuzione del comando ollama run gemma:7b
all’interno del container. Trattandosi di un modello particolarmente capace di generare testo, una volta avviato (lo capiremo dall’apparizione di un prompt contraddistinto dalla sequenza di simboli >>>
che richiederà input utente) gli forniamo la nostra richiesta (proviamo in Italiano!): generare una poesia d’amore in 10 righe
>>> scrivi una poesia d'amore di 10 righe
Il tuo sorriso, un raggio d'oro,
luce che scende su di me come un vento.
La tua mano, un luogo dove riposare,
il tuo cuore, un porto sicuro.
L'amore ti ha insegnato a vivere,
a volare alto e a realizzare i tuoi sogni.
La tua voce, un ritmo che mi suona,
il tuo amore, un dono prezioso.
Con te al mio fianco, non ho paura,
il futuro è un viaggio di due.
Questa è testualmente la sua risposta, generata tra l’altro quasi di getto quindi con performance ottime. Se tralasciamo qualche termine da correggere per arrivare a un Italiano del tutto corretto, potremmo dire che Gemma ha compiuto un ottimo lavoro. Si tratta effettivamente di dieci righe che racchiudono una poesia romantica.
Dopo questo primo approccio, possiamo passare ad una sperimentazione più tecnica, usando Python e HuggingFace.
Gemma su HuggingFace
HuggingFace è ormai uno dei punti di partenza principali per avviarsi a qualsiasi esplorazione di un LLM. In particolare, anche per Gemma sono state predisposte apposite pagine con tutta la documentazione del modello, sia per la versione 7b sia per quella 2b.
Il nostro scopo sarà quello di utilizzare il modello così com’è, fidandoci del suo preaddestramento.
Come tanti altri casi sarà importante fare alcune scelte come, per esempio, decidere se lavorare in pipeline o se gestire il flusso manualmente. Ricordiamo che HuggingFace offre la pipeline come meccanismo di alto livello per inglobare tutta una serie di passaggi e di fasi che altrimenti dovremmo gestire personalmente. La pipeline permette di accedere velocemente al nostro modello, pur potendo essere personalizzata all’occorrenza.
Con la pipeline, l’accesso al codice sarà ancora più veloce in quanto non dovremo attivare personalmente le fasi di pre-processing, utilizzo del modello e post-processing ma essenzialmente sarà sufficiente dire quale task vogliamo compiere (per esempio: text-generation).
Altro aspetto importante sarà – spesso in base ai nostri scopi (produzione, sviluppo, sperimentazione, studio) – se utilizzare la CPU o la GPU mediante driver CUDA. In entrambi i casi, il codice non subirà grandi variazioni.
Ricordiamo che per l’utilizzo in un notebook tipo quelli di Colab ci servirà una chiave HuggingFace, per la quale dovremo:
- farne richiesta nel portale HuggingFace nella sezione Access Tokens delle impostazioni del proprio account;
- impostarla come secret di nome HF_TOKEN tra i secret di Colab (si trovano facilmente osservando una icona a forma di chiave sulla sinistra) o metterla a disposizione come variabile d’ambiente di qualsiasi spazio di lavoro che avremo scelto.
Se vogliamo usare una pipeline è sufficiente fare questo:
# 1. importiamo la libreria dei transformers
from transformers import pipeline
# richiediamo una pipeline per la gestione di un task di text generation con gemma
pipe = pipeline("text-generation", model="google/gemma-7b")
Sarà così sufficiente passare all’oggetto pipe
la nostra richiesta.
In alternativa, senza creare pipeline ma passando direttamente per le varie componenti, potremo passare direttamente per un Tokenizer, che:
- riceverà il nostro prompt;
- lo trasformerà in token di input;
- usando questi ultimi, genererà una risposta tokenizzata;
- decodificherà i token in output del punto precedente in testo leggibile da un essere umano.
Ecco del codice di esempio, basato su gemma-2b:
from transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("google/gemma-2b")
model = AutoModelForCausalLM.from_pretrained("google/gemma-2b")
prompt = "Tell me a recipe with tuna"
input_tokens = tokenizer(prompt, return_tensors="pt")
output = model.generate(**input_tokens, max_length=1024)
print(tokenizer.decode(output[0]))
In questo caso, abbiamo chiesto qualche suggerimento su una ricetta a base di tonno.
Conclusioni
Con Gemma si aprono quindi ancora grandi scenari di utilizzo, molto adattabili ma al contempo completi per ogni possibile risultato. Ora con Gemini l’accoppiata di Google sembra perfetta e questo è solo un primo passo in un contesto in cui di evoluzioni ne vedremo sicuramente ancora molte.