Colhendo flores do Iris dataset com o Vertex Feature Store (Legacy) 💐

João Garrido
google-cloud-brasil
8 min readAug 22, 2022

💭 Introdução

Feature Stores são componentes de armazenamento de dados que possuem como propósito geral organizar e disponibilizar recursos orientados a rotinas de predição e treinamento de modelos de Machine Learning através de uma arquitetura híbrida, tradicionalmente composta por dois canais com diferentes objetivos de recuperação:

  • Offline Feature Store: Canal de recuperação de dados em batch, comumente em faixas e/ou marcações temporais específicas (point-in-time recoveries)
  • Online Feature Store: Canal de recuperação de features mais recentes, com baixa latência, para realizar predições em modelos de Machine Learning

Com a Vertex AI (a plataforma de Data Science & Machine Learning do Google Cloud), podemos facilmente realizar o deployment de um Feature Store, utilizando uma funcionalidade chamada Vertex Feature Store. O Vertex Feature Store permite armazenar os dados tanto no canal online quanto offline a partir de uma API unificada para ingestão, além de também disponibilizar recursos complementares, tais como: camada de registro, metadados, monitoramento de features, integrações com outros serviços de dados e IA do Google Cloud, além de compatibilidade com frameworks open-source, como o Pandas.

Arquitetura Funcional do Vertex Feature Store

O Vertex Feature Store possui um modelo de dados bastante simples, composto por:

  • Featurestores: Camada lógica de armazenamento de um conjunto de entidades
  • Entidades(e tipos de entidades): Identificadores de atributos (ex: ids de usuários, chaves, hashes, nomenclaturas, etc.)
  • Features: Atributos associados às Entidades, possuem diferentes significados e estão diretamente ligados a modelos de Machine Learning (seja durante o treinamento, seja para obter previsões)

A fim de representar melhor o modelo de dados do Feature Store, podemos utilizar a seguinte referência (disponível na documentação do Vertex Feature Store), que descreve um exemplo de armazenamento de features para um cenário de avaliação de filmes:

Representação do modelo de dados do Vertex Feature Store

No exemplo, temos as seguinte correspondências:

  • Entidade/Tipo de Entidade: movie_id (identificador único de cada filme)
  • Feature/Valor de Feature: average_rating (média de avaliação, podendo variar de 0 a 10)
  • Timestamp: update_time (a representação temporal de quando aquelas features foram geradas para cada tipo de entidade)

A partir dessas definições, poderíamos facilmente recuperar essas informações pensando em diversas finalidades, por exemplo, para que um modelo de Machine learning pudesse classificar um determinado filme como sendo um filme bom, ruim, etc, baseado na coluna “average_rating”.

Neste artigo, vamos entender os princípios fundamentais de um Feature Store de forma prática, realizando a ingestão e a recuperação de features de flores do Iris dataset, com diferentes objetivos:

👨🏾‍🔧 Pré-requisitos

  • O Google Cloud SDK instalado e autenticado (você também pode utilizar o Cloud Shell no Google Cloud Console dentro do seu projeto)
  • Python 3.7 (ou superior) instalado, com os respectivos pacotes e suas versões: numpy=='1.19.5' ,pandas=='1.3.5' ,scikit-learn=='1.0.2' e google-cloud-ai-platform=='1.14.0'
  • Um projeto no Google Cloud com uma VPC subnet em uma região de sua preferência e as APIs do BigQuery e da Vertex AI habilitadas
  • Um ambiente Jupyter Notebook contendo a extensão google.cloud.bigquery (que permite a utilização da magic function do BigQuery para facilitar a manipulação de dados através de SQL ANSI dentro dos notebooks) e com acesso credenciado ao projeto do Google Cloud

💡 Sugestão: Utilize os notebooks do Vertex AI Workbench para reproduzir o código (uma opção de ambientes Jupyter otimizados para Machine Learning e nativamente integrados com outros serviços do Google Cloud)

🌺 Carregando e entendendo o conjunto de dados: Iris dataset

O Iris Dataset é um conjunto de dados que contém quatro características (comprimento e largura das sépalas e pétalas) de 50 amostras de três espécies de Iris (Iris setosa, Iris virginica e Iris versicolor). Essas medidas foram utilizadas para criar um modelo linear discriminante para classificar as espécies. O conjunto de dados é frequentemente utilizado na mineração de dados, exemplos de classificação e agrupamento e para testar algoritmos.

Neste artigo, trabalharemos com a biblioteca scikit-learn para realizar a ingestão do dataset e produzir algumas amostras, introduzindo uma certa quantidade de ruído para simular pequenas diferenças históricas nos dados ingeridos (de modo que seja possível representar um pouco melhor um cenário real de armazenamento de features em diferentes intervalos de tempo).

Após realizada a ingestão do dataset para a memória, podemos gerar algumas amostras, adicionando ruído à informação e retrocedendo no tempo, de forma que tenhamos pequenas variações históricas dessas features:

Dessa forma, iremos obter diferentes valores de features para cada id de flor. Tomando como exemplo a flor 0 (cujo id é flower_0), teremos alguns dos seguintes valores históricos:

Head dos dados gerados para a flower_0

🧱 Inicializando o Feature Store

Uma vez definido o nosso conjunto de dados histórico, é possível inicializar um novo Feature Store de forma bem simples utilizando o SDK da Vertex AI.

O Feature Store irá provisionar uma infraestrutura distribuída (baseada em uma certa quantidades de nós de computação), escalável e altamente disponível para que tenhamos as nossas features disponíveis para recuperação de baixa latência e também de forma histórica, sendo estas opções definidas por dois canais, chamados online e offline Feature Store, respectivamente.

👷🏽‍♀️ Realizando a ingestão de features para o BigQuery

A partir do nosso dataset de amostras (que é um objeto Pandas Dataframe), podemos gerar um arquivo Parquet e utilizá-lo para persistir os dados em disco, o que tornará possível a realização de um processo de ingestão em batch para o BigQuery (utilizando o método load da CLI), um processo que disponibilizará os dados que você fez a ingestão em uma estrutura serverless de armazenamento colunar, orientada à recuperação e processamento massivo de dados e nativamente integrada ao Vertex Feature Stores.

Além disso, o Vertex AI Feature Store também já possui mecanismos de ingestão de features em batch a partir de tabelas no BigQuery, arquivos no Cloud Storage ou diretamente a partir de um objeto Pandas Dataframe.

É válido ressaltar que a API de ingestão de dados do Vertex Feature Store também possui compatibilidade com o formato Pandas Dataframe , porém, utilizaremos o BigQuery para simular um caso de uso um pouco mais próximo do real, onde os dados já estariam disponíveis em um Enterprise Data Warehouse

Utilizando a magic function "bash" no Jupyter Notebook para executar a CLI do BigQuery
Persistindo o dataframe em Parquet para realizar a ingestão no BigQuery
Utilizando a magic function "bigquery" no Jupyter Notebook para definir o schema da tabela
Utilizando a magic function "bash" no Jupyter Notebook para carregar o arquivo Parquet para o BigQuery

👷🏿 Definindo as features do Feature Store

Uma vez definido o repositório de staging de features no BigQuery, podemos executar a criação das features pela própria UI do Feature Store.

É válido ressaltar que as features representam informações que serão armazenada dentro da estrutura lógica de uma entidade (um identificador, tal como um id, um SKU, um hash, etc.), ou seja, para cada entidade, teremos n features, seguidas de um timestamp, que representa um carimbo do quão atual é aquele valor dentro do Feature Store:

Entidade[feature_1, feature_2, …, feature_n] + [timestamp]

👷🏾‍♀️ Ingestão e Recuperação de Features (canal online)

Agora vamos pular rapidinho pra console e definir um novo job de ingestão de features a partir do BigQuery para posteriormente poder recuperá-las do canal online do Feature Store.

Após finalizado o job de ingestão, vamos recuperar features do canal online para um determinado id:

Com isso, estaremos recuperando os valores mais atuais de feature para a flor número 113:

Features recuperadas para a flor "flower_113"

🕒 Point-in-time Recovery (canal offline)

Através do Feature Store, também é possível recuperar features em batch para diferentes timestamps. É através do canal offline do Feature Store que podemos consumir “fatias” de features em diferentes intervalos de tempo e exportá-las, seja no formato de arquivos no Cloud Storage, tabelas no BigQuery ou Pandas Dataframes.

Esse processo reforça a ideia de termos um repositório centralizado de features com características híbridas, proporcionando, ao mesmo tempo, baixa latência e consistência de recuperação histórica utilizando uma estrutura unificada.

Por exemplo, podemos recuperar features em batch em um timestamp retroativo:

Dessa forma, será possível recuperar as features do passado:

Features do passado recuperadas para a flor "flower_139"

Em seguida, podemos também recuperar as features mais recentes do canal online para o mesmo id:

Dessa forma, podemos realizar a comparação do quão diferentes são os valores atuais dos valores de 20 dias atrás:

Features "quentes" (mais atuais) recuperadas para a flor "flower_139"

👩🏾‍🔬 Bônus: Consumindo features para inferência

Como já observamos, um dos objetivos de ter um Feature Store é facilitar o consumo das features de uma maneira rápida para que modelos de Machine learning possam realizar predições.

Para que possamos posteriormente consumir as nossas features pensando no propósito de inferência de modelos de IA, vamos primeiro reutilizar o Iris dataset (que está armazenado em memória) para treinar um classificador do tipo Decision Tree Classifier.

Agora que temos um modelo treinado, podemos consumir features do nosso Feature Store para realizar predições, que é o que tende a ocorrer em um cenário real.

Com isso, é possível recuperar a informação de maneira centralizada e rápida, a partir de uma determinada entidade. Por exemplo, podemos imaginar que uma das flores registradas no nosso jardim (ou seja a flower_0, ou a flower_1, , enfim) passa pelo nosso sistema de classificação em um determinado momento. Podemos instanciar o tipo de entidade(id) na nossa aplicação, para posteriormente resgatar as features rapidamente, a partir do seu id de entrada, consultando o canal online, que já nos trará a visão mais atualizada dos atributos e, dessa forma, poderemos servir valores para que o modelo de Machine learning realize uma classificação, de forma simples, rápida e resiliente.

É válido ressaltar que o método de leitura read das entidades do Feature Store sempre recupera o timestamp mais atual do canal online, com o propósito de oferecer um consumo de baixa latência.

Para gerar ainda mais explicabilidade nas predições do nosso modelo, podemos definir um dicionário de índices e targets, de modo que, para cada index (0, 1 ou 2), possamos recuperar sua respectiva classe, i.e., o tipo da flor (setosa, versicolor ou virginica) — uma alternativa simples para transformação dos valores numéricos de classes para valores categóricos.

Valores de índices para representação categórica das classes de Iris

Com isso, podemos realizar predições, recuperando ids aleatórios dentro do nosso Feature Store (através do método read da classe EntityType):

No caso, teremos como resultado:

Resultado das predições realizadas através da recuperação de features do Feature Store

👨🏽‍🎓 Conclusão

Neste artigo, pudemos entender um pouco melhor sobre os conceitos fundamentais de um Feature Store, bem como:

  • Componentes de arquitetura do Feature Store (canal online e offline)
  • Modelo de dados do Feature Store (composto por Featurestore , entidades e features)
  • Como ingerir/recuperar features do Vertex AI Feature Store, para inferência e point-in-time check

Para deletar o Feature Store, basta utilizar o método delete da classe Featurestore:

💡 Referências

--

--