Les inférences d'IA à grande échelle sur le cloud hybride
-
Depuis quelques années, Roblox fait appel à l'IA, et plus particulièrement à l'IA générative, dans un nombre croissant de domaines.
-
Nous sommes dans la dernière ligne droite d'un processus en trois phases qui a pour but de bâtir et d'optimiser l'infrastructure nécessaire pour prendre en charge l'IA à cette échelle.
-
Nous avons pris des mesures pour bâtir une infrastructure de cloud hybride capable de prendre en charge les inférences d'apprentissage automatique à très grande échelle.
La semaine dernière, lors de la RDC, nous avons annoncé notre dernier projet d'IA en date : développer un modèle multimodal structurel pour la génération de contenu. Faire fonctionner une IA pour une plateforme immersive en 3D qui est utilisée en permanence par des millions de personnes dans le monde entier, cela nécessite une immense puissance de calcul. Début 2023, nous disposions de moins de 50 pipelines d'apprentissage automatique. Aujourd'hui, notre infrastructure peut en prendre en charge environ 250. Nous utilisons des dizaines de milliers de processeurs et plus de mille cartes graphiques répartis dans deux centres de données pour l'infrastructure de cloud hybride qui permet de faire fonctionner ces modèles. Et ce n'est que le début.
Nous avons déjà expliqué comment nous envisageons l'IA générative pour nos créateurs, comment nous utilisons l'IA pour protéger les utilisateurs de Roblox, et comment la traduction par IA aide les gens du monde entier à communiquer. Ce ne sont là que quelques exemples ; avec environ 250 modèles en fonctionnement, presque toutes les interactions de Roblox font appel à l'IA d'une façon ou d'une autre. Quand un utilisateur accède à Roblox pour la première fois et cherche une expérience à rejoindre, l'IA est en action dans les systèmes de recommandation et de recherche. Quand cette personne sélectionne une expérience, notre algorithme de matchmaking identifie le meilleur serveur pour elle.
Des millions de créateurs ont déjà accès à nos puissants outils d'IA générative. Avec l'assistant, ils peuvent utiliser des commandes simples pour générer des scripts, ce qui accélère la production d'expériences. Avec nos générateurs de textures et de matériaux, ils peuvent rapidement modifier l'apparence de leurs objets et créer de multiples versions. À présent, nous entrons dans l'ère de l'IA générative en 4D avec le lancement de la configuration automatique de l'avatar, qui simplifie le processus de création des avatars et épargne des heures de travail aux créateurs. En août 2024, environ 8 % des corps d'avatars créés par les utilisateurs publiés sur Roblox avaient fait appel à la configuration automatique de l'avatar.
Nous entrons à présent dans la dernière ligne droite d'un processus en trois phases qui a été lancé il y a plusieurs années. L'aventure a commencé fin 2021. À l'époque, il n'y avait pas d'IA unifiée sur Roblox, ce qui a conduit les équipes d'ingénierie à bâtir leurs propres mini-plateformes en utilisant des infrastructures disparates. Les équipes ont développé des composants critiques, comme le Marketplace des avatars, la page d'accueil et la recherche, en concevant à chaque fois leur propre architecture. Au lieu de puiser dans un catalogue de fonctionnalités centralisé, elles étaient obligées d'improviser des solutions de fortune. De plus, chaque équipe devait développer ses propres optimisations et gérer la mise à l'échelle des inférences de façon indépendante, sans l'aide d'une plateforme centrale. Cette approche fragmentée a mis en lumière la nécessité d'une plateforme centralisée cohérente afin d'optimiser nos processus et d'accroître l'efficacité.
Phase 1 : poser des bases solides pour l'apprentissage automatique
Nous avons rapidement adopté Kubeflow afin de tirer parti de ses éléments de base pour l'apprentissage automatique, comme les carnets de notes, les pipelines, l'expérimentation hors ligne et le déploiement de modèles. Nous avions également besoin d'un catalogue de fonctionnalités, et nous avons adopté une solution tierce pour commencer. Afin de rendre l'apprentissage automatique plus accessible pour les ingénieurs de Roblox, nous avons développé roblox-ml
, une bibliothèque Python qui a simplifié le déploiement des modèles pour la production.
Nous avons utilisé les carnets de notes Jupyter afin de proposer un environnement de développement optimisé pour la création de modèles successifs, avec des serveurs configurés pour l'accès aux données et aux ressources de carte graphique nécessaires. Pour appliquer les tâches d'entraînement à grande échelle ou les exécuter régulièrement afin d'entraîner à nouveau un modèle, il était généralement nécessaire de créer un pipeline. Notre bibliothèque roblox-ml
a permis aux ingénieurs de convertir aisément le code des carnets de notes en pipelines Kubeflow en capturant l'environnement de travail et le code source sans avoir à créer des images Docker, et en sélectionnant des ressources avec des priorités, des notifications et une authentification.
Les modèles ne sont efficaces que s'ils disposent des bonnes fonctionnalités au bon moment. Notre catalogue a simplifié le processus de définition des nouvelles fonctionnalités tout en permettant le partage de plus de 900 fonctionnalités réparties dans plus de 100 services. Cela a permis aux équipes de créer et déployer rapidement de nouveaux modèles à mesure que notre catalogue de fonctionnalités s'est étoffé.
Une fois que notre plateforme de pipelines d'apprentissage automatique a été fonctionnelle et stable, nous avons constaté une augmentation de la demande d'inférences en ligne, surtout pour la personnalisation, la recherche et le Marketplace. Nous recommandons l'utilisation des inférences par lots pour améliorer les opérations d'apprentissage automatique, mais nous avons développé notre registre de modèles et notre plateforme de déploiement pour la prise en charge des inférences en temps réel. Grâce à notre registre de modèles, les ingénieurs de Roblox peuvent utiliser roblox-ml
pour mettre en ligne et télécharger des modèles, qui sont étiquetés et se voient automatiquement attribuer des versions afin de favoriser la traçabilité, les retours en arrière et les tests A/B. Par exemple, nos modèles de personnalisation sont entraînés et déployés chaque jour, et nous réalisons souvent environ 20 tests A/B en parallèle. Pour notre plateforme de déploiement, nous avons utilisé KServe avec Triton Inference Server en tant que modèle sous-jacent ; nous l'avons choisi en raison de ses hautes performances et de sa prise en charge de différentes architectures d'apprentissage automatique avec des cartes graphiques ou des processeurs.
Qu'ils fonctionnent par lots ou en temps réel, les modèles de Roblox font l'objet de nombreux tests avant d'être mis en service. Cela passe notamment par des expériences en ligne, des tests cachés et des tests A/B. Après leur lancement, les modèles sont surveillés en permanence afin de vérifier qu'ils offrent les performances attendues aussi bien au niveau de l'efficacité (la latence des inférences) que de l'exactitude. Dans le cadre de notre engagement pour la sécurité et la civilité, des modérateurs humains évaluent les désaccords signalés dans les inférences, ce qui aide à faire en sorte que les décisions critiques soient correctes et à améliorer les données d'entraînement de nos modèles.
Phase 2 : préparer les inférences à grande échelle
Au début de 2023, nous nous sommes rendu compte que l'IA générative avait le potentiel d'accélérer considérablement la création sur Roblox. Afin de profiter pleinement de ce potentiel, nous avons passé une grande partie de cette année à optimiser les performances et l'efficacité de notre infrastructure d'entraînement d'apprentissage automatique et d'inférences. Grâce à ces optimisations, nous avons réduit de façon significative le coût en ressources de l'intégration de CLIP. Pour commencer, nous avons agrandi nos systèmes d'entraînement distribués afin de pouvoir réaliser des entraînements sur de grands ensembles de données et exécuter des modèles avec des milliards de paramètres sur plusieurs nœuds de travail.
Quand nous avons commencé à mettre au point notre flux de travail distribué, nous nous sommes rendu compte que la configuration existante pour les inférences hors ligne ne pourrait pas accommoder le taux de croissance que nous visions à long terme. Notre configuration initiale était prévue pour les inférences en temps réel, avec des données d'entrée et de sortie séquentielles. C'est un système qui a bien fonctionné au début, mais il n'était pas facile de l'adapter aux tâches en parallèle ou au traitement en plusieurs étapes, et son efficacité n'était pas suffisante à l'échelle à laquelle nous étions arrivés. De plus, les ingénieurs devaient programmer leur propre logique de groupement des données et de traitement des erreurs, ce qui est devenu de plus en plus chronophage à mesure que nos besoins en inférence ont augmenté.
Afin de surmonter ces obstacles, nous avons ajouté la prise en charge de Ray, une architecture de calcul en open source qui permet d'augmenter facilement la quantité de lots d'inférences à traiter. En mettant en place un pipeline de tâches distribuées à partir de Ray pour les inférences par lots, nous avons pu optimiser l'utilisation des ressources, activer le traitement en plusieurs étapes et mieux gérer les tâches en parallèle avec une tolérance plus importante pour les défaillances. De plus, la bibliothèque de données de Ray permet aux ingénieurs de définir un pipeline à exécution en continu avec seulement quelques lignes de code, ce qui améliore l'efficacité des développeurs. Nous avons constaté une importante amélioration de la productivité depuis que nous utilisons Ray pour l'inférence par lots.
Avec la croissance de nos besoins en matière d'inférences, nous avons transféré toutes nos inférences de processeur dans nos propres centres de données, ce qui nous a apporté davantage de contrôle sur la latence et les paramètres de confidentialité. Nous traitons environ 1 milliard de demandes de personnalisation par jour pour nos 79,5 millions d'utilisateurs actifs quotidiens (à la date du 30 juin 2024). En transférant cette charge de travail dans nos centres de données, nous avons pu conserver notre efficacité sans compromettre l'expérience des utilisateurs. Afin de réduire le coût des inférences, beaucoup de systèmes placent des requêtes dans le cache ; cependant, cela aurait pour nous entraîné la création de recommandations obsolètes, car beaucoup d'utilisateurs se rendent sur la page d'accueil de Roblox plusieurs fois par jour. Nous avons également amélioré notre efficacité, ce qui nous a permis d'optimiser la localisation du traitement des inférences et de distribuer la charge de travail afin de réduire la quantité de ressources de calcul nécessaires.
Le système a continué de s'agrandir et nous nous sommes rendu compte que nous avions besoin d'un catalogue de ressources unique avec une grande capacité de traitement, une latence faible, un coût bas, et la capacité d'enchaîner rapidement les itérations pour différents services. Les solutions tierces existantes ne correspondant pas à ces critères, nous avons développé notre propre catalogue de ressources à partir du projet en open source Feast. Ce catalogue nous a fourni un langage spécifique pour les transformations des fonctionnalités par lots et en continu. Nous avons adopté Flink pour le traitement des fonctionnalités en temps réel, qui étaient essentielles pour les modèles ayant besoin d'informations aussi récentes que possible. Il y avait également des fonctionnalités qui devaient dériver du traitement d'un grand nombre d'éléments en 3D regroupés par lots en exécutant à nouveau le moteur de jeu Roblox dans un environnement distribué. À l'heure actuelle, notre catalogue de fonctionnalité absorbe environ 30 milliards de registres par jour et en émet environ 70 milliards avec une latence P99 de 50 millisecondes, et il prend en charge plus de 100 services.
La quantité d'intégrations dans les modèles a également augmenté de façon significative en raison de la demande croissante en matière de compréhension sémantique, que ce soit par le traitement du langage naturel, la vision par ordinateur ou les systèmes de recommandation. Cela nous a poussés à mettre en place une base de données de vecteurs afin de stocker efficacement les vecteurs comptant un grand nombre de dimensions et de pouvoir les retrouver facilement. Cette base de données nous a permis de faire appel à la recherche des plus proches voisins pour renforcer des fonctionnalités comme la recherche multimodale et la détection d'infractions dans le contenu.
Quand le nombre d'équipes utilisant des modèles d'apprentissage automatique a augmenté, nous avons voulu trouver des façons d'améliorer l'efficacité et d'aider les ingénieurs à obtenir plus rapidement des résultats ; nous avons donc formé notre propre équipe de vérité de terrain. Elle aide les ingénieurs à concevoir leurs propres pipelines de production d'ensembles de données, à entraîner, à faire valider les données par des évaluateurs humains, et à proposer des données de haute qualité. Cela nous a aidés à standardiser le processus de production des pipelines de données et de validation des ensembles de données, ainsi que le format dans lequel les données sont fournies, suivies et contrôlées.
Phase 3 : mettre en place les inférences à très grande échelle
Depuis le lancement de l'assistant Roblox, nous avons constaté que le nombre de requêtes traitées par semaine a atteint 1,5 milliard. Nous avons également mis en place de nouvelles fonctionnalités, dont la traduction du chat en temps réel via l'IA et notre modèle de sécurité vocale (désormais en open source), qui ont accru de façon significative la demande d'inférences. Nous nous sommes lancés dans deux grands projets afin de faciliter le développement d'applications à IA : notre portail d'apprentissage automatique, et une plateforme d'opérations de grand modèle de langage (LLMOps) bâtie à partir du projet vLLM. Ensemble, ces deux projets constitueront la base de la prochaine génération d'apprentissage machine pour Roblox.
Nous avons conçu notre portail d'apprentissage automatique pour centraliser l'accès à tous les grands modèles, qu'ils soient internes ou en open source, dans divers environnements, notamment les processeurs et les cartes graphiques sur le cloud et dans nos locaux. Notre objectif était de créer un système efficace et optimisé pour la gestion des ressources d'IA dans l'ensemble de l'entreprise. Le portail propose une interface d'API commune, des options de configuration accessibles et un partage des ressources efficace entre tous les modèles déployés.
Il a amélioré la robustesse des services d'inférence en offrant une gestion centralisée de l'IA générative en fonction du nombre de requêtes, et une répartition de la charge de travail qui tient compte de la latence pour chaque région. De plus, il améliore la sécurité en centralisant la gestion des clés des API, offre un suivi complet de l'utilisation, permet d'implémenter les autorisations, et intègre des outils de contrôle pour une meilleure observabilité. Toutes ces fonctionnalités nous aideront à optimiser l'utilisation des grands modèles, à réduire les coûts et à recueillir des données qui seront utiles à tous les ingénieurs de Roblox.
De plus, nous avons fait de vLLM notre moteur d'inférence principal pour les LLM, ce qui nous permettra de tirer parti de ses grandes capacités dans toutes les applications d'IA de Roblox. Depuis le passage à vLLM, nos performances en matière de latence et de productivité ont presque doublé, et nous traitons actuellement environ 4 milliards de requêtes par semaine.
Le choix de vLLM s'inscrit dans le cadre de notre engagement : faire appel à des technologies de pointe en open source pouvant efficacement être utilisées à grande échelle afin de satisfaire les besoins de nos nombreux utilisateurs dans des expériences en tout genre. Roblox contribue activement au projet en open source vLLM en travaillant sur le développement de la prise en charge multimodale, qui permettra au moteur de traiter non seulement du texte, mais aussi des images et éventuellement d'autres types de données. Nous avons également mis en œuvre des techniques de décodage spéculatif pour améliorer les performances des inférences, ce qui permet de traiter plus rapidement et plus efficacement les tâches de langage.
Avec le portail d'apprentissage automatique et vLLM, nous pouvons efficacement prendre en charge des centaines de pipelines d'apprentissage machine pour l'ensemble de Roblox, et continuer de réaliser toujours plus d'inférences pour répondre à la demande croissante de fonctionnalités d'IA. Ce travail est loin d'être terminé. Nous avons de grands projets pour l'avenir de l'IA sur Roblox. Nous sommes en train de travailler sur de nouveaux outils d'IA qui permettront aussi bien aux novices qu'aux experts de créer plus efficacement. Comme toujours, nous cherchons des moyens d'améliorer les performances et l'efficacité de notre infrastructure afin de garantir un meilleur fonctionnement pour les outils d'IA que nos créateurs et nous-mêmes utilisons chaque jour.
Notre engagement pour l'open source
Si nous sommes arrivés si loin, c'est en partie grâce à plusieurs projets en open source réussis. Une grande partie de nos ressources techniques ont été créées grâce aux technologies en open source mentionnées plus haut.
Nous nous engageons à être un partenaire actif de la communauté de l'IA en open source, et à contribuer via quelques-unes de nos propres technologies. Nous avons récemment annoncé notre premier outil de classification de sécurité vocale en open source, et nous travaillons également sur notre portail d'apprentissage automatique pour le proposer lui aussi en open source. Nous estimons que l'avenir de l'IA doit passer par l'ouverture et la transparence, et nous sommes heureux d'être un membre actif de cette communauté.