No Nubank, a inovação em machine learning (ML) e ciência de dados (DS) impulsiona nossa missão de construir o Futuro Roxo. Recentemente, realizamos a 92ª edição do nosso DS & ML Meetup, com o tema “Práticas para Escalar Operações de Machine Learning”. Este evento mergulhou nos desafios técnicos e nas soluções para construir sistemas de ML em tempo real, com foco na detecção de fraudes—um domínio onde velocidade, precisão e escalabilidade são críticas.

Liderada por Otávio Vasques, Lead Machine Learning Engineer, a sessão explorou a arquitetura, estratégias de otimização e práticas de implantação por trás dos modelos de ML em tempo real do Nubank. Os principais tópicos incluíram as diferenças entre modelos batch e em tempo real, o papel do Model Server, técnicas para reduzir a latência e os custos de infraestrutura, e as melhores práticas para testar e implantar modelos usando o modo shadow.

Neste artigo, vamos desvendar esses insights, oferecendo um olhar por trás das cenas de como o Nubank escala as operações de machine learning para proteger milhões de clientes. Se você é um cientista de dados, engenheiro de ML ou simplesmente curioso sobre ML em tempo real, este post oferece lições práticas para construir sistemas robustos e escaláveis. Vamos lá!

O que são modelos em tempo real?

Modelos em tempo real diferem dos modelos batch tradicionais em um aspecto crucial: eles operam dentro da infraestrutura de serviços, não apenas em pipelines de dados. Enquanto os modelos batch processam grandes volumes de dados durante a noite e geram previsões para o dia seguinte, os modelos em tempo real respondem a eventos conforme eles acontecem.

Isso é essencial para casos de uso como detecção de fraudes, onde atrasar uma decisão por alguns segundos pode significar a diferença entre bloquear uma transação fraudulenta ou permitir que ela seja concluída.

Por exemplo, se alguém rouba seu cartão de crédito e tenta fazer uma compra, um modelo em tempo real pode sinalizar a transação imediatamente, enquanto um modelo batch só a detectaria no dia seguinte—muito depois que o estrago foi feito.

Conheça nossas oportunidades

A arquitetura dos modelos em tempo real no Nubank

No Nubank, nossos modelos em tempo real são construídos sobre uma arquitetura robusta que garante baixa latência e alta confiabilidade. Veja como funciona:

  1. Model Server: este é o coração da nossa infraestrutura de ML em tempo real. Ele combina Clojure (para interface com os sistemas internos do Nubank) e Python (para executar os modelos de ML). A camada de Clojure lida com autenticação, segurança e logging, enquanto a camada de Python foca na inferência.
  2. Fluxo de Dados: em um setup batch, os dados fluem por meio de Grafos Acíclicos Direcionados (DAGs), onde as tabelas são processadas sequencialmente. Em tempo real, substituímos essas tabelas por serviços. Em vez de interromper o fluxo para processar dados, enviamos eventos para o Model Server, que retorna previsões em milissegundos.
  3. Engenharia de Features: modelos em tempo real exigem que as features sejam calculadas instantaneamente. Isso muitas vezes envolve consultar vários serviços para coletar os dados necessários. Por exemplo, para detectar fraudes, podemos precisar buscar informações do cliente, histórico de transações e detalhes da conta—tudo em tempo real.
  4. Processamento Síncrono vs. Assíncrono: dependendo do caso de uso, os modelos em tempo real podem operar de forma síncrona (respondendo imediatamente) ou assíncrona (processando eventos com um pequeno atraso). A detecção de fraudes, por exemplo, exige processamento síncrono para bloquear transações suspeitas instantaneamente.

Otimizando para escala e velocidade

Modelos em tempo real são intensivos em recursos, especialmente quando operam na escala do Nubank. Aqui estão algumas das técnicas que usamos para otimizar o desempenho:

1. Implantação Fragmentada vs. Global

  • Implantação Fragmentada: tradicionalmente, implantávamos modelos de forma fragmentada, com instâncias separadas para diferentes segmentos de clientes (ou “shards”). Embora isso garanta alta disponibilidade, pode levar a ineficiências de recursos, especialmente para modelos que atendem apenas a um pequeno subconjunto de clientes.
  • Implantação Global: Ao implantar modelos globalmente (ou seja, atendendo todos os shards a partir de um único conjunto de pods), reduzimos os custos de infraestrutura em até 30% enquanto melhoramos a estabilidade. Essa abordagem também simplifica a escalabilidade, pois não precisamos mais manter pods redundantes para cada shard.

2. Filtragem Pré-Policy

  • Nem todo evento precisa da atenção de um modelo. Ao implementar regras pré-policy, podemos filtrar eventos de baixo risco antes que eles cheguem ao modelo. Por exemplo, na detecção de fraudes, reduzimos o número de transações processadas por um modelo de 2.800 por segundo para apenas 20 por segundo—economizando recursos computacionais significativos.

3. Paralelização da Recuperação de Features

  • Modelos em tempo real frequentemente dependem de vários serviços para calcular features. Para minimizar a latência, paralelizamos essas solicitações usando ferramentas como os construtores future e delay do Clojure. Isso garante que a recuperação de features aconteça de forma concorrente, em vez de sequencial.

4. Monitoramento e Timeouts

  • Monitoramos de perto os tempos de resposta de todas as dependências. Se um serviço começa a se degradar, definimos timeouts para evitar que ele comprometa todo o modelo. Isso garante que ainda possamos tomar decisões—mesmo que algumas features estejam faltando.

Construindo pipelines de features confiáveis

A engenharia de features é uma parte crítica de qualquer modelo de ML, mas é especialmente desafiadora em sistemas em tempo real. Veja como garantimos consistência e confiabilidade:

  1. Separação de features de curto e longo prazo:
  • Features de curto prazo (por exemplo, transações das últimas 24 horas) são calculadas em tempo real e armazenadas em um banco de dados “quente”.
  • Features de longo prazo (por exemplo, transações dos últimos 90 dias) são pré-computadas em batch e servidas por meio de um feature store.
  1. Feature stores:
  • Usamos ferramentas como Conrado (uma camada de serviço para features batch) e Feature Store (uma aplicação de Spark Streaming) para garantir consistência entre pipelines batch e em tempo real. Essas ferramentas também simplificam a recuperação de features e reduzem o risco de erros.
  1. Infraestrutura personalizada:
  • Quando as ferramentas existentes não são suficientes, construímos nossa própria infraestrutura. Por exemplo, criamos serviços dedicados para armazenar eventos de risco (por exemplo, tentativas de login falhas) e históricos de transações, permitindo-nos calcular features complexas em tempo real.

Testes e modo shadow

A implantação de modelos em tempo real exige testes rigorosos para garantir que eles funcionem conforme o esperado. Aqui está nossa abordagem:

  1. Testes de integração: Executamos testes de integração extensivos para cobrir casos extremos, como entradas vazias, tipos de dados incorretos e erros inesperados. 
  2. Modo shadow: Antes de implantar totalmente um modelo, o executamos em “modo shadow”, onde ele processa dados reais, mas não afeta as decisões voltadas ao cliente. Isso nos permite validar o desempenho do modelo e garantir que ele atenda aos nossos SLAs (por exemplo, 700ms para transações PIX).

Considerações finais

Construir modelos de ML em tempo real é um desafio complexo, mas recompensador. No Nubank, aprendemos que o sucesso depende de uma combinação de arquitetura robusta, otimização cuidadosa e colaboração entre equipes. Embora as técnicas que desenvolvemos sejam adaptadas à detecção de fraudes, muitos dos princípios—como paralelizar a recuperação de features, monitorar dependências e testar rigorosamente—podem ser aplicados a outros casos de uso em tempo real.

Como foi enfatizado durante o meetup, nem todo modelo precisa de todas as otimizações. A chave é ser crítico em relação ao seu caso de uso, entender suas restrições e focar nas melhorias que trarão mais valor. E lembre-se: ML em tempo real é um esforço de equipe. É preciso cientistas de dados, engenheiros e analistas trabalhando juntos para construir sistemas que sejam rápidos e confiáveis.

Conheça nossas oportunidades