O blog da AWS

Como a Conta Azul criou um sistema de gerenciamento e inferência de modelos utilizando o Amazon Sagemaker Multi-model Endpoints

Post escrito pela equipe da AWS e Conta Azul

INTRODUÇÃO

A Conta Azul é uma empresa brasileira de plataforma de gestão para micro e pequenas empresas. O objetivo principal da plataforma é que ela seja acessível e que as empresas tenham

ISV Partner
Contato Parceiro
Opinião sobre o Parceiro

segurança na hora de cumprir suas obrigações fiscais e manter suas finanças em dia. Com base em Santa Catarina, a Conta Azul é parte da AWS Partner Network como um Parceiro ISV.

Diversas funcionalidades da Conta Azul utilizam modelos de inteligência artificial (IA) para automatizar e otimizar tarefas que, até então, eram feitas manualmente pelo dono do negócio. Por exemplo, a recomendação de categorias para a classificação de lançamentos financeiros, que permite a organização das receitas e despesas das empresas em um plano de contas.

Neste post, vamos mostrar como a Conta Azul utilizou o Amazon SageMaker Multi-Model Endpoints para otimizar e reduzir o esforço operacional na geração de inferências em tempo real com milhares de modelos para recomendação de categorias de lançamentos financeiros de cada cliente.

DESAFIO

A utilização de um plano de contas é a forma de organizar a movimentação financeira de uma empresa, separando as receitas e despesas em categorias de acordo com seu tipo ou finalidade. Na prática, cada categoria acaba representando uma “caixa” que armazena todos os lançamentos financeiros que fazem parte de um mesmo grupo. Por exemplo, uma empresa pode separar suas despesas em categorias como “Aluguel” e “Contas Pessoais”, enquanto classifica suas receitas nas categorias “Vendas” e “Recebimentos”.

Conta Azul

Categorização de Lançamentos Financeiros

 

A Conta Azul permite que cada cliente crie suas próprias categorias, organizando seus lançamentos financeiros da forma mais adequada para o gerenciamento do seu negócio. Assim, ao criar ou exportar novos lançamentos, clientes diferentes terão recomendações de categorias baseadas em modelos de inteligência artificial diferentes, treinados e melhorados a partir das interações individuais de cada cliente.

 

Seguindo a premissa de múltiplos modelos diferentes por cliente, alguns questionamentos surgiram durante o desenvolvimento do serviço:

  1. Como escalar a infraestrutura de inferência para milhares de modelos e requisições?
  2. Como gerenciar em escala as atualizações de modelos já carregados na infraestrutura dedicada à inferência?

Da maneira com que o serviço estava implementado anteriormente, as inferências eram tratadas por pods do Amazon EKS. Entretanto, mesmo que os pods entregassem a escala necessária para atender essas requisições, o processo envolvia muitos modelos, e a atualização dos mesmos se tornou uma tarefa muito custosa. Isso porque versões diferentes de um mesmo modelo eram carregadas nos pods, causando erros por falta de memória disponível, e também obrigando a reinicializar todos os pods para que apenas os modelos atualizados fossem utilizados.

Além dos problemas acima, gerenciar todo esse pipeline era muito caro e despendia muito tempo do time de engenharia de dados, pois todas as alterações dependiam da implementação de novas configurações para adequarem-se às necessidades (como gerenciamento de memória nos pods, lógicas para roteamento de requisições, implementar testes A/B, etc).

SOLUÇÃO

Para endereçar o desafio de gerenciamento e hospedagem dos milhares de modelos de machine learning (ML) em produção, a Conta Azul implementou seus modelos em endpoints de hospedagem gerenciados do Amazon SageMaker utilizando a funcionalidade de Multi-Model.

O Amazon SageMaker Multi-Model Endpoints permite implantar desde poucos até centenas de milhares de modelos e servir resultados de inferências a partir de um único contêiner. Algoritmos incorporados e frameworks no Amazon SageMaker  já suportam nativamente a opção de multi-model. Caso sejam necessárias personalizações, é possível criar seu próprio contêiner seguindo as especificações do Amazon SageMaker Multi-Model Endpoints para isso.

Além disso, essa solução carrega dinamicamente modelos conforme você os invoca. Por padrão, o Amazon SageMaker Multi-Model Endpoints faz cache dos modelos que são frequentemente usados em memória e em disco para fornecer inferência de baixa latência. Os modelos em cache são descarregados e/ou excluídos do disco somente quando um contêiner fica sem memória ou sem espaço em disco para acomodar um modelo recém-implementado.

Assim, os multi-model endpoints fornecem uma modalidade de implementação de múltiplos modelos totalmente gerenciada e altamente disponível, habilitando os cientistas de dados a focarem nos seus modelos ao invés de se preocuparem com a operação e manutenção da infraestrutura necessária para servir os resultados de inferência de seus modelos.

Personalizando o uso do Amazon SageMaker com seus próprios contêineres para multi-model endpoints

No cenário da Conta Azul, o time de engenharia e ciência de dados optou por criar seu próprio contêiner de inferência para adicionar dependências específicas no contêiner e também poder utilizar uma lógica de inferência customizada. Para isso, a base do contêiner de predição foi construída utilizando a biblioteca do Amazon SageMaker Inference Toolkit e também Multi Model Server.

O Amazon SageMaker Inference Toolkit foi desenvolvido pela AWS para facilitar a criação de contêineres customizados e trazê-los para serem usados no Amazon SageMaker. Esse toolkit open-source facilita diversos aspectos na criação do contêiner Docker para inferência, implementando a camada para servir de modelos de ML, API para invocar modelos e também APIs e comportamentos adicionais necessários para o multi-model endpoint como APIs de carregamento, listagem, obtenção e descarregamento de modelos. Com essa simplificação, usando o Amazon SageMaker Inference Toolkit, você não precisa se preocupar excessivamente com esses detalhes e pode focar no código de inferência de ML, ainda mantendo seu contêiner aderente ao SageMaker e seguindo as especificações necessárias da modalidade multi-model.

Observação: o Amazon SageMaker Inference Toolkit é construído sobre outra biblioteca open-source desenvolvida pela AWS que se chama Multi Model Server (MMS). Enquanto o MMS foi desenvolvido para servir modelos de ML e fornecer APIs de gerenciamento de modelos (carregar, listar, obter e descarregar modelos), o Amazon SageMaker Inference Toolkit, por sua vez, abstrai diversos aspectos do MMS, implementando detalhes específicos para que seu código fique compatível com o SageMaker e também pré-configurando o MMS por baixo. Você pode encontrar mais detalhes aqui no Github.

Se você usa um algoritmo incorporado ou outras imagens Docker de frameworks gerenciados do Amazon SageMaker, é possível que o Amazon SageMaker Inference Toolkit possa já estar incluído. Alguns exemplos: Scikit-Learn, XGBoost e PyTorch.

Arquitetura

A arquitetura apresentada na imagem abaixo mostra como a Conta Azul utiliza o multi-model endpoint para servir inferências dos modelos:

Conta Azul

Fluxo para Inferência utilizando o Multi-Model endpoint

As seguintes etapas compõem o processo de inferência:

  1. A função lambda_handler do AWS Lambda recebe o payload para a requisição de inferência e extrai o ID da empresa que deseja fazer essa requisição.
  2. Essa mesma função faz a requisição invoke_endpoint para o modelo da empresa. Em caso de erro, quando o modelo não é encontrado, a requisição é feita novamente para o modelo global. O modelo global é utilizado apenas em casos onde o modelo próprio da empresa ainda não está disponível ou ainda possui baixa precisão.
(...)
runtime= boto3.client('runtime.sagemaker')
def lambda_handler(event, context) {
        (...)
        payload = load_payload(event)
        (...)
     response_company = sagemaker_runtime(
                        EndpointName="Endpoint",
                        ContentType="application/json",
                        TargetModel=some_company_model,
                        Body=json.dumps(payload)
                        )
     response_global = sagemaker_runtime(
                        EndpointName="Endpoint",
                        ContentType="application/json",
                        TargetModel=global_model,
                        Body=json.dumps(payload)
                         )
}
(...)

O blog post “Call an Amazon SageMaker model endpoint using Amazon API Gateway and AWS Lambda” mostra um exemplo de como fazer requisições de Endpoints SageMaker usando o AWS Lambda.

  1. No endpoint, o Amazon SageMaker se encarrega de chamar a função initialize, definida no contêiner de predição, para carregar o modelo da requisição em memória.
(...)
    class ModelHandler(object):
        def __init__(self):
            self.model = {}
            self.initialized = False
        def initialize(self, context) {
            model_dir = context.system_properties.get("model_dir")
            self.model = self._load_model(model_dir)
            self.initialized = True
        }
(...)

4. Após carregar o modelo em memória, os dados de entrada são pré-processados para serem utilizados pelo modelo. Esse pré-processamento consiste nos seguintes passos:

  • Normalização das funcionalidades categóricas, retirando espaços, pontuação e caracteres especiais;
  • Padronização das funcionalidades numéricas, distribuindo os valores em uma mesma escala;
  • Utilização de TF-IDF (term frequency – inverse document frequency) para identificar as palavras mais relevantes nas funcionalidades categóricas;
  • Aplicação de one hot encoding e label encoding para transformar as funcionalidades categóricas em valores numéricos.
  1. Em seguida, a função handle é chamada para realizar a inferência a partir dos dados de entrada. É importante notar que cada modelo possui dois submodelos, um de crédito, treinado com os dados de receitas, e outro de débito, treinado com dados de despesas. Assim, no processo de inferência, os lançamentos de crédito e débito do payload são divididos pela função parse_data_by_statement e enviados para a inferência nos seus respectivos submodelos.
(...)
        def handle(self, data, model) {
              result = {}
            for (
                parsed_data,
                categories,
                statement_type
            ) in self.parse_data_by_statement(data):
                result.update({
                    zip(
                        parsed_data.get("id"),
                        model(parsed_data)
                    )
                })
             (...)
            return result
        }
(...)

Mais detalhes sobre como adaptar o seu próprio contêiner de inferência podem ser encontrados na documentação do Amazon Sagemaker.

  1. Após a realização da inferência, as categorias retornadas para cada lançamento são pós-processadas para o retorno. O pós-processamento consiste na aproximação léxica entre as categorias previstas pelo modelo e as categorias cadastradas pelo cliente. Essa aproximação é feita utilizando o algoritmo da Distância de Levenshtein e é necessária pois na utilização do modelo global as categorias previstas pelo modelo podem não pertencer à lista de categorias do cliente, assim, deve-se encontrar as categorias da lista lexicalmente mais próximas às categorias previstas.
  2. A função lambda_handler do AWS Lambda recebe a lista com as predições retornadas pela requisição.
(...) prediction = parse_prediction(response_company,response_global) (...)
  1. Por fim, essa função retorna as predições com a mensagem de sucesso para o serviço utilizado pelo cliente.
return prediction #{"id1":"prediction_value1","id2":"prediction_value2"}

CONCLUSÃO E PRÓXIMOS PASSOS

A utilização do Amazon SageMaker Multi-Model Endpoints possibilitou a escalabilidade que a Conta Azul precisava para atender os clientes durante o uso da conciliação bancária automática. Hoje, o Classify (nome dado a solução de categorias para lançamentos bancários) faz uso do autoscaling, o que possibilita ao serviço escalar de forma efetiva e com alta disponibilidade, chegando a suportar mais de mil requisições por minuto em momentos de pico.

Com o carregamento de modelos em memória gerenciado pelo próprio Amazon SageMaker, foi possível fazer com que o cliente sempre acesse o seu modelo mais atual, treinado com o seu conjunto de dados de movimentações mais recentes. Isso torna a recomendação das categorias cada vez mais assertiva, permitindo tanto uma constante evolução para o cliente quanto um baixo custo de manutenção das rotações e gerenciamento de modelos do time de engenharia e ciência de dados.

Além das melhorias vistas pelo lado dos clientes da Conta Azul, a nova arquitetura do serviço reduziu o tempo de manutenção e realizações de melhorias no algoritmo. Os testes de implementações que antes poderiam em alguns casos levar semanas, hoje levam dois dias no pior cenário, sendo realizados com mais velocidade e praticidade. Com isso, é possível não apenas melhorar continuamente o serviço, mas também realizar testes A/B nas mudanças implementadas e entregas contínuas pela equipe de ciência de dados, reduzindo o impacto das atualizações em ambientes de produção.

Com a funcionalidade de multi-model endpoints do Amazon SageMaker, a Conta Azul conseguiu resolver o seu desafio de otimização de custos e redução do esforço operacional para hospedagem e gerenciamento dos modelos em produção. Atualmente, o time está evoluindo ainda mais sua solução e construindo um framework interno com o Amazon SageMaker Multi-Model Endpoints que irá permitir treinar, disponibilizar e evoluir algoritmos de machine learning em escala, com volume e custo controlado, dando flexibilidade tanto para o time de engenharia como o time de ciência de dados. Assim, todos da Conta Azul poderão entregar cada vez mais inteligência para micro e pequenas empresas, simplificando ainda mais o dia a dia do pequeno e microempreendedor.


 

Sobre os Autores

Danilo Gomes Danilo Gomes é um Cientista de Dados na Conta Azul. Tem mais de cinco anos de experiência na área de dados, participou de projetos para grandes empresas e fez estágio na Temple University, nos EUA. Tem como foco análise, visualização de dados e machine learning.
Erica do Carmo Êrica do Carmo atua como Cientista de Dados na Conta Azul. Gosta de boas histórias, problemas lógicos e colecionar xícaras de café. No momento está passando as madrugadas acordada para concluir o curso de Ciência da Computação.
Gabriel Bellon Gabriel Bellon é Cientista de Dados na Conta Azul, tem mais de 10 anos de experiência nas áreas de Business e Data Intelligence em diversos segmentos do mercado. Também é geek interessado em entender como as coisas funcionam, além de gostar de passar um tempo jogando algum game ou lendo livros.
Joao Martins João Martins é um arquiteto de Soluções da AWS que atua principalmente com empresas do setor de varejo que estão iniciando sua jornada para a nuvem. Apesar de ser um arquiteto generalista, possui como principal área de interesse AI/ML.
Marcelo Cunha Marcelo Cunha é um arquiteto de soluções da AWS especialista em AI/ML. Em sua função, ele ajuda os clientes a criar soluções de ML para resolver os seus desafios de negócio utilizando a plataforma AWS. De uma família de médicos e profissionais da saúde, ele também tem interesse em aplicações de ML nesse setor.
Tiago Miguel Reichert Tiago Miguel Reichert é Arquiteto de Soluções na AWS e atua ajudando Parceiros ISV em sua jornada na nuvem. Tem grande interesse por automação, cultura DevOps e arquitetura de aplicações SaaS.
Yan Marim Yan Marim é arquiteto de soluções na AWS e tem interesse principalmente em AI/ML, apoiando clientes na sua jornada de transformação digital na nuvem.