Esecuzione dell'inferenza IA su scala nel cloud ibrido

  • Le aree in cui Roblox utilizza l'intelligenza artificiale, in particolare l'intelligenza artificiale generativa, sono cresciute rapidamente negli ultimi anni.

  • Abbiamo raggiunto la parte finale di un processo in tre fasi con l'obiettivo di costruire e ottimizzare l'infrastruttura necessaria per supportare questo livello di strumenti IA.

  • In quest'occasione, intendiamo condividere i passi compiuti verso la costruzione di un'infrastruttura cloud ibrida in grado di supportare l'inferenza dell'apprendimento automatico su vasta scala.

Alla RDC della scorsa settimana, abbiamo annunciato il nostro ultimo progetto di incubazione dell'IA: sviluppare un modello fondante 3D multimodale per alimentare la creazione generativa. L'alimentazione dell'IA per una piattaforma globale 3D immersiva e sempre in funzione, utilizzata da milioni di persone, richiede un'enorme quantità di potenza di calcolo. All'inizio del 2023, supportavamo meno di 50 pipeline di inferenza di apprendimento automatico (ML). Oggi la nostra infrastruttura ne supporta circa 250. Per far funzionare tutti questi modelli, utilizziamo decine di migliaia di CPU e più di mille GPU in due centri dati e nella nostra infrastruttura cloud ibrida. E non abbiamo ancora finito.

In passato abbiamo condiviso la nostra idea di intelligenza artificiale generativa per i creatori, il modo in cui usiamo l'intelligenza artificiale per tenere al sicuro le persone su Roblox e il modo in cui le traduzioni dell'intelligenza artificiale aiutano le persone di tutto il mondo a comunicare. Ma questi sono solo alcuni esempi: Con circa 250 modelli in produzione, praticamente tutte le interazioni su Roblox sono supportate da una qualche forma di IA. Quando una persona entra per la prima volta in Roblox e cerca un'esperienza a cui partecipare, l'IA è all'opera attraverso i nostri sistemi di raccomandazione e ricerca. E quando una persona sceglie un'esperienza, il nostro algoritmo di matchmaking individua il server migliore a cui unirsi.

Milioni di creatori hanno già accesso alla potenza dei nostri strumenti di intelligenza artificiale generativa. Con Assistente, possono utilizzare semplici prompt per generare script e azioni che contribuiscono ad accelerare la creazione di esperienze. Con i nostri strumenti Texture e Material Generator, possono modificare e iterare rapidamente l'aspetto e lo stile degli oggetti. E ora stiamo entrando nell'era dell'intelligenza artificiale generativa 4D con il recente rilascio di Impostazione automatica dell'avatar, che semplifica il processo di creazione di un avatar, consentendo ai creatori di risparmiare ore di lavoro. Al mese di agosto 2024, circa l'8% dei corpi di avatar UGC pubblicati su Roblox sono stati creati utilizzando Impostazione automatica dell'avatar.

Stiamo entrando nella parte finale di un processo in tre fasi che è in corso da diversi anni. Questo viaggio è iniziato alla fine del 2021. All'epoca, la mancanza di una piattaforma IA unificata per Roblox ha portato i team di progettazione a costruire le proprie mini-piattaforme e a scegliere framework diversi. Abbiamo visto team che sviluppavano componenti critici, tra cui il Marketplace degli avatar, la homepage e la ricerca, e ciascuno costruiva la propria ingegneria delle funzionalità. Piuttosto che avvalersi di un archivio di funzionalità centralizzato, i team mettevano insieme soluzioni ad hoc. Inoltre, ogni team aveva l'onere di sviluppare le proprie ottimizzazioni e di affrontare le sfide di scalabilità dell'inferenza in modo indipendente, senza il supporto di una piattaforma principale. Questo approccio frammentato ha evidenziato l'urgente necessità di una piattaforma coesa e centralizzata per semplificare i nostri processi e per migliorare l'efficienza in generale.

Fase uno: costruire una solida base per l'apprendimento automatico

Abbiamo adottato Kubeflow fin dall'inizio per usufruire del suo pacchetto di elementi fondamentali per l'apprendimento automatico, tra cui notebook, pipeline, sperimentazione offline e model serving. Dato che era necessario un archivio di funzionalità, abbiamo adottato una soluzione di terze parti per iniziare. Per rendere l'apprendimento automatico più accessibile agli ingegneri di Roblox, abbiamo sviluppato roblox-ml, una libreria Python che ha ridotto ulteriormente la complessità della distribuzione di un modello in produzione.

Abbiamo utilizzato i notebook Jupyter per fornire un ambiente di sviluppo ottimizzato per l'iterazione dei modelli, con server configurati per l'accesso ai dati e alle risorse GPU necessarie. La scalabilità di un lavoro di formazione o la sua esecuzione regolare per addestrare nuovamente un modello richiedeva in genere la scrittura di una pipeline. La nostra libreria roblox-ml ha consentito agli ingegneri di convertire con facilità il codice del notebook in pipeline Kubeflow, effettuando un'istantanea dell'ambiente di runtime e del codice sorgente senza dover costruire immagini Docker, e selezionando le risorse computazionali con priorità, impostando le notifiche e gestendo l'autenticazione.

I modelli risultano efficaci solo se dispongono delle caratteristiche giuste al momento giusto. Il nostro archivio di funzionalità ha semplificato il processo di definizione di nuove funzionalità, promuovendo al contempo la condivisione di oltre 900 funzionalità in più di 100 servizi di funzionalità. Ciò ha permesso ai team di creare e distribuire nuovi modelli più rapidamente, man mano che la nostra gamma di funzionalità cresceva.

Una volta che la nostra piattaforma di pipeline di apprendimento automatico è diventata funzionale e stabile, abbiamo riscontrato un aumento della domanda di supporto all'inferenza online, con personalizzazione, ricerca e Marketplace in prima linea. Pur consigliando l'inferenza in batch come punto di partenza per operazioni di apprendimento automatico mature, abbiamo sviluppato il nostro registro dei modelli e la nostra piattaforma di serving per supportare l'inferenza in tempo reale. Con il nostro registro dei modelli, gli ingegneri di Roblox possono usare roblox-ml per caricare e scaricare i modelli, che vengono etichettati e aggiornati automaticamente per agevolare la tracciabilità, i rollback e i test A/B. Ad esempio, i nostri modelli di personalizzazione vengono addestrati e distribuiti quotidianamente, e spesso eseguiamo circa 20 test A/B in parallelo. Per la nostra piattaforma di serving, abbiamo utilizzato KServe con Triton Inference Server come runtime di base per il model serving, grazie alle sue ottime prestazioni e al suo supporto per diversi framework di apprendimento automatico che utilizzano sia GPU che CPU.

Sia che operino in batch o online, i modelli di Roblox vengono sottoposti a meticolosi test prima di essere rilasciati. Questo include esperimenti offline, shadow test e test A/B. Una volta rilasciati, i modelli vengono costantemente monitorati per garantire che funzionino come previsto, sia dal punto di vista operativo (ad esempio la latenza di inferenza) che in termini di accuratezza. Nell'ambito del nostro impegno nei confronti di sicurezza e civiltà, i moderatori umani valutano anche eventuali divergenze segnalate nelle inferenze, il che ci aiuta a garantire che le decisioni cruciali siano corrette e a migliorare l'insieme di dati per l'addestramento dei modelli.

Fase due: scalabilità dell'inferenza

All'inizio del 2023, abbiamo individuato un enorme potenziale dell'intelligenza artificiale generativa per accelerare la creazione su Roblox. Per sfruttare appieno questo potenziale, abbiamo trascorso gran parte del 2023 ottimizzando le prestazioni e l'efficienza della nostra infrastruttura di formazione e inferenza dell'apprendimento automatico. Grazie a queste ottimizzazioni, abbiamo ridotto in modo significativo il costo computazionale della creazione di embedding CLIP. Innanzitutto, abbiamo ampliato i nostri sistemi di addestramento distribuito per consentire l'addestramento su grandi insiemi di dati e l'esecuzione di modelli con miliardi di parametri su più nodi worker.

Quando abbiamo iniziato a costruire un flusso di lavoro distribuito, ci siamo resi conto che la configurazione esistente per l'inferenza offline non sarebbe stata in grado di supportare il tasso di crescita che stavamo riscontrando a lungo termine. La nostra configurazione iniziale era stata progettata per l'inferenza in tempo reale, in cui i dati di input e di output sono sequenziali. Sebbene abbia funzionato bene nei primi tempi, non supportava facilmente il parallelismo a livello di thread o l'elaborazione in più fasi, né era sufficientemente efficiente nell'impiego delle risorse per supportare le dimensioni di cui avevamo bisogno. Inoltre, gli ingegneri dovevano scrivere la propria logica di chunking dei dati e di gestione degli errori, che diventava sempre più dispendiosa in termini di tempo man mano che le nostre esigenze di inferenza aumentavano.

Per affrontare queste sfide, abbiamo integrato Ray, un framework di calcolo open source che semplifica la scalabilità dei carichi di lavoro di inferenza batch. Costruendo una pipeline di task distribuiti basata su Ray per l'inferenza batch, siamo riusciti a ottimizzare l'utilizzo delle risorse, a consentire l'elaborazione in più fasi e a fornire un solido parallelismo a livello di thread e una maggiore tolleranza ai guasti. Inoltre, la libreria Ray Data consente agli ingegneri di definire una pipeline con esecuzione in streaming in poche righe, il che contribuisce a migliorare la velocità e l'efficienza degli sviluppatori. Finora abbiamo riscontrato un notevole aumento dell'efficienza utilizzando Ray per l'inferenza batch.

Con la crescita delle nostre esigenze di inferenza, abbiamo trasferito tutta l'inferenza della CPU nei nostri centri dati, il che ci ha permesso di avere un controllo più diretto sulla latenza e sulle impostazioni di privacy. Ogni giorno elaboriamo circa 1 miliardo di richieste di personalizzazione per i nostri 79,5 milioni di utenti attivi giornalmente (alla data del 30 giugno 2024). Il trasferimento di questo carico di lavoro nei nostri centri dati ci ha aiutato a mantenere l'efficienza senza compromettere l'esperienza utente. Per risparmiare sui costi di inferenza, molti sistemi memorizzano le richieste nella cache, il che potrebbe portare a raccomandazioni non aggiornate, dato che molti utenti visitano la pagina iniziale di Roblox più volte al giorno. Ciò ha anche migliorato l'efficienza, consentendoci di ottimizzare meglio i luoghi in cui viene eseguita l'inferenza e di distribuire i carichi di lavoro per ridurre le risorse computazionali necessarie.

Continuando a crescere, ci siamo resi conto della necessità di una soluzione di archiviazione di funzionalità personalizzata in grado di supportare un'elevata capacità di trasmissione, una bassa latenza e l'efficienza in termini di costi, consentendo al contempo rapide iterazioni per vari servizi. Le soluzioni di terze parti esistenti non soddisfacevano questi requisiti, così abbiamo sviluppato il nostro archivio di funzionalità personalizzato, basato sul progetto open source Feast. Il nostro archivio di funzionalità fornisce un linguaggio personalizzato specifico del dominio per definire le trasformazioni per le funzionalità batch e streaming. Flink è stato adottato come motore di elaborazione dei flussi per abilitare le funzionalità in tempo reale, che erano fondamentali per i modelli che dovevano incorporare le informazioni più recenti possibili. L'altro lato della medaglia è rappresentato dalle funzionalità che dovevano essere ricavate dall'elaborazione di un gran numero di risorse 3D in batch, tramite l'esecuzione del motore di gioco Roblox in un sistema distribuito. Oggi il nostro archivio di funzionalità ingerisce circa 30 miliardi di record e ne serve circa 70 miliardi al giorno con una latenza P99 di 50 ms, e supporta più di 100 servizi di funzionalità.

Anche l'uso degli embedding da parte dei modelli è aumentato rapidamente, spinto dalla crescente domanda di comprensione semantica, attraverso l'elaborazione del linguaggio naturale, la computer vision o i sistemi di raccomandazione. Questo ci ha spinto a creare un database vettoriale per memorizzare e recuperare in modo efficiente i vettori come punti ad alta dimensionalità. Il database vettoriale ha consentito di effettuare ricerche rapide sui vicini per potenziare funzionalità come la ricerca multimodale e il rilevamento delle violazioni dei contenuti.

Quando un numero maggiore di team ha iniziato a utilizzare i modelli di apprendimento automatico, volevamo trovare efficienze di scala e aiutare gli ingegneri ad avere successo più rapidamente, così abbiamo creato il nostro team di verità di base. Questo team aiuta gli ingegneri a progettare la propria pipeline di produzione di set di dati, ad addestrare e convalidare i dati utilizzando valutatori umani e a fornire dati di alta qualità. Questo ci ha aiutato a standardizzare il processo di creazione di una pipeline di dati e di convalida di set di dati, nonché il formato in cui i dati vengono forniti, tracciati e monitorati.

Fase tre: operazionalizzazione dell'inferenza su larga scala

Con il rilascio di Roblox Assistant, il numero di token elaborati è aumentato a 1,5 miliardi a settimana. Abbiamo anche rilasciato nuove funzionalità, tra cui la traduzione della chat con IA in tempo reale e il nostro modello di sicurezza vocale (ora open source), che hanno aumentato in modo significativo la richiesta di capacità di inferenza. Abbiamo avviato due progetti fondamentali per potenziare lo sviluppo di applicazioni di IA: il nostro gateway per l'apprendimento automatico e la piattaforma LLMOps (Large Language Model Operations) basata sul progetto vLLM. Insieme, questi due progetti saranno fondamentali per la prossima generazione di apprendimento automatico su Roblox.

Abbiamo creato il nostro gateway unificato per l'apprendimento automatico al fine di centralizzare l'accesso a tutti i modelli di grandi dimensioni, sia open source che sviluppati internamente, in una varietà di ambienti, tra cui CPU e GPU nel cloud e in sede. Il nostro obiettivo era quello di creare un sistema efficiente e semplificato di gestione delle risorse di intelligenza artificiale in tutta l'azienda. Sul back-end, il gateway fornisce un'interfaccia API comune, opzioni di configurazione facili da usare e una condivisione efficiente delle risorse tra tutti i modelli che abbiamo distribuito.

Il gateway ha migliorato la resilienza dei nostri servizi di inferenza, fornendo un throttling centralizzato in base al numero di token per i carichi di lavoro dell'intelligenza artificiale generativa e un bilanciamento del carico consapevole della latenza tra le regioni. Inoltre, migliora la sicurezza centralizzando la gestione delle chiavi API, consente un monitoraggio completo dell'utilizzo e la potenziale implementazione di diritti, e viene integrato con strumenti di monitoraggio per una maggiore visibilità. Tutte queste funzionalità ci aiuteranno a ottimizzare l'uso di modelli di grandi dimensioni, a ridurre i costi e a fornire preziose informazioni agli ingegneri di Roblox.

Inoltre, abbiamo adottato i vLLM come motore inferenziale principale per gli LLM, sfruttando le loro elevate prestazioni per alimentare le applicazioni di IA su Roblox. Da quando siamo passati ai vLLM, abbiamo riscontrato un miglioramento di quasi il doppio sia nella latenza che nella capacità di trasmissione, e attualmente forniamo circa 4 miliardi di token a settimana.

La scelta dei vLLM è in linea con il nostro impegno verso l'utilizzo di tecnologie open source e all'avanguardia, scalabili in modo efficiente per soddisfare le esigenze del nostro bacino d'utenza e della nostra vasta gamma di esperienze. Roblox contribuisce attivamente al progetto open source dei vLLM, guidando lo sviluppo del supporto multimodale per i vLLM, che consente al motore di elaborare non solo testi, ma anche immagini e potenzialmente altri tipi di dati in futuro. Abbiamo anche implementato tecniche di decodifica speculativa per migliorare ulteriormente le prestazioni di inferenza, consentendo un'elaborazione più rapida ed efficiente dei compiti linguistici.

Grazie al gateway per l'apprendimento automatico e ai vLLM, siamo in grado di supportare in modo efficiente le centinaia di pipeline di apprendimento automatico utilizzate su Roblox e di continuare a rendere scalabile l'inferenza man mano che la domanda di funzionalità basate sull'intelligenza artificiale continua a crescere. E non siamo neanche lontanamente vicini alla fine. Abbiamo grandi progetti per il futuro dell'IA su Roblox. Stiamo elaborando nuovi strumenti basati sull'IA per rendere la creazione più efficiente sia per i creatori alle prime armi che per quelli esperti. Come sempre, ci stiamo impegnando al fine di migliorare le prestazioni e l'efficienza della nostra infrastruttura, in modo da supportare al meglio gli strumenti di IA che noi e i nostri creatori utilizziamo quotidianamente.

Centralità dell'open source

Siamo arrivati fin qui grazie a numerosi progetti open source di successo. Gran parte del nostro stack tecnologico è costruito utilizzando le tecnologie open source sopra menzionate.

Ci impegniamo a essere un partner affidabile nella community dell'IA open source e a contribuire con una parte della nostra tecnologia open source. Di recente abbiamo annunciato il nostro primo modello open source: il classificatore di sicurezza vocale, e attualmente stiamo elaborando il nostro gateway di apprendimento automatico, con la speranza di renderlo anch'esso open source. Crediamo che il futuro dell'IA debba essere all'insegna dell'apertura e della trasparenza, e siamo entusiasti di essere un membro attivo di questa community.