Há pouco tempo, as aplicações com aprendizado de máquina começaram a surgir em vários setores. As empresas adaptaram rapidamente suas infraestruturas existentes para que pudessem entregar modelos de aprendizado de máquina que gerassem previsões em lotes.

Isso funciona bem o suficiente. Agora, parece que todos estão falando sobre como o aprendizado de máquina em tempo real é o futuro. Mas isso é verdade? Devemos realmente empreender o esforço adicional para colocar (e manter) modelos em tempo real na produção?

Você tem interesse em um minimapa que pode ajudar na decisão sobre quando e como criar modelos de aprendizado de máquina em tempo real? Continue lendo esse artigo!

O que são modelos em tempo real?

Não existe uma única definição do que é um modelo em tempo real.

Quando falamos sobre modelos em tempo real, podemos pensar em dois processos distintos, que podem acontecer em tempo real: a inferência e o aprendizado.

A primeira coisa que vem à mente é que em tempo real significa aprendizado em tempo real, em que um modelo recebe continuamente novos dados de treinamento e atualiza seus parâmetros. Isso certamente é empolgante, mas ainda é raro de se encontrar na vida real. Porém, “em tempo real” também significa inferência em tempo real, em que um modelo treinado é capaz de receber solicitações a qualquer momento e retornar previsões de forma síncrona. Isso é encontrado na vida real com mais frequência.

Nesse artigo, apresentamos estratégias para criar modelos que fazem previsões em tempo real.

Conheça nossas oportunidades

Por que usar modelos em tempo real?

Às vezes você precisa usar um modelo em tempo real simplesmente porque o problema que está tentando resolver exige a tomada instantânea de decisões.

Supondo que você deva criar uma solução baseada em AM que ajude a escalar e aprimorar o serviço ao usuário. Toda vez que um usuário abre o bate-papo em nosso app e escreve uma mensagem, devemos automaticamente identificar sobre o que ele está falando e agir de acordo (por exemplo, redirecionando-o a um bate-papo com um especialista humano).

Podemos encarar essa situação como um problema de classificação com múltiplas classes, que podem ser diferentes produtos (como cartão de crédito, conta-poupança, investimentos e assim por diante), e criar um classificador que recebe o texto escrito pelo usuário e retorna o produto sobre o qual ele provavelmente está falando.

Esse caso de uso requer um modelo em tempo real porque o modelo consome dados recém-gerados e também porque o usuário espera uma resposta rápida. A partir desse caso de uso específico, podemos tentar definir algumas regras básicas que nos ajudem a decidir quando o uso de um modelo em tempo real é ideal (ou necessário):

  • Experiência do cliente aprimorada. Há várias situações similares ao nosso caso de uso, em que uma resposta síncrona é esperada. Também há outros casos de uso em que o modelo precisa estar incorporado a um dispositivo móvel e, assim, fazer previsões em tempo real. Isso poderia acontecer, por exemplo, se o modelo precisasse gerar previsões mesmo quando não há conexão com a Internet.
  • Uso de dados mais recentes. Modelos em lote fazem previsões a partir de dados que têm pelo menos algumas horas de vida. Os modelos em tempo real, por outro lado, são capazes de fazer previsões a partir de dados que têm apenas alguns segundos de vida, como o texto que o usuário acabou de escrever ou sua localização atual.
  • Conjunto desconhecido (ou muito grande) de entradas. Os modelos em lote fazem previsões a partir de um conjunto predefinido de entradas. Por exemplo, podemos ter um modelo de fraude que é executado em lotes e gera uma classificação de fraude para cada usuário – neste caso, o conjunto de entradas corresponde ao conjunto de usuários. Às vezes, não é possível saber antecipadamente quais são todas as entradas possíveis. Em nosso caso, o conjunto de entradas seria o conjunto de todos os textos que os usuários podem escrever, que são em sua maioria desconhecidos.
  • Uso eficiente dos recursos. Os modelos em lote geram previsões para todas as entradas possíveis, mesmo quando a maioria dessas previsões não é usada para a tomada de decisões. Os modelos em tempo real, por outro lado, geram previsões para uma entrada por vez, somente quando são necessários.

Certo. Há muitos bons motivos para criar modelos em tempo real. Agora é só uma questão de implantá-los. Deve ser rápido e fácil, certo? Poderíamos fazer isso com menos de 10 linhas de código:

Primeira tentativa de servir um modelo em tempo real

Não tão rápido.

Como criar modelos em tempo real?

Como as limitações de infraestrutura podem afetar as decisões de modelagem, criar um modelo em tempo real requer uma colaboração estreita entre o cientista de dados e o engenheiro de aprendizado de máquina.

Falaremos sobre dois requisitos que devem ser observados desde o início do desenvolvimento de um modelo em tempo real: pipeline em tempo real e inferência rápida.

Pipeline em tempo real

Um pipeline em tempo real deve coletar e preparar todas as entradas requeridas pelo modelo. Os dados podem ser coletados de diferentes fontes:

  • Conteúdo da solicitação. No cenário mais simples do nosso caso de uso, poderíamos usar o texto escrito pelo usuário como única entrada. Logo após o usuário executar uma ação, como escrever uma mensagem e pressionar o botão enviar, os dados são adicionados ao conteúdo e enviados diretamente ao modelo por meio de uma solicitação.
  • Eventos de streaming. Se quisermos enriquecer nosso modelo adicionando mais informações sobre o comportamento recente do usuário, poderíamos criar um recurso que incluísse as últimas telas que o usuário viu antes de abrir o bate-papo. Esses dados não estariam disponíveis no contexto do nosso microsserviço do modelo de bate-papo, nem no contexto de um ambiente analítico. Como esses dados são muito recentes, teríamos que capturá-los a partir de eventos de streaming gerados por outros microsserviços.
  • Histórico de recursos. Podemos aprimorar ainda mais o nosso modelo adicionando também informações sobre o histórico do usuário. Poderíamos criar um recurso que nos diga quais produtos o usuário utilizou mais nos últimos 60 dias. Esse recurso seria gerado com a agregação de dados históricos. Pode ser demorado gerar isso em tempo real; portanto, a forma ideal seria gerar previamente esse conteúdo em lotes, para que pudéssemos recuperá-los de um histórico de recursos.

Após a coleta dos dados, ainda precisamos reprocessá-los. Dados históricos vindos do histórico de recursos já são pré-processados, enquanto dados novos vindos do conteúdo da solicitação ou de eventos de streaming estão em formato bruto. Agora, podemos ver claramente que temos dois pipelines separados: um pipeline em lote e um pipeline em tempo real.

Queremos garantir que a função de reprocessamento, que foi aplicada aos dados no pipeline em lote durante o treinamento, seja exatamente a mesma função aplicada ao pipeline em tempo real durante a inferência. Não fazer isso é conhecido como distorção entre treinamento e exibição.

Inferência rápida

Você se lembra daquela rede neural de ponta que criou, com 99% de precisão para todas as classes? Se você tentar medir o tempo de previsão, pode se surpreender ao constatar que ela pode levar vários segundos. Embora isso pareça rápido, especialmente para uma grande rede neural, na verdade não é.

Uma resposta considerada rápida geralmente leva milissegundos. Pense em quanto tempo o usuário está disposto a esperar antes de repetir uma ação ou simplesmente sair do app.

Os modelos em tempo real precisam ser rápidos. Basicamente, há duas formas de torná-los mais rápidos: usar hardware mais poderoso ou criar modelos mais leves.

Usar um hardware mais poderoso (como GPUs) parece uma correção rápida e razoável, mas pode ser difícil de manter em longo prazo, pois provavelmente seria uma solução não padronizada e exigiria um monitoramento mais próximo. Além disso, o tempo geral de resposta pode não ser rápido o bastante. Se tivéssemos um modelo pesado que precisasse executar inferências na GPU, haveria uma sobrecarga considerável de comunicação entre a CPU e a GPU.

Por outro lado, criar modelos mais leves é mais eficiente e fácil de manter. Se estivéssemos usando modelos leves, poderíamos escalar horizontalmente os serviços de aprendizado de máquina assim como os microsserviços regulares, possivelmente usando ferramentas internas já existentes na empresa.

Modelos pesados podem ser compactados com o uso de várias técnicas, como:

  • Corte (Pruning). Encontrar pesos redundantes em uma árvore ou rede neural e defini-los para zero, ou seja, cortar algumas conexões entre nós no modelo. Isso é baseado na suposição de que um modelo complexo contém vários submodelos, e portanto o corte tenta encontrar um submodelo otimizado.
  • Destilação de conhecimento. É quando um modelo compacto aprende a imitar o comportamento de um modelo grande. Isso é usado no contexto de redes neurais. Podemos treinar um modelo destilado do zero ou usar modelos destilados pré-treinados já disponíveis em bibliotecas. Um modelo desses é o DistilBERT, uma versão destilada do BERT que tem apenas 60% do tamanho do modelo original.
  • Quantização. Consiste na redução da precisão dos números de ponto flutuante que representam os pesos do modelo. Isso geralmente é feito após o treinamento, pois tentar otimizar os pesos usando valores de baixa precisão pode levar a um treinamento instável ou até a divergências. Por exemplo, podemos reduzir a precisão de pesos de números de ponto flutuante de 32 bits para números inteiros de 8 bits, o que resultaria em um modelo 4 vezes menor.

É importante ressaltar que o corte e a quantização estão disponíveis no TensorFlow e no PyTorch, então deve ser rápido e fácil executar experimentos combinando técnicas diferentes.

Além dos modelos de compactação, também podemos avaliar a eficácia de usar caching para armazenar algumas previsões. Em nosso caso de uso, após pré-processar a entrada de texto, podemos acabar com uma entrada que se repete com frequência. Nesse caso, poderíamos invocar o modelo somente na primeira vez que essa entrada fosse vista e nas chamadas seguintes, buscaríamos a previsão diretamente a partir do cache.

Mas… isso é a vida real?

Sim, com certeza! A maioria das empresas inicia sua jornada de aprendizado de máquina fazendo experimentos com modelos em lote, pois são percebidos como uma abordagem mais fácil e segura. Porém, conforme os especialistas em aprendizado de máquina e as partes interessadas da empresa trabalham juntos para descobrir novas áreas, em que o aprendizado de máquina poderia ser aplicado para maximizar valor, os problemas que exigem modelos em tempo real (como o modelo do bate-papo que mencionamos) inevitavelmente surgem.

Muitas empresas já estão entregando modelos de aprendizado de máquina em tempo real de forma segura e escalável, incluindo o Nubank. Se você gostaria de saber o que é possível fazer com sistemas de aprendizado de máquina em tempo real, junte-se a nós.


Written by Ana Martinazzo
Reviewed by Felipe Almeida

Conheça nossas oportunidades