O blog da AWS
Como iFood desenvolveu sua nova plataforma de recomendações
Por Bruno Pereira, Data Scientist Manager – iFood, André Gomes, Data Engineer – iFood e Renato Azevedo, Solution Architect, DNB – LATAM
Neste blog post, iremos apresentar como o iFood se beneficiou de uma nova arquitetura com objetivo de melhorar e escalar recomendações a partir da pré-indexação das predições de múltiplos modelos, permitindo a combinação desses com outras fontes de informação em tempo real.
O iFood recebe milhares de acessos simultâneos e, para cada acesso, o aplicativo carrega dezenas de conteúdos (restaurantes, pratos, mercados, produtos, etc) para orientar a escolha dos usuários. Portanto, os Sistemas de Recomendação que interagem com este ambiente em tempo real devem suportar de forma eficiente uma elevada carga de trabalho, garantindo alta disponibilidade e resiliência.
A área de Sistemas de Recomendação trabalha modelando e entendendo as preferências do cliente, a fim de personalizar a ordem dos conteúdos na aplicação e melhorar a experiência do cliente. Mais ainda, os clientes mudam suas preferências conforme o contexto em que está inserido, como localização, hora do dia, etc. Isso exige um esforço extra para cada modelo e serviço que construímos, aumentando o custo.
Mesmo um modelo simples como uma fatoração de matriz pode exigir um grande número de máquinas para servir as recomendações em tempo real. Como então poderíamos escalar dezenas de modelos diferentes? Como combinar todos eles com informações de contexto do cliente (a fim de aumentar a assertividade das recomendações)?
Solução proposta
Para endereçar as necessidades acima, o iFood desenvolveu uma uma nova plataforma, construída em uma arquitetura de microsserviços, separados pelos domínios de Ingestão e Servidor. Descrevemos essa arquitetura ao longo deste blog.
Arquitetura de Ingestão
Figura 1 – Arquitetura de Ingestão de Dados
Candidate Generation
A quantidade de conteúdos com os quais um cliente interage no aplicativo é muito menor do que o número de todos os restaurantes, pratos e categorias disponíveis no aplicativo. Portanto, em termos de tempo de processamento e otimização de utilização recursos computacionais, podemos incluir um fluxo de trabalho prévio de geração de candidatos a fim de filtrar entidades relevantes (ou potenciais) para diferentes contextos.
Os clientes que devem ser atualizados diariamente são selecionados pelo pipeline de geração de candidatos, bem como um conjunto reduzido de restaurantes para cada um deles. Esses candidatos são disponibilizados em vários arquivos no Amazon S3, que são processados por múltiplos modelos na etapa seguinte utilizando Amazon SageMaker.
Model Predictions
Nessa etapa é utilizado o Amazon SageMaker Pipelines para automatizar o processo de treinamento e predição de cada modelo de forma independente. Para escalar as predições, utilizamos Sagemaker Batch Transform a partir dos artefatos do modelo gerados na última etapa. A saída dessa etapa é escrita em múltiplos arquivos no Amazon S3, seguindo um formato predefinido e posteriormente processada por uma AWS Lambda.
Feature Publisher
Conforme as predições são salvas no Amazon S3, uma função AWS Lambda chamada de Feature Publisher é responsável por ler as predições no formato esperado para publicá-las em um tópico Kafka. De modo geral, o evento de criação de arquivos em pastas específicas dispara a execução da função que, transforma as mensagens em Avro com seu esquema predefinido no Schema Registry e as publica em uma tópico Kafka, usada como agregador de mensagens que serão processadas pelo Feature Consumer.
Feature Consumer
O Feature Consumer é uma aplicação em GOLang que consome dezenas de milhões de mensagens do tópico Kafka e as insere num banco de dados NoSQL que chamamos de Personalization Store. Esse banco é utilizado para manter cerca de dezena de bilhões de predições, com um esquema bem particionado a fim de garantir escalabilidade na leitura.
Zoltar Cabinet – Servidor de Predições (K8s + GoLang)
Figura 2 – Arquitetura do Servidor
Por fim, as predições dos vários modelos para cada usuário que foram armazenadas na Personalization Store são recuperadas conforme as sessões do aplicativo. Esse serviço é responsável por receber todas as chamadas do aplicativo, enriquecer com as predições pré-calculadas, além da integração com modelos de ordenação “à quente” (destacado na imagem como Re-Ranking).
Conclusão
Abaixo podemos ver os principais resultados alcançados pela nova plataforma:6x mais escalabilidade, saindo de 500 req/s para mais de 3000 req/s.
- Economia de ~50% nos custos para servir conteúdos na home principal do aplicativo, já que a maior parte da informação está pré-indexada.
- Melhoria na conversão das listas em aproximadamente ~10%, gerando:
- Aumento de pedidos (+1M em pedidos por mês)
- Frequência dos usuários (taxa de recompra nas listas +10%)
Sobre o autor
Bruno Pereira Mestre em ciências da computação pela Universidade Federal de Minas Gerais e atualmente estudante de doutorado na mesma instituição, com pesquisas focadas em aprendizagem online para recomendação sequencial de músicas. Possui 10 anos de experiência trabalhando com dados e atualmente é Data Scientist Manager no iFood, responsável por uma equipe incrível focada em melhorar a experiência do usuário através da personalização de conteúdo com recomendações melhores e mais assertivas.
https://www.linkedin.com/in/brunolaporais
André Gomes é Data Engineer com mais de 10 anos de experiência na área de dados, passando por empresas do setores bancário, varejo e serviços, e ajudando a desenvolver e implementar projetos de infraestrutura de dados, Arquitetura de dados (Data Lakes e DWs) e Desenvolvimento de aplicações na área de Dados. Atualmente trabalha no iFood visando a evolução e desenvolvimento da plataforma de recomendação.
https://www.linkedin.com/in/andregoems/
Renato Azevedo é Solutions Architect na AWS, especialista em computação em nuvem e mestre em Informática pela Universidade Federal do Rio de Janeiro. Ao longo de sua carreira, ele se concentrou em Cloud Computing, Data Centers, Resiliência, DevOps, Plataforma, Infraestrutura como código e observabilidade. Atualmente ajuda clientes em sua jornada na nuvem e a arquitetar arquiteturas resilientes.