Intelligenza artificiale
PowerInfer: Motore di Inferenza Rapido per Modelli Linguistici di Grande Scala con GPU di Fascia Consumatori

A causa delle loro eccezionali capacità di creazione di contenuti, i Modelli Linguistici Generativi di Grande Scala sono ora all’avanguardia della rivoluzione dell’IA, con sforzi in corso per migliorare le loro capacità generative. Tuttavia, nonostante i rapidi progressi, questi modelli richiedono una notevole potenza computazionale e risorse. Ciò è dovuto in gran parte al fatto che sono composti da centinaia di miliardi di parametri. Inoltre, per funzionare senza problemi, i modelli di intelligenza artificiale generativa si basano su migliaia di GPU, il che porta a costi operativi significativi. Le alte esigenze operative sono una delle principali ragioni per cui i modelli di intelligenza artificiale generativa non sono ancora stati efficacemente distribuiti su dispositivi personali.
In questo articolo, discuteremo di PowerInfer, un motore di inferenza ad alta velocità progettato per computer standard alimentati da una singola GPU di fascia consumatori. Il framework PowerInfer mira a sfruttare l’elevata località intrinseca nell’inferenza dei modelli linguistici, caratterizzata da una distribuzione di potenza nella attivazione dei neuroni. Ciò significa che in qualsiasi momento, un piccolo subset di neuroni “caldi” è costantemente attivo attraverso gli input, mentre il resto, definiti neuroni “freddi”, si attivano in base a input specifici o requisiti. Questo approccio consente al framework PowerInfer di ridurre la potenza di calcolo necessaria per la produzione di output desiderati dell’intelligenza artificiale generativa.
Esploreremo il framework PowerInfer nel dettaglio, esaminando la sua metodologia, pipeline e risultati pratici di applicazione. Iniziamo.
PowerInfer: Motore di Inferenza Rapido per Modelli Linguistici di Grande Scala con GPU di Fascia Consumatori
I Modelli Linguistici Generativi di Grande Scala, come ChatGPT e DALL-E, sono noti per le loro sofisticate capacità generative e di elaborazione del linguaggio naturale. A causa delle loro elevate esigenze computazionali, questi modelli vengono tipicamente distribuiti in data center con GPU avanzate. La necessità di tale elevata potenza computazionale limita la loro distribuzione ai data center, sottolineando la necessità di distribuire i modelli linguistici di grande scala su piattaforme locali più accessibili come i computer personali.
Aumentare l’accessibilità dei modelli linguistici di grande scala potrebbe ridurre i costi di inferenza e generazione di contenuti, migliorare la privacy dei dati e consentire la personalizzazione dei modelli. Inoltre, mentre la distribuzione nei data center priorizza l’elevata velocità di throughput, le distribuzioni locali dei modelli linguistici potrebbero concentrarsi sulla bassa latenza a causa delle dimensioni dei lotti più piccole.
Tuttavia, la distribuzione di questi modelli su dispositivi locali presenta sfide significative a causa delle loro sostanziali esigenze di memoria. I modelli linguistici di grande scala, che funzionano come trasformatori autoregressivi, generano testo token per token, con ogni token che richiede l’accesso all’intero modello, composto da centinaia di miliardi di parametri. Ciò richiede numerose GPU di fascia alta per la generazione di output a bassa latenza. Inoltre, le distribuzioni locali tipicamente elaborano le richieste individuali in sequenza, limitando la possibilità di elaborazione parallela.
Per affrontare le complesse esigenze di memoria del framework di intelligenza artificiale generativa, le soluzioni esistenti utilizzano metodi come l’offloading del modello e la compressione. Tecniche come la distillazione, la potatura e la quantizzazione riducono le dimensioni del modello, ma sono ancora troppo grandi per le GPU di fascia standard nei computer personali. L’offloading del modello, che partiziona il modello al livello del trasformatore tra CPU e GPU, consente l’elaborazione distribuita dei livelli attraverso la memoria CPU e GPU. Tuttavia, questo metodo è limitato dalla lenta interconnessione PCIe e dalle limitate capacità computazionali delle CPU, portando a un’elevata latenza di inferenza.
Il framework PowerInfer sostiene che la mancanza di corrispondenza tra le caratteristiche di inferenza dei modelli linguistici e la struttura hardware è la principale causa dei problemi di memoria nell’inferenza dei modelli linguistici. Idealmente, i dati a cui si accede frequentemente dovrebbero essere archiviati in GPU a larghezza di banda elevata e capacità limitata, mentre i dati a cui si accede meno frequentemente dovrebbero essere in CPU a bassa larghezza di banda e alta capacità. Tuttavia, il grande volume di parametri di ogni iterazione di inferenza del modello linguistico rende l’insieme di lavoro troppo grande per una singola GPU, portando a un uso inefficiente della località.
Il processo di inferenza nei modelli linguistici di grande scala dimostra un’elevata località, con ogni iterazione che attiva un numero limitato di neuroni. Il framework PowerInfer mira a sfruttare questa località gestendo un piccolo numero di neuroni “caldi” con la GPU, mentre la CPU gestisce i neuroni “freddi”. Preseleziona e pre-carica i neuroni “caldi” nella GPU e identifica i neuroni attivati durante l’esecuzione. Questo approccio minimizza i costosi trasferimenti di dati PCIe, consentendo alle GPU e alle CPU di elaborare in modo indipendente i neuroni assegnati.
Tuttavia, la distribuzione dei modelli linguistici su dispositivi locali affronta ostacoli. I predictor online, cruciali per l’identificazione dei neuroni attivati, consumano una notevole quantità di memoria GPU. Il framework PowerInfer utilizza un metodo adattivo per costruire predictor piccoli per i livelli con una maggiore inclinazione e sparsità, mantenendo l’accuratezza mentre riduce le dimensioni. Inoltre, i framework di modelli linguistici richiedono operatori sparsi specializzati. Il framework PowerInfer utilizza operatori sparsi consapevoli dei neuroni che comunicano direttamente con i neuroni, eliminando la necessità di conversione in formato denso durante l’esecuzione.
Infine, collocare in modo ottimale i neuroni attivati tra la CPU e la GPU è una sfida. Il framework PowerInfer utilizza una fase offline per creare una politica di collocazione dei neuroni, misurando l’impatto di ogni neurone sui risultati dell’inferenza del modello linguistico e inquadrandolo come un problema lineare intero.
Architettura e Metodologia
La seguente figura illustra l’architettura del framework PowerInfer, composta da componenti offline e online nella pipeline.

Grazie alla variazione osservata nelle proprietà di località tra i diversi modelli linguistici di grande scala, il componente offline profila la sparsità di attivazione del framework del modello linguistico, consentendo di differenziare tra neuroni “caldi” e “freddi”. D’altra parte, nella fase offline, due tipi di neuroni vengono caricati dal motore di inferenza nella CPU e nella GPU, servendo così le richieste del modello linguistico durante l’esecuzione con bassa latenza.
Fase Offline: Risolutore di Politiche e Profilatore del Modello Linguistico
Nella fase offline, un componente di profilatura del modello linguistico utilizza richieste derivate da un set di dati generale per raccogliere dati di attivazione dal processo di inferenza. Nel primo passaggio, monitora l’attivazione dei neuroni in tutti i livelli del framework e utilizza un componente di risoluzione di politiche per categorizzare i neuroni come “caldi” o “freddi”. L’obiettivo principale del risolitore di politiche è allocare i neuroni attivati più frequentemente ai livelli della GPU, mentre gli altri vengono allocati ai livelli della CPU. Nel secondo passaggio, il componente di risoluzione di politiche utilizza metriche di impatto dei neuroni e specifiche hardware per bilanciare il carico di lavoro tra i livelli e massimizzare la metrica di impatto della GPU per i neuroni utilizzando la programmazione lineare intera.
Fase Online: Motore di Inferenza del Modello Linguistico Consapevole dei Neuroni
Una volta eseguita con successo la fase offline, il framework procede all’esecuzione della fase online. Nel terzo passaggio del processo, il motore online assegna i neuroni “caldi” e “freddi” alle rispettive unità di elaborazione in base all’output del risolitore di politiche offline. Durante l’esecuzione e nel quarto passaggio, il motore online gestisce i calcoli GPU-CPU creando esecutori CPU e GPU che sono thread in esecuzione sul lato CPU. Il motore prevede i neuroni attivati e procede a saltare i neuroni non attivati. I neuroni attivati vengono quindi precaricati nella GPU per l’elaborazione. Nel frattempo, la CPU calcola e trasferisce i risultati per i suoi neuroni da integrare con la GPU. Il motore online è in grado di concentrarsi su singole righe e colonne all’interno delle matrici perché utilizza operatori sparsi consapevoli dei neuroni sulla CPU e sulla GPU.

Predictor di Sparsità Adattivi
Il concetto principale alla base della riduzione dei carichi computazionali del motore di inferenza online nel framework PowerInfer è che esso elabora solo i neuroni che prevede siano attivati. Tradizionalmente, all’interno di ogni livello del trasformatore, un framework utilizza due predictor diversi per prevedere l’attivazione dei neuroni nei blocchi MLP e di auto-attenzione, in quanto il calcolo di inferenza è limitato ai neuroni previsti come attivi. Tuttavia, è difficile progettare predictor efficaci per la distribuzione locale a causa della limitata quantità di risorse, che rende difficile bilanciare le dimensioni del modello e l’accuratezza della previsione. Poiché questi predictor vengono utilizzati frequentemente dal framework per prevedere i neuroni attivati, devono essere archiviati nella GPU per consentire un accesso più rapido. Tuttavia, i framework di solito distribuiscono un gran numero di predictor che occupano una notevole quantità di memoria, anche quella necessaria per archiviare i parametri del modello linguistico.
Inoltre, le dimensioni dei predictor sono generalmente determinate da due fattori: la sparsità interna e la sparsità dei livelli del modello linguistico.

Per ottimizzare questi fattori, il framework PowerInfer utilizza un metodo di addestramento iterativo per ogni predictor nel livello del trasformatore senza una dimensione fissa. Nel primo passaggio di questo metodo di addestramento, le dimensioni del modello di base vengono stabilite in base al profilo di sparsità del modello, e le dimensioni del modello vengono regolate iterativamente tenendo conto della sparsità interna per mantenere l’accuratezza.
Collocazione e Gestione dei Neuroni
Come menzionato in precedenza, mentre il componente di risoluzione di politiche offline determina la politica di collocazione dei neuroni, il componente di inferenza online del motore carica il modello nella memoria della GPU e della CPU in base alla politica generata. Per ogni livello che può o non può avere più matrici di pesi, il framework PowerInfer assegna ogni neurone alla CPU o alla GPU in base a是否 il neurone è attivato “caldo”. Assicurarsi di calcolare in modo accurato i neuroni segmentati nella sequenza determinata è essenziale per risultati precisi. Per affrontare questo, il framework PowerInfer genera due tabelle di neuroni: una situata nella memoria della GPU e una nella memoria della CPU, con ogni tabella che correla singoli neuroni alla loro posizione originale nella matrice.
Operatore Consapevole dei Neuroni
Considerata la sparsità di attivazione osservata nei modelli linguistici di grande scala, i neuroni inattivi e i loro pesi possono essere bypassati dalle operazioni di moltiplicazione matriciale, creando così la necessità di utilizzare operatori sparsi. Invece di utilizzare operatori sparsi che hanno diverse limitazioni, il framework PowerInfer utilizza operatori consapevoli dei neuroni che calcolano i neuroni attivati e i loro pesi direttamente sulla GPU e sulla CPU senza richiedere la conversione in formato denso durante l’esecuzione. Gli operatori consapevoli dei neuroni differiscono dagli operatori sparsi tradizionali in quanto si concentrano su singole righe e colonne all’interno di una singola matrice, piuttosto che concentrarsi sull’intera matrice.
Politica di Collocazione dei Neuroni
Per sfruttare le capacità computazionali delle CPU e delle GPU, il componente offline del framework PowerInfer genera una politica di collocazione che guida il framework quando assegna i neuroni alla CPU o alla GPU. Il componente di risoluzione di politiche genera questa politica e controlla la collocazione dei neuroni all’interno di ogni livello, aiutando a determinare il carico di lavoro computazionale per ogni unità di elaborazione. Quando genera la politica di collocazione, il componente di risoluzione di politiche considera diversi fattori, tra cui la frequenza di attivazione per ogni neurone, l’onere della comunicazione e le capacità computazionali come larghezze di banda e dimensioni di memoria di ogni unità di elaborazione.
Risultati e Implementazione
Per dimostrare le capacità di generalizzazione del framework PowerInfer su dispositivi con diverse configurazioni hardware, gli esperimenti sono stati condotti su due computer personali distinti: uno dotato di processore Intel i9-13900K, GPU NVIDIA RTX 4090 e 192 GB di memoria host, mentre l’altro opera con processore Intel i7-12700K, GPU NVIDIA RTX 2080Ti e 64 GB di memoria host.
Le prestazioni del framework PowerInfer sono state confrontate con quelle di llama.cpp con una dimensione del batch di 1 e impostazioni di distribuzione predefinite. Il framework ha quindi campionato prompt da ChatGPT e Alpaca dati, considerata la variabilità della lunghezza osservata negli input e output del dialogo nel mondo reale. La figura seguente mostra le velocità di generazione per diversi modelli.

Come si può osservare, il framework PowerInfer genera 8,32 token al secondo e raggiunge fino a 16 token generati al secondo, superando così il framework llama.cpp di un margine significativo. Inoltre, man mano che il numero di token di output aumenta, le prestazioni del framework PowerInfer migliorano anche, poiché la fase di generazione ha un impatto significativo sul tempo di inferenza complessivo.

Inoltre, come si può vedere nell’immagine sopra, il framework PowerInfer supera il framework llama.cpp sui computer di fascia bassa con un picco di generazione di 7 token al secondo e una velocità di generazione di token media di 5 token al secondo.

L’immagine sopra mostra la distribuzione del carico di neuroni tra la GPU e la CPU per i due framework. Come si può vedere, il framework PowerInfer aumenta notevolmente la quota di carico di neuroni della GPU, passando dal 20% al 70%.

L’immagine sopra confronta le prestazioni dei due framework su due computer con specifiche diverse. Come si può vedere, il framework PowerInfer consegna costantemente una velocità di generazione di token di output elevata rispetto al framework llama.cpp.
Pensieri Finali
In questo articolo, abbiamo discusso di PowerInfer, un motore di inferenza ad alta velocità per computer standard alimentati da una singola GPU di fascia consumatori. Il framework PowerInfer tenta di sfruttare l’elevata località intrinseca nell’inferenza dei modelli linguistici, un metodo caratterizzato da una distribuzione di potenza nell’attivazione dei neuroni. Il framework PowerInfer è un sistema di interferenza rapido progettato per modelli linguistici di grande scala che utilizza predictor adattivi e operatori consapevoli dei neuroni per attivare i neuroni e la sparsità computazionale.












