Ejecutar la inferencia de la IA a escala en la nube híbrida
-
Las áreas en las que Roblox utiliza la IA, y la IA generativa en particular, crecieron rápidamente en los últimos años.
-
Estamos en la recta final de un proceso de tres fases para construir y optimizar la infraestructura necesaria para soportar este nivel de herramientas de IA.
-
Compartiremos los pasos que dimos para construir una infraestructura de nube híbrida capaz de soportar la inferencia de aprendizaje automático a escala masiva.
En la reunión de CDR de la semana pasada anunciamos nuestro último proyecto de incubación de IA: desarrollar un modelo fundacional y multimodal en 3D para potenciar la creación generativa. Alimentar la IA de una plataforma global 3D, inmersiva y siempre activa, utilizada por millones de personas, requiere de una enorme potencia de cálculo. A principios de 2023 dábamos soporte a menos de 50 secuencias lineales de inferencia de aprendizaje automático (ML). Hoy en día, nuestra infraestructura soporta aproximadamente 250 de estas secuencias lineales. Mantenemos decenas de miles de CPU y más de mil GPU en dos centros de datos y en nuestra infraestructura de nube híbrida para ejecutar todos estos modelos. Y aún no terminamos.
Ya explicamos cómo pensamos en la IA generativa para nuestros creadores, cómo utilizamos la IA para mantener a salvo a los usuarios de Roblox y cómo las traducciones con IA ayudan a personas de todo el mundo a comunicarse. Pero estos son solo algunos ejemplos: Con unos 250 modelos en producción, prácticamente todas las interacciones de Roblox están impulsadas por algún tipo de IA. Cuando una persona llega por primera vez a Roblox y está mirando a qué experiencia unirse, la IA está trabajando a través de nuestros sistemas de recomendación y búsqueda. Y cuando esa persona elige una experiencia y presiona el botón de jugar, nuestro algoritmo de emparejamiento identifica el mejor servidor al cual unirse.
Millones de creadores ya tienen acceso a la potencia de nuestras herramientas de IA generativa. Con el Asistente pueden utilizar instrucciones sencillas para generar scripts y acciones que ayuden a acelerar la creación de experiencias. Con nuestras herramientas de generación de textura y materiales, pueden cambiar e iterar rápidamente el aspecto y el estilo de los objetos. Y ahora estamos entrando a la era de la IA generativa en 4D con el reciente lanzamiento de la configuración automática de avatares, que simplifica el proceso de creación de un avatar, lo que les ahorra horas de trabajo a los creadores. En agosto de 2024, aproximadamente el 8 % de los cuerpos de avatar de UGC publicados en Roblox se realizaron utilizando la configuración automática de avatares.
Estamos entrando en la recta final de un proceso en tres fases que lleva varios años en marcha. Este viaje comenzó a finales de 2021. En aquel momento, la falta de una plataforma de IA unificada en Roblox llevó a los equipos de ingeniería a construir sus propias miniplataformas y seleccionar esquemas dispares. Vimos equipos que desarrollaban componentes críticos, como nuestro mercado de avatar, la página de inicio y la búsqueda, cada uno con su propia ingeniería de funciones personalizada. En lugar de aprovechar un almacén de funciones centralizado, los equipos estaban improvisando soluciones ad hoc. Además, cada equipo tuvo que desarrollar sus propias optimizaciones y afrontar los retos de escalado de la inferencia de forma independiente, sin el apoyo de una plataforma central. Este enfoque fragmentado puso en manifiesto la urgente necesidad de una plataforma cohesionada y centralizada para agilizar nuestros procesos y mejorar la eficiencia en todos los ámbitos.
Fase uno: Construir una base sólida de aprendizaje automático
Adoptamos Kubeflow desde el principio para aprovechar su paquete de componentes básicos para aprendizaje automático, incluyendo los sistemas portátiles, las secuencias lineales, la experimentación fuera de línea y el servicio de modelos. Seguía siendo necesario un almacén de funciones, así que adoptamos una solución de terceros para empezar. Para que el aprendizaje automático sea más accesible para los ingenieros de Roblox, desarrollamos roblox-ml
, una biblioteca de Python que reduce aún más la complejidad de desplegar un modelo en producción.
Usamos los sistemas portátiles de Jupyter para proporcionar un entorno de desarrollo optimizado para la iteración de modelos, con servidores configurados para el acceso a los datos y los recursos de GPU necesarios. Escalar un trabajo de entrenamiento o ejecutarlo con regularidad para volver a entrenar un modelo generalmente requería que escribiéramos una secuencia lineal. Nuestra biblioteca de roblox-ml
permitió a los ingenieros convertir fácilmente el código de los sistemas portátiles en secuencias lineales de Kubeflow mediante la copia instantánea de volumen del entorno de ejecución y del código fuente sin necesidad de crear imágenes Docker, y mediante la selección de recursos informáticos con prioridades, la configuración de notificaciones y la gestión de la autenticación.
Los modelos solo son eficaces si tienen las características adecuadas en el momento oportuno. Nuestro almacén de funciones simplificó el proceso de definición de nuevas funciones, al tiempo que fomentó el intercambio de más de 900 funciones a través de más de 100 servicios de las mismas. Esto permitió a los equipos crear e implantar nuevos modelos con mayor rapidez a medida que crecía nuestra colección de funciones.
Una vez que nuestra plataforma de secuencias lineales de aprendizaje automático fue funcional y estable, observamos un aumento de la demanda de apoyo a la inferencia en línea, con la personalización, la búsqueda y el mercado a la cabeza. Aunque recomendamos la inferencia por lotes como punto de partida para madurar las operaciones de aprendizaje automático, desarrollamos nuestra plataforma de registro y servicio de modelos para que admita la inferencia en tiempo real. Con nuestro modelo de registro, los ingenieros de Roblox pueden utilizar roblox-ml
para cargar y descargar modelos, que se etiquetan y versionan automáticamente para facilitar la trazabilidad, las reversiones y las pruebas A/B. Por ejemplo, nuestros modelos de personalización se entrenan y despliegan a diario, y a menudo ejecutamos aproximadamente 20 pruebas A/B en paralelo. Para nuestra plataforma de servicio, utilizamos KServe con Triton Inference Server como tiempo de ejecución de servicio de modelos subyacente debido a su gran rendimiento y a su compatibilidad con múltiples marcos de aprendizaje automático que utilizan tanto GPU como CPU.
Tanto si funcionan por lotes como en línea, los modelos de Roblox se someten a pruebas exhaustivas antes de su lanzamiento. Esto incluye experimentos fuera de línea, pruebas de sombra y pruebas A/B. Una vez liberados, los modelos se someten a un seguimiento continuo para garantizar que su rendimiento es el esperado, tanto desde el punto de vista operativo (por ejemplo, latencia de la inferencia) como en términos de precisión. Como parte de nuestro compromiso con la seguridad y el civismo, los moderadores humanos también evalúan los desacuerdos notificados en las inferencias, lo que ayuda a garantizar que tomamos las decisiones críticas correctas y esto mismo contribuye a mejorar el conjunto de datos de entrenamiento para nuestros modelos.
Fase dos: Preparar la inferencia a escala
A principios de 2023 vimos el enorme potencial de la IA generativa para acelerar la creación en Roblox. Para aprovechar al máximo ese potencial, dedicamos gran parte de 2023 a optimizar el rendimiento y la eficiencia de nuestra infraestructura de formación e inferencia de aprendizaje automático. Gracias a estas optimizaciones, reducimos significativamente el costo computacional de la creación de incrustaciones CLIP. En primer lugar, ampliamos nuestros sistemas de formación distribuida para poder entrenar grandes conjuntos de datos y ejecutar modelos con miles de millones de parámetros en varios nodos de trabajo.
Cuando empezamos a crear un flujo de trabajo distribuido, nos dimos cuenta de que nuestra configuración actual para la inferencia fuera de línea no soportaría el ritmo de crecimiento que estábamos experimentando a largo plazo. Nuestra configuración inicial se diseñó para la inferencia en tiempo real, en la que los datos de entrada y salida son secuenciales. Aunque funcionó bien en nuestros primeros intentos, no permitía fácilmente el paralelismo de tareas o el procesamiento multietapa, ni era lo suficientemente eficiente en recursos como para soportar la escala que necesitábamos ahora. Además, los ingenieros tenían que escribir su propia lógica de agrupación de datos y gestión de errores, lo que consumía cada vez más tiempo a medida que aumentaban nuestras necesidades de inferencia.
Para hacer frente a estos retos, añadimos soporte para Ray, un marco informático de código abierto que facilita el escalado de cargas de trabajo de inferencia por lotes. Al crear una secuencia lineal de tareas distribuidas basada en Ray para la inferencia por lotes, pudimos optimizar la utilización de recursos, permitir el procesamiento multietapa y proporcionar un paralelismo de tareas sólido y una mayor tolerancia a fallos. Además, la biblioteca Ray Data permite a los ingenieros definir una secuencia lineal con ejecución en streaming en unas pocas líneas, lo que ayuda a mejorar la velocidad y la eficiencia de los desarrolladores. Hasta la fecha, observamos un enorme aumento de la eficiencia al utilizar Ray para la inferencia por lotes.
A medida que crecían nuestras necesidades de inferencia, trasladamos toda la inferencia de CPU a nuestros propios centros de datos, lo que nos proporcionó un control más directo sobre la latencia y los ajustes de privacidad. Procesamos aproximadamente 1000 millones de solicitudes de personalización al día para nuestros 79.5 millones de usuarios activos diarios (al 30 de junio de 2024). Trasladar esta carga de trabajo a nuestros propios centros de datos nos ayudó a mantener nuestra eficiencia sin comprometer la experiencia del usuario. Para ahorrar costos de inferencia, muchos sistemas almacenan las solicitudes en la caché, lo que habría dado lugar a recomendaciones obsoletas, ya que muchos usuarios visitan la página principal de Roblox varias veces al día. Esto también mejoró nuestra eficiencia y nos permitió optimizar mejor dónde se ejecuta la inferencia y distribuir las cargas de trabajo para reducir los recursos informáticos necesarios.
A medida que crecíamos, nos dimos cuenta de que necesitábamos una solución de almacenamiento de funciones personalizada que pudiera soportar un alto rendimiento, una latencia baja y una buena relación costo-eficacia, y que al mismo tiempo permitiera iteraciones rápidas para diversos servicios. Las soluciones de terceros no cumplían estos requisitos, así que desarrollamos nuestro propio almacén de funciones personalizado, basado en el proyecto de código abierto Feast. Nuestro almacén de funciones proporcionaba un lenguaje personalizado específico del dominio para definir transformaciones tanto para las funciones por lotes como para las de streaming. Adoptamos Flink como motor de procesamiento de flujos para permitir funciones en tiempo real, que eran fundamentales para los modelos que necesitaban incorporar la información más reciente posible. En el extremo opuesto se encontraban las funciones que debían derivarse del procesamiento por lotes de un gran número de activos 3D mediante la reejecución del motor de juego de Roblox en un entorno distribuido. En la actualidad, nuestro almacén de funciones ingiere unos 30 000 millones de registros y sirve aproximadamente 70 000 millones de registros al día con una latencia P99 de 50 ms, y admite más de 100 servicios de funciones.
El uso de incrustaciones por modelos también ha crecido rápidamente, impulsado por la creciente demanda de comprensión semántica, ya sea a través de la PNL, la visión por computadora o los sistemas de recomendación. Esto nos motivó a crear una base de datos vectorial para almacenar y recuperar vectores de forma eficiente como puntos de alta dimensión. La base de datos vectorial permite búsquedas rápidas de vecinos más cercanos para potenciar funciones, como la búsqueda multimodal y la detección de infracciones de contenido.
A medida que más equipos comenzaron a utilizar modelos de aprendizaje automático, quisimos encontrar eficiencias de escala y ayudar a los ingenieros a tener éxito más rápidamente, por lo que establecimos nuestro propio equipo de verdad fundamental. Este equipo ayuda a los ingenieros a diseñar su propia secuencia lineal de producción de conjuntos de datos, a entrenar y validar los datos mediante evaluadores humanos y a entregar datos de gran calidad. Esto nos ayudó a estandarizar el proceso de creación de una secuencia lineal de datos y de la validación de conjuntos de datos, así como el formato en que se entregan, rastrean y supervisan los datos.
Fase tres: Poner en marcha la inferencia masiva
Con el lanzamiento de Roblox Assistant, vimos un aumento del número de tokens procesados a 1500 millones por semana. También lanzamos nuevas características, incluyendo la traducción de chat en tiempo real con IA y nuestro modelo de seguridad de voz (ahora de código abierto), que aumentaron significativamente la demanda de capacidad de inferencia. Nos hemos embarcado en dos proyectos fundamentales para potenciar el desarrollo de aplicaciones de IA: nuestra puerta de enlace de aprendizaje automático y una plataforma de operaciones de grandes modelos lingüísticos (LLMOps) basada en el proyecto vLLM. Estos dos proyectos juntos serán fundamentales para la próxima generación de aprendizaje automático en Roblox.
Creamos nuestra puerta de enlace de aprendizaje automático para centralizar el acceso a todos los modelos de gran tamaño, tanto de código abierto como desarrollados internamente, en diversos entornos, incluidas CPU y GPU en la nube y en las instalaciones. Nuestro objetivo era crear un sistema eficaz y racionalizado para gestionar los recursos de IA en toda la empresa. En el back-end, la puerta de enlace ofrece una interfaz API común, opciones de configuración fáciles de usar y un uso compartido de recursos eficiente entre todos los modelos que hemos desplegado.
La puerta de enlace mejoró la capacidad de recuperación de nuestros servicios de inferencia al proporcionar una limitación centralizada por recuento de tokens para las cargas de trabajo de IA generativa y un equilibrio de carga entre regiones que tiene en cuenta la latencia. Además, mejora la seguridad al centralizar la gestión de claves de API, permite un seguimiento exhaustivo del uso y la posible aplicación de derechos, y se integra con herramientas de supervisión para mejorar la observabilidad. Todas estas características nos ayudarán a optimizar el uso de modelos grandes, reducir los costos y proporcionar información valiosa para los ingenieros en todo Roblox.
Además, adoptamos vLLM como nuestro motor de inferencia principal para LLMs, aprovechando las capacidades de alto rendimiento de vLLM para alimentar aplicaciones de IA en Roblox. Desde que nos mudamos a vLLM, observamos una mejora casi del doble en la latencia y el rendimiento, y actualmente servimos aproximadamente 4 mil millones de tokens por semana.
Nuestra elección de vLLM se alinea con nuestro compromiso de aprovechar las tecnologías de código abierto y de vanguardia que pueden escalarse de manera eficiente para satisfacer las demandas de nuestra amplia base de usuarios y de nuestra diversa variedad de experiencias. Roblox es un colaborador activo del proyecto vLLM de código abierto, y lidera el desarrollo del soporte multimodal para vLLM, que permite que el motor no solo maneje texto, sino también imágenes y, eventualmente, otros tipos de datos en el futuro. También implementamos técnicas de descodificación especulativa para mejorar aún más el rendimiento de la inferencia, lo que permite un procesamiento más rápido y eficiente de las tareas lingüísticas.
Con la puerta de enlace de aprendizaje automático y vLLM, podemos dar soporte de forma eficaz a cientos de secuencias lineales de aprendizaje automático que se utilizan en Roblox y seguir ampliando la inferencia a medida que crece la demanda de funciones basadas en IA. Y aún estamos lejos de haber terminado con este trabajo. Tenemos grandes planes para el futuro de la IA en Roblox. Estamos trabajando en nuevas herramientas basadas en IA para que la creación sea más eficaz tanto para los creadores nuevos como para los expertos. Como siempre, estamos buscando formas de mejorar el rendimiento y la eficiencia de nuestra infraestructura para apoyar mejor las herramientas de IA que nosotros (y nuestros creadores) utilizamos a diario.
Nuestro compromiso con el código abierto
Llegamos hasta aquí gracias al éxito de varios proyectos de código abierto. Gran parte de nuestro arsenal técnico se basa en la tecnología de código abierto mencionada anteriormente.
Nos comprometemos a ser un socio fuerte en la comunidad de IA de código abierto y a aportar parte de nuestra propia tecnología de código abierto. Hace poco anunciamos nuestro primer modelo de código abierto: nuestro clasificador de seguridad de voz, y actualmente estamos trabajando en nuestra puerta de enlace de aprendizaje automático, con la esperanza de que también sea de código abierto. Creemos que el futuro de la IA debe incluir apertura y transparencia, y nos entusiasma ser un miembro activo de esta comunidad.