Phi3, appena rilasciato da Microsoft, è un modello dalla dimensione compatta capace di eseguire efficientemente su un laptop, ma dal comportamento decisamente sorprendente e con una buona capacità di gestire l’italiano.
Ma come si comporta nella pratica? E quali sono le implicazioni della quantizzazione per l’esecuzione su dispositivi personali?
Cosa ci dice il numero di parametri di un modello LLM
Partiamo da un assunto: non è una novità che il numero di parametri di un modello LLM non ne determini interamente il comportamento, OpenAI stessa dopo aver annunciato i 175 miliardi di parametri di GPT-3.5 ha commentato che GPT-4 non seguiva la stessa filosofia e probabilmente l’abilità dell’allora nuovo modello non era dovuto a un numero di parametri stimato dieci volte superiore.
Se si ricorda che i parametri rappresentano la “forza” della connessione tra neuroni e che vengono “aggiustati” durante l’apprendimento è evidente che la quantità di informazione che una rete può apprendere è proporzionale a questo numero. Non stiamo però parlando della memoria di un calcolatore: la rete neurale non trattiene l’informazione in modo esatto e quindi non è vero che 175 miliardi di parametri contengono 350 gigabyte di informazione in modo esatto, l’effetto che ciascun peso può avere durante l’esecuzione della rete contribuisce alla generazione di informazione senza però essere dedicato ad una funzione specifica come, ad esempio, memorizzare una particolare informazione. Non deve quindi sorprendere come si parli spesso di modelli che con soli 8 miliardi di parametri si comportano, almeno in alcuni casi, meglio di modelli come GPT-3.5 che sono venti volte più grandi.
Perché è importante l’efficienza dei modelli di dimensioni ridotte
In pochi mesi ci siamo abituati a pensare che “almeno” 7-8 miliardi di parametri siano però necessari per avere un modello LLM che sia di una qualche utilità e con ragionevoli capacità di ragionamento, non può quindi non sorprendere un modello come Phi3 appena rilasciato da Microsoft capace di esibire comportamenti di questa classe nonostante si limiti ad avere tre miliardi di parametri.
Si tratta di un tema molto importante: il numero di parametri non è solo correlato all’informazione, ma anche alla velocità di esecuzione: disponendo di una GPU l’esecuzione beneficia se il modello sta in memoria, e in generale le prestazioni dipendono direttamente dal numero di parametri. Su un piccolo dispositivo come Raspberry Pi 5, ad esempio, è realistico eseguire il modello Gemma 2B di Google non certamente la sua controparte Gemma 7B.
La disponibilità di modelli “piccoli” è quindi molto importante in un’ottica di poter eseguire sistemi AI sui propri PC (anche alla luce dei nuovi processori di Intel che nel 2023 ha lanciato l’AI PC, ovvero un PC con un processore capace di eseguire modelli di AI in modo efficiente nel processore grazie ad una NPU integrata). La possibilità di beneficiare di sistemi AI completamente offline e su dispositivi computazionalmente poco capaci come smartphone o PC, magari in modo rispettoso della batteria, apre nuovi scenari di personal AI o automazione, capaci di eseguire anche offline.
Phi3: un modello LLM sorprendentemente efficace
Provare il modello Phi3 è molto semplice: si può utilizzare ollama a riga di comando oppure il tool grafico LM Studio e cercare una delle varianti del modello phi3 di cui discuteremo a breve.
Per testare il modello ho usato il prompt “Un mattone pesa 2kg più mezzo mattone, quanto pesa un mattone?”, una variante di un classico indovinello che cambiando il valore da 1kg a 2kg evita che la risposta sia data per conoscenza e non per ragionamento. Devo notare che l’uso dell’unità di misura kg invece del familiare “due chili” aiuta molto il modello a rispondere correttamente.
Ho condotto la maggior parte dei test su un server senza GPU (ma con processori Intel Xeon molto più performanti della controparte PC), solo in un caso ho eseguito il modello sul mio laptop (che comunque ha una GPU nVidia) per verificare quanto il modello possa eseguire localmente in modo efficiente. In tutti i casi ho chiesto ad ollama di mostrare le prestazioni nel rispondere in modo che ci si possa rendere conto anche dell’efficienza del modello.
Innanzitutto, vediamo come si comporta Llama3 8B con il prompt:
È importante osservare che, se si ripete la stessa domanda, si ottiene un ragionamento analogo ma con la risposta di 3kg e non 4 come ci si aspetterebbe anche usando Llama3.
Testando il modello Phi3: prestazioni e comportamenti
Ora se ripetiamo lo stesso prompt con una variante del modello Phi3 otteniamo:
Il modello in questo caso si comporta in modo simile a Llama3 8B nonostante abbia meno della metà dei parametri! Per quanto riguarda l’efficienza i due modelli sono confrontabili poiché il server usato dispone di molta memoria e i modelli usati usano una tecnica chiamata “quantizzazione” che consente di evitare l’aritmetica in virgola mobile (sacrificando in parte l’accuratezza del modello). Se usiamo la variante di Phi3 in virgola mobile le prestazioni calano:
Come si può osservare il modello si comporta in modo decisamente sorprendente data la sua taglia e non sfigura certo rispetto a GPT-3.5:
Negli esempi riportati ho considerato le risposte “buone” di Phi3 (e di Llama3), ma ripetendo più volte la domanda si ottengono risposte curiose come ad esempio:
Quello che colpisce è che la variante con piena precisione del modello Phi3 sbaglia meno frequentemente di quella quantizzata, ma in ogni caso il modello non risponde in modo sempre coerente, e a volte trae conclusioni corrette da ragionamenti errati.
Anche Llama 3 8B, nella sua versione quantizzata, non ci prende sempre, ma esibisce ragionamenti più consistenti e coerenti nella ripetizione del prompt. GPT-3.5 risponde sempre in modo coerente.
È interessante notare come se chiediamo al modello di non esibire il ragionamento ma limitarsi a rispondere con il peso del mattone (“Un mattone pesa 2kg più mezzo mattone, quanto pesa un mattone? Rispondi solo col numero e senza spiegare”) tutti i modelli sbagliano di più, ma mentre GPT-3.5 risponde sempre “3” e Llama 3 8B quasi sempre, Phi3 risponde in modo molto più casuale (8kg, 7kg, 9kg…).
Quantizzare i modelli LLM per migliorare l’efficienza
Ad ogni generazione di un token la rete neurale deve elaborare i parametri del modello, si tratta di un numero spaventoso di operazioni, si usano quindi numerose tecniche per efficientare l’esecuzione del modello, anche a costo di ridurne un po’ la precisione. Una delle tecniche più popolari è quella della quantizzazione, ovvero si rappresentano i pesi delle connessioni usando un certo numero di bit e il calcolo viene approssimato in aritmetica intera in modo da accelerare l’elaborazione. Il modello Phi3 che viene scaricato per default è la versione quantizzata a 4 bit, ovverosia ciascun peso può assumere 16 valori possibili: molti meno dei 65536 valori che possono assumere pesi espressi come numeri in virgola mobile con 16bit del modello etichettato come “phi3:3.8b-mini-instruct-4k-fp16”, questo riduce la memoria necessaria e migliora anche l’efficienza del calcolo (l’aritmetica intera è generalmente più efficiente di quella in virgola mobile), essendo però un’approssimazione del modello originale può rivelarsi meno efficace nel funzionamento.
Questa semplificazione è molto importante per l’esecuzione di questi modelli su dispositivi personali come PC o anche smartphone e tablet. Basti pensare che l’esecuzione del modello quantizzato di Phi3 sul mio laptop (di fascia alta e con GPU nVidia) è capace di generare 2,71 token/s, poco meno della metà rispetto all’esecuzione su un server dual CPU Xeon. Il modello in virgola mobile invece genera 0,03 token/s, portando a oltre 2 ore il tempo di generazione della risposta.
Conclusioni
Microsoft Phi3 è un modello straordinariamente capace date le dimensioni, con le impostazioni predefinite è un po’ creativo nella generazione del testo e un po’ più soggetto ad allucinazioni rispetto a modelli più grandi, ma la dimensione lo rende adatto alla realizzazione di applicazioni basate su AI personale, sapendo ragionare in modo molto efficace.
È sicuramente un modello LLM molto interessante, capace di generare anche un buon italiano, che dimostra come sia possibile generare modelli efficaci con meno di sette miliardi di parametri.