Rodando inferência de IA em grande escala na nuvem híbrida

  • As áreas em que a Roblox usa IA, e IA generativa em especial, cresceram bastante ao longo dos últimos anos.

  • Estamos na última parte de um processo de três fases para construir e otimizar a infraestrutura necessária para dar suporte a este nível de ferramenta de IA.

  • Estamos divulgando os passos tomados para construir uma infraestrutura híbrida de nuvem que apoie a inferência do aprendizado de máquina em grande escala.

Na RDC da semana passada, anunciamos nosso mais recente projeto de incubação: desenvolver um modelo 3D multimodal que sirva de fundação para criação generativa. Empregar IA em uma plataforma 3D global, imersiva e sempre ligada, usada por milhões de pessoas, exige uma potência computacional imensa. No começo de 2023, tínhamos menos de 50 processos de inferência de aprendizado de máquina (ML). Hoje, nossa infraestrutura dá suporte a cerca de 250. Mantemos dezenas de milhares de processadores e mais de duas mil placas de vídeo em duas centrais de dados e na nossa infraestrutura de nuvem para rodar todos esses modelos. E ainda não acabamos.

Já divulgamos como estamos pensando em IA generativa para os nossos criadores, como usamos IA para resguardar a segurança das pessoas na Roblox e como traduções de IA ajudam a gente do mundo todo se comunicar. Mas esses são só alguns exemplos. Com cerca de 250 modelos em produção, praticamente toda interação na Roblox envolve auxílio de alguma espécie de IA. Quando alguém chega à Roblox pela primeira vez e quer saber em que experiência entrar, a IA ajuda nos sistemas de recomendação e busca. E quando essa pessoa escolhe uma experiência e clica no botão de jogar, nosso algoritmo de matchmaking identifica o melhor servidor em que colocá-la.

Milhões de criadores já têm acesso ao poder das nossas ferramentas de IA generativa. Com o Assistente, é possível usar instruções simples para gerar scripts e ações que ajudem a acelerar a criação. Com as nossas ferramentas Geradoras de Texturas e Materiais, é possível transformar e iterar o estilo e o visual dos objetos, sem demora. Estamos agora chegando à era da IA generativa 4D com o lançamento recente da Configuração Automática de Avatar, que simplifica o processo de criar um avatar, economizando aos criadores horas de trabalho. Em agosto de 2024, cerca de 8% dos corpos de avatar gerados por usuários e publicados na Roblox foram produzidos com a Configuração Automática de Avatar.

Estamos agora chegando à última etapa de um processo de três fases em andamento há vários anos. A jornada começou ao fim de 2021. Na época, a falta de uma plataforma de IA integrada da Roblox levou nossos times de engenharia a construírem suas próprias miniplataformas e escolher estruturas díspares para trabalhar. Vimos o desenvolvimento de componentes críticos, incluindo Mercado de avatar, página inicial e busca, cada um com sua própria engenharia personalizada. Em vez de aproveitar uma gama centralizada de funcionalidades, nossos times estavam juntando soluções feitas separadamente. Além disso, cada time precisava desenvolver sua própria otimização e enfrentar desafios de dimensionamento de inferências de forma independente, sem o suporte de uma plataforma central. Essa abordagem fragmentada destacou a necessidade urgente de uma plataforma coesiva e centralizada para simplificar nossos processos e aumentar a eficiência em todas as áreas.

Fase um: Construir um alicerce forte para aprendizado de máquina

Adotamos Kubeflow logo no começo para aproveitar seu pacote de peças fundamentais para construir o aprendizado de máquina, incluindo cadernos, processos, experimentação offline e distribuição de modelos. Ainda era preciso ter uma reserva de funcionalidades, então adotamos uma solução terceirizada no começo. Para o aprendizado de máquina ser mais acessível aos engenheiros da Roblox, desenvolvemos a roblox-ml, uma biblioteca em Python que reduzia ainda mais as complexidades de implementar um modelo para produção.

Usamos cadernos Jupyter para proporcionar um ambiente de desenvolvimento otimizado para iteração de modelos, com servidores configurados para acessos de dados e recursos de placas gráficas necessários. Dimensionar um trabalho de treinamento ou rodá-lo regularmente para treinar novamente um modelo, em geral, exigia que escrevêssemos um processo. A biblioteca roblox-ml permitiu aos engenheiros converter código do caderno em processos do Kubeflow sem dificuldade, salvando o ambiente de tempo de execução e o código-fonte sem precisar construir imagens Docker, e, ao selecionar recursos de computação com prioridades, configurar notificações e gerenciar a autenticação.

Modelos só são eficazes se tiverem as funcionalidades certas na hora certa. Nossa reserva de funcionalidades simplificou o processo de definição de novas funcionalidades, também promovendo o compartilhamento de mais de 900 funcionalidades por mais de 100 serviços. Assim, as equipes puderam criar e implementar novos modelos mais rápido conforme a coleção de funcionalidades crescia.

Assim que nossa plataforma de processos de aprendizado de máquina estava operante e estável, vimos mais demanda por suporte de inferência on-line, com personalização, busca e Mercado sendo os principais. Embora recomendemos inferência em lote como um marco para amadurecer as operações de aprendizado de máquina, desenvolvemos a plataforma de distribuição e os registros do modelo para dar suporte a inferência em tempo real. Com os nossos registros de modelo, engenheiros da Roblox podem usar roblox-ml para enviar e baixar modelos, que contam com tags e versões automáticas para facilitar o acompanhamento, retornos a versões anteriores e testagens A/B. Por exemplo, nossos modelos de personalização são treinados e implementados todos os dias, e com frequência rodamos cerca de 20 testes A/B em paralelo. Para nossa plataforma de distribuição, usamos Kserve com Triton Inference Server como o modelo subjacente que distribui o tempo de execução, graças a uma performance boa, além de seu suporte a várias estruturas de aprendizado de máquina com tanto processadores quanto placas de vídeo.

Seja operando em lote ou on-line, os modelos da Roblox passam por uma ampla testagem antes do lançamento. Isso inclui experimentos off-line, testagem de sombra e testagem A/B. Após o lançamento, os modelos são monitorados incessantemente para garantir o desempenho esperado, tanto em questão operacional (por ex., inferência e latência) quanto em termos de precisão. Como parte do nosso comprometimento com segurança e civilidade, moderadores humanos também avaliam qualquer discordância relatada em inferências, o que ajuda a garantir que acertemos em decisões críticas e também melhora o conjunto de dados de treinamento dos nossos modelos.

Fase dois: Preparações para dimensionar inferências

No começo de 2023, vimos um grande potencial para IA generativa para acelerar a criação na Roblox. Para aproveitar esse potencial ao máximo, passamos grande parte de 2023 otimizando a performance e a eficiência do nosso treinamento de aprendizado em máquina e infraestrutura de inferência. Graças a essas otimizações, reduzimos bastante o custo de computação da criação de incorporação de CLIP. Primeiro, ampliamos nossos sistemas de treinamento distribuídos para possibilitar o treinamento em conjuntos de dados enormes e rodar modelos bilhões de parâmetros em diversos nodos de trabalho.

Conforme começamos a montar um fluxo de trabalho distribuído, percebemos que nossa estrutura existente para inferência off-line não suportaria a taxa de crescimento que víamos no longo prazo. A estrutura inicial era projetada para inferência em tempo real, em que os dados de entrada e saída são sequenciais. Embora ela funcionasse bem para nossos esforços iniciais, não se prestava a paralelismo de tarefas e processamento em várias etapas, nem era eficiente o bastante para suportar a escala de que agora precisávamos. Além disso, era preciso que os engenheiros escrevessem sua própria lógica de agrupamento de dados e gestão de erros, o que se tornou muito dispendioso em tempo conforme nossas necessidades de inferência aumentavam.

Para lidar com esses desafios, adicionamos suporte a Ray, uma estrutura de computação de código aberto que facilita o dimensionamento de cargas de trabalho de inferência em lote. Ao construir um fluxo de tarefas distribuído com base em Ray para inferência em lote, pudemos otimizar a utilização de recursos, habilitar processamento em várias etapas e proporcionar paralelismo de tarefas robusto e maior tolerância a erros. Além disso, a biblioteca de dados de Ray permite aos engenheiros definir um fluxo com execução em streaming com poucas linhas, o que contribui muito para a velocidade e a eficiência dos desenvolvedores. Vimos imensos ganhos de eficiência até então, ao usar Ray para inferência em lote.

Conforme nossas necessidades de inferência continuavam a crescer, movemos toda a nossa influência de processador para centrais de dados próprias, o que nos deu maior controle sobre configurações de latência a privacidade. Processamos cerca de 1 bilhão de pedidos de personalização todos os dias, para nossos 79,5 milhões de usuários ativos diários (número de 30 de junho de 2024). Mover essa carga de trabalho a centrais de dados nossas, nos ajudou a manter nossa eficiência sem prejudicar a experiência dos usuários. Para economizar em inferência, muitos sistemas armazenam pedidos, o que levaria a recomendações ultrapassadas, já que vários usuários visitam a página inicial da Roblox várias vezes por dia. Isso também melhorou nossa eficiência, permitindo melhor otimizar onde roda a inferência e a distribuir cargas de trabalho para reduzir a quantidade necessária de recursos de computação.

Conforme continuamos a crescer, percebemos que precisávamos de uma solução de reserva de funcionalidades personalizada, que suportasse alto processamento, baixa latência e bom custo-benefício, tudo enquanto possibilitasse iterações rápidas para vários serviços. Soluções terceirizadas existentes não atenderam aos requisitos, então desenvolvemos nossa própria reserva de recursos, por cima do projeto de código aberto Feast. Nossa reserva de recursos proporcionou uma linguagem personalizada, específica a um domínio, para definir transformações em funcionalidades de lote e streaming na mesma medida. Adotamos Flink como o motor processador de streaming para possibilitar o uso de funcionalidades em tempo real, o que era crítico para modelos que precisassem incorporar os dados mais recentes. Na outra extremidade do espectro estavam funcionalidades que precisávamos derivar do processamento de uma vasta quantidade de ativos 3D, em lote, rodando o motor do jogo Roblox em um ambiente distribuído. Nossa reserva de funcionalidades agora ingere cerca de 30 bilhões de registros e distribui cerca de 70 bilhões de registros por dia, com uma latência P99 de 50 ms, e suporta mais de 100 serviços de funcionalidades.

O uso de incorporações por modelos também cresceu depressa, impelido pela demanda crescente por compreensão semântica, seja por NLP, visão de computador ou sistemas de recomendação. Isso nos motivou a desenvolver a partir de um banco de dados de vetores para armazenar e recuperar vetores como pontos de alta dimensão eficientemente. O banco de dados de vetores possibilitou buscas rápidas, por meio de vizinhos mais próximos, assim impelindo capacidades como pesquisa multimodal e detecção de violação de conteúdo.

Conforme mais equipes começaram a usar modelos de aprendizado de máquina, quisemos obter maior eficiência em grande escala e ajudar nossos engenheiros a operar mais depressa, então estabelecemos nosso próprio time de verdade fundamental. Esse time ajuda os engenheiros a projetarem seu próprio processo de produção de conjunto de dados, a treinar e a validar dados com avaliadores humanos e a entregar dados de alta qualidade. Isso nos ajudou a padronizar o processo de construir um fluxo de dados e de validar conjuntos de dados, além do formato em que os dados são recebidos, acompanhados e monitorados.

Fase três: Operacionalizando inferência em massa

Com o lançamento do Assistente da Roblox, vimos o número de tokens processados subir para 1,5 bilhão por semana. Também lançamos novas funcionalidades, como tradução do chat em tempo real por IA e o nosso modelo de segurança de voz (agora de código aberto), o que aumentou consideravelmente a demanda por capacidade de inferências. Embarcamos em dois projetos fundamentais para turbinar nosso desenvolvimento de aplicações de IA: nossa via de acesso a aprendizado de máquina, e uma plataforma de operação de modelos de linguagem de grande escala (LLMOps), baseado no projeto vLLM. Juntos, esses dois projetos serão fundamentais para a próxima geração de aprendizado de máquina na Roblox.

Construímos nossa via de acesso unificada de aprendizado de máquina para centralizar acesso a todos os modelos de grande escala, tanto os de código aberto quanto os desenvolvidos internamente, por uma diversidade de ambientes, incluindo processadores e placas de vídeo na nuvem e no local. Nosso objetivo era criar um sistema simplificado e eficiente para gerenciar recursos de IA na empresa. No backend, a via de acesso proporciona uma interface de API comum, opções de configuração amigáveis e compartilhamento eficiente de recursos entre todos os modelos implementados.

A via de acesso melhorou a resiliência dos nossos servidores de inferência, proporcionando um gargalo centralizado por contagem de tokens para cargas de trabalho de IA generativa e um equilíbrio de carga entre regiões, com a latência em mente. Além disso, ele melhora a segurança ao centralizar o gerenciamento de chaves de API, permite o rastreamento abrangente de uso e potencial implementação de privilégios e se integra com ferramentas de monitoramento, possibilitando maior observabilidade. Todas essas funcionalidades noa ajudarão a otimizar o uso de modelos de grande escala, reduzir custos e ajudar os engenheiros da Roblox em avanços importantes.

Além disso, adotamos vLLM como nosso motor de inferência principal para LLMs, aproveitando a capacidade de alta performance do projeto para impelir aplicações de IA por toda a Roblox. Desde que migramos para vLLM, vimos uma melhoria de quase 2x em latência e processamento, servindo cerca de 4 bilhões de tokens por semana.

Escolher vLLM se alinha com nosso comprometimento a aproveitar tecnologias de ponta, de código aberto, capazes de se dimensionar eficientemente para suprir as demandas da nossa vasta base de usuários e diversa gama de experiências. A Roblox é uma contribuidora ativa ao projeto de código aberto vLLM, atuando na vanguarda do desenvolvimento de apoio multimodal para vLLM, que possibilita ao motor não só lidar com texto como também com imagens e potencialmente outros tipos de dados no futuro. Também implementamos técnicas de decodificação especulativa para melhorar a performance ainda mais, possibilitando um processamento mais rápido e eficiente de tarefas linguísticas.

Com a via de acesso de aprendizado de máquina e vLLM, podemos dar um suporte eficiente às centenas de fluxos de aprendizado em andamento na Roblox, continuando também a dimensionar a inferência conforme a demanda por funcionalidades de IA continua a crescer. E ainda não estamos nem perto de terminar esse trabalho. Temos grandes planos para o futuro da IA na Roblox. Estamos trabalhando em novas ferramentas de IA para deixar a criação mais eficiente para criadores novatos e veteranos. Como sempre, estamos trabalhando em métodos de melhorar a performance e a eficiência da nossa infraestrutura para dar maior suporte às ferramentas de IA que nós e nossos criadores usamos todos os dias.

Nosso comprometimento com código aberto

Chegamos até aqui com o apoio de vários projetos de código aberto de sucesso. Muito da nossa pilha técnica foi feita a partir da tecnologia de código aberto mencionada acima.

Queremos ser um forte parceiro na comunidade de IA de código aberto, assim contribuindo também com um pouco da nossa própria tecnologia de código aberto. Há pouco tempo, anunciamos nosso primeiro modelo de código aberto, o classificador de segurança de voz, e estamos trabalhando numa via de acesso de aprendizado de máquina, na expectativa de deixar o código aberto dela também. Acreditamos que o futuro da IA deva incluir abertura e transparência, e estamos animados para participar dessa comunidade ativamente.