La sempre più ampia disponibilità di Large Language Models (LLM) open source offre la concreta possibilità di eseguire modelli generativi in locale, sfruttando la potenza di calcolo dei propri sistemi. Transformers.js è una libreria JavaScript che consente l'esecuzione diretta dei modelli basati su Transformer direttamente nel browser, senza la necessità di appoggiarsi a un sistema server.
Transformers.js è progettata per essere funzionalmente equivalente alla libreria Python transformers
, supportando una vasta gamma di compiti per quanto riguarda l'elaborazione del linguaggio naturale, la computer vision, l'elaborazione audio e le applicazioni multimodali.
La libreria supporta vari modelli preallenati per svolgere compiti come la sintesi del testo, la classificazione (anche delle immagini) e la generazione, il riconoscimento vocale. Fornisce anche un'API funzionalmente simile al comportamento della libreria Python, rendendo facile per gli sviluppatori che già hanno familiarità con la versione Python, di passare alla versione JavaScript.
Uno strumento come Transformers.js si rivela particolarmente utile per l'esecuzione di modelli di machine learning nel browser e permette agli sviluppatori di scegliere i modelli più adatti per i loro specifici progetti.
Come iniziare a usare Transformers.js nel browser
Per iniziare a lavorare con Transformers.js, gli sviluppatori possono creare un nuovo progetto Node.js e installare la libreria tramite npm. Possono quindi creare un nuovo file chiamato app.js
, che sarà il punto di ingresso per la loro applicazione.
A seconda che si utilizzi ESM (ECMAScript Modules) o CommonJS, ciascun programmatore deve importare la libreria Transformers.js in modo diverso. ESM è uno standard per l'importazione ed esportazione di moduli in JavaScript. Con ESM, è possibile organizzare il codice in moduli separati, rendendo più facile la gestione e la manutenzione di progetti complessi. È supportato dai browser moderni e da Node.js, consentendo agli sviluppatori di utilizzare una sintassi più chiara e dichiarativa per gestire le dipendenze tra i moduli.
In CommonJS i moduli sono definiti utilizzando la sintassi require
per l'importazione e module.exports
per l'esportazione. Questo approccio è stato ampiamente utilizzato in passato ed è ancora comune in molti progetti Node.js legacy. ESM è più moderno ed è considerato un vero e proprio punto di riferimento per lo sviluppo JavaScript.
Proprio come nella libreria Python, Transformers.js supporta l'API pipeline. Le pipeline raggruppano un modello preaddestrato con il preprocessing degli input e il postprocessing degli output, rendendole il modo più semplice per eseguire modelli con la libreria. Nell'esempio seguente, in cui si utilizza appunto codice JavaScript, si analizza il sentiment dell'utente che traspare dalle informazioni fornite in ingresso:
import { pipeline } from '@xenova/transformers';
// Alloca una pipeline per l'analisi del sentiment
let pipe = await pipeline('sentiment-analysis');let out = await pipe('Amo i transformers!');
// [{'label': 'POSITIVE', 'score': 0.999817686}]
La funzione pipeline
a inizio codice, è utilizzata per creare un'istanza di una pipeline che contiene un modello preaddestrato per l'analisi del sentiment. Il termine sentiment si riferisce al sentimento o all'emozione associata a un determinato testo, frase, documento o altro tipo di input linguistico. Nell'ambito dell'analisi del testo, l'analisi del sentiment è il processo di identificazione e classificazione del sentimento espresso nel testo in base a categorie predefinite (i.e. positivo, neutro o negativo).
Installazione e utilizzo della libreria Transformers.js
Per cominciare a usare Transformers.js e sondarne subito tutte le sue potenzialità, è sufficiente effettuarne l'installazione tramite npm. In alternativa, però, basta richiamare la libreria da remoto, facendo riferimento a una CDN o a un servizio di hosting.
Nel primo caso, basta introdurre il seguente comando per procedere con l'installazione via npm:
npm i @xenova/transformers
In alternativa, si può importare la libreria nel codice JavaScript utilizzando il seguente sorgente:
<script type="module">
import { pipeline } from 'https://cdn.jsdelivr.net/npm/@xenova/transformers@2.17.1';
</script>
Le applicazioni di esempio disponibili qui permettono di provare i benefici di Transformers.js senza neppure digitare una riga di codice.
Per impostazione predefinita, Transformers.js utilizza modelli preaddestrati ospitati su server "ad hoc" e binari WASM precompilati, che dovrebbero funzionare immediatamente. È comunque possibile personalizzare questi comportamenti come indicato in questa sezione.
Conversione del modello in ONNX e quantizzazione
Gli sviluppatori di Transformers.js offrono anche le indicazioni pratiche per convertire i modelli in ONNX e quantizzarli.
La conversione ONNX consente di adattare ciascun modello al formato Open Neural Network Exchange (ONNX). ONNX è un formato di scambio di modelli per l'intelligenza artificiale supportato da diverse librerie di machine learning, tra cui PyTorch, TensorFlow e MXNet.
Il processo di conversione consente di ottenere diversi vantaggi in termini di portabilità, efficienza, interoperabilità e ottimizzazione. Una volta ottenuto un file ONNX, infatti, il modello può essere utilizzato su diverse piattaforme e framework senza doverlo riaddestrare. Questo rende più facile distribuire e utilizzare il modello in ambienti diversi, come dispositivi mobili e browser Web.
ONNX massimizza l'efficienza durante l'esecuzione dei modelli, consentendo l'ottenimento di buone prestazioni anche su dispositivi con risorse limitate. Per comprendere i vantaggi sul piano dell'interoperabilità, basti pensare che un modello convertito da PyTorch a ONNX può essere eseguito senza problemi in TensorFlow.
Con la quantizzazione del modello è possibile renderlo più compatto, riducendone le dimensioni, e migliorarne l'efficienza computazionale senza compromettere significativamente le prestazioni. I parametri del modello, che di solito sono rappresentati come numeri in virgola mobile a precisione singola o doppia, sono convertiti in numeri a precisione inferiore, ad esempio numeri a virgola mobile a 16 bit o numeri interi a 8 bit.