Protótipo para produção: como conseguir previsões de modelos treinados personalizados

1. Visão geral

Neste laboratório, você vai usar a Vertex AI para receber previsões on-line e em lote de um modelo treinado personalizado.

Este laboratório é parte da série de vídeos Protótipo para produção. Finalize o laboratório anterior antes de tentar este. Para saber mais, confira o vídeo complementar:

.

Conteúdo do laboratório

Você vai aprender a:

  • fazer upload de modelos para o Vertex AI Model Registry;
  • implantar um modelo em um endpoint;
  • receber previsões on-line e em lote com a interface e o SDK.

O custo total da execução deste laboratório no Google Cloud é de aproximadamente US$ 1.

2. Introdução à Vertex AI

Este laboratório usa a mais nova oferta de produtos de IA disponível no Google Cloud. A Vertex AI integra as ofertas de ML do Google Cloud em uma experiência de desenvolvimento intuitiva. Anteriormente, modelos treinados com o AutoML e modelos personalizados eram acessíveis por serviços separados. A nova oferta combina ambos em uma única API, com outros novos produtos. Você também pode migrar projetos para a Vertex AI.

A Vertex AI inclui vários produtos diferentes para dar suporte a fluxos de trabalho integrais de ML. Os produtos destacados abaixo são o foco deste laboratório: Previsões e Workbench

Visão geral do produto Vertex

3. Configurar o ambiente

Finalize as etapas no laboratório Como treinar modelos personalizados com a Vertex AI para configurar seu ambiente:

4. Fazer upload de modelos para registro

Antes de usar nosso modelo para fazer previsões, precisamos fazer upload dele para o Vertex AI Model Registry, que é um repositório onde você pode gerenciar o ciclo de vida dos modelos de ML.

É possível fazer upload de modelos quando você configura um job de treinamento personalizado como mostrado abaixo:

training_prediction

Ou você vai poder importar os modelos ao final do job de treinamento se tiver armazenado os artefatos de modelo salvos em um bucket do Cloud Storage. Essa é a opção que vamos usar neste laboratório.

Navegue até a seção "Modelos" no console.

menu de modelos

Selecione IMPORTAR.

import_model

Selecione Importar como novo modelo e dê um nome para o modelo.

new_model

Em Configurações do modelo, importe o modelo com um contêiner pré-criado e use o TensorFlow 2.8. Você pode usar a lista completa de contêineres de previsão pré-criados aqui.

Depois informe o caminho para o bucket do Cloud Storage em que você salvou os artefatos de modelo no job de treinamento personalizado. A aparência será semelhante a esta: gs://{PROJECT_ID}-bucket/model_output.

Vamos pular a seção "Explicabilidade", mas se você quiser saber mais sobre a Vertex Explainable AI, consulte os documentos.

Quando o modelo é importado, ele aparece no registro.

flower_model

Se você quiser fazer isso pelo SDK em vez de usar a interface, execute o seguinte comando no notebook do Workbench para fazer upload do modelo.

from google.cloud import aiplatform

my_model = aiplatform.Model.upload(display_name='flower-model',
                                  artifact_uri='gs://{PROJECT_ID}-bucket/model_output',
                                  serving_container_image_uri='us-docker.pkg.dev/vertex-ai/prediction/tf2-cpu.2-8:latest')

5. Implantar modelos em um endpoint

Há dois tipos de jobs de previsão que podemos executar na Vertex AI: em lote e on-line.

A previsão em lote é uma solicitação assíncrona. É uma boa opção quando você não precisa de uma resposta imediata e quer processar dados acumulados em uma única solicitação.

Por outro lado, se você quiser previsões de baixa latência dos dados transmitidos de forma dinâmica para o modelo, use a previsão on-line.

Agora que o modelo está no registro, podemos usar as previsões em lote.

Mas, se quisermos previsões on-line, vamos ter que implantar o modelo para um endpoint. Isso associa os artefatos de modelo salvos aos recursos físicos nas previsões de baixa latência.

Para implantar um endpoint, selecione os três pontos no canto direito do modelo e escolha a opção Implantar no endpoint.

deploy_model

Dê um nome ao endpoint, deixe as outras configurações no estado em que se encontram e clique em CONTINUAR

endpoint_name

Como os endpoints funcionam com escalonamento automático, você pode definir o valor mínimo e o máximo. Os nós de computação vão fazer o escalonamento para atender à demanda de tráfego nesses limites.

Este laboratório é apenas para demonstração, não vamos usar esse endpoint para grandes volumes de tráfego. Você pode definir o número máximo de nós de computação como 1, e selecionar n1-standard-4 como Tipo de máquina.

endpoint_compute

Vamos pular o monitoramento de modelos, mas se você quiser saber mais sobre esse recurso, consulte estes documentos.

Depois clique em IMPLANTAR.

A implantação do modelo leva alguns minutos, mas quando acaba, o status muda para Implantado na Vertex AI.

Se você quiser implantar um modelo pelo SDK, execute o comando abaixo.

my_model = aiplatform.Model("projects/{PROJECT_NUMBER}/locations/us-central1/models/{MODEL_ID}")

endpoint = my_model.deploy(
     deployed_model_display_name='my-endpoint',
     traffic_split={"0": 100},
     machine_type="n1-standard-4",
     accelerator_count=0,
     min_replica_count=1,
     max_replica_count=1,
   )

6. Receber previsões

Previsões on-line

Como você pode selecionar o modelo depois de implantado em um endpoint REST como faria em qualquer outro, é possível chamar esse dispositivo usando uma função do Cloud, um bot de chat, um app da Web etc.

Para demonstração, vamos chamar este endpoint do Workbench.

Retorne ao notebook que você criou no laboratório anterior. Na tela de início, crie outro notebook do TensorFlow 2.

tf_kernel

Importar o SDK da Vertex AI para Python, numpy e PIL

from google.cloud import aiplatform

import numpy as np
from PIL import Image

Faça o download da imagem abaixo e o upload para sua instância do Workbench. Vamos testar o modelo nesta imagem de uma flor.

test_image

Primeiro defina o endpoint. Você vai precisar substituir o {PROJECT_NUMBER} e o {ENDPOINT_ID} abaixo.

endpoint = aiplatform.Endpoint(
    endpoint_name="projects/{PROJECT_NUMBER}/locations/us-central1/endpoints/{ENDPOINT_ID}")

É possível encontrar o "endpoint_id" na seção "Endpoints" do console do Cloud.

endpoint_id

O número do projeto aparece na página inicial do console e é diferente do ID do projeto.

project_number

O código abaixo abre e redimensiona a imagem com PIL.

IMAGE_PATH = "test-image.jpg"
im = Image.open(IMAGE_PATH)

Depois converta os dados numpy no tipo float32 e em uma lista. Como os dados numpy não são serializáveis em JSON nem podem ser enviados no corpo da solicitação, convertemos em uma lista.

x_test = np.asarray(im).astype(np.float32).tolist()

Por fim, chame endpoint.predict.

endpoint.predict(instances=x_test).predictions

O resultado é a saída do modelo, que é uma camada de softmax com cinco unidades. Se você quiser escrever uma lógica personalizada para retornar o identificador da string em vez do índice, use as rotinas de previsão personalizadas.

Previsões em lote

Há maneiras diferentes de formatar os dados na previsão em lote. Para simplificar, vamos despejar os dados numpy em uma arquivo JSON e salvar no Cloud Storage.

with open('test-data.json', 'w') as fp:
    json.dump(x_test, fp)

!gsutil cp test-data.json gs://{YOUR_BUCKET}

Depois defina o modelo. Essa etapa é semelhante à definição do endpoint, só que você vai precisar informar o MODEL_ID em vez do ENDPOINT_ID.

my_model=aiplatform.Model("projects/{PROJECT_NUMBER}/locations/us-central1/models/{MODEL_ID}")

Para encontrar o ID do modelo, selecione o nome e a versão dele na seção "Modelos" no console e escolha a opção DETALHES DA VERSÃO.

model_id

Por fim, use o SDK para chamar um job de previsão em lote acessando o caminho em que você armazenou o arquivo JSON e informando um local para armazenar os resultados no Cloud Storage.

batch_prediction_job = my_model.batch_predict(
    job_display_name='flower_batch_predict',
    gcs_source='gs://{YOUR_BUCKET}/test-data.json',
    gcs_destination_prefix='gs://{YOUR_BUCKET}/prediction-results',
    machine_type='n1-standard-4',)

Você pode rastrear o progresso do job na seção "Previsões em lote" do console. Não é vantajoso executar um job de previsão em lote para uma única imagem.

batch_pred

A seguir

Neste exemplo, primeiro convertemos a imagem de teste em numpy antes de fazer a chamada de previsão. Para casos de uso mais realistas, provavelmente você vai enviar a própria imagem em vez de carregar primeiro o arquivo como numpy. Você vai precisar ajustar a função do TensorFlow Serving para decodificar os bytes da imagem. Esse processo exige um pouco mais de trabalho, mas é muito mais eficiente para a criação de apps e imagens grandes. Confira um exemplo neste notebook.

Parabéns! 🎉

Você aprendeu a usar a Vertex AI para:

  • Fazer upload de modelos para o Vertex AI Model Registry
  • Fazer previsões on-line e em lote

Para saber mais sobre as diferentes partes da Vertex, consulte a documentação.

7. Limpeza

Cancele a implantação dos modelos que não planeja usar em um endpoint. Também é possível excluir o endpoint inteiro. A qualquer momento, você pode implantar de novo um modelo em um endpoint se necessário.

undeploy_model

Os notebooks gerenciados do Workbench expiram automaticamente depois de 180 minutos inativos. Para encerrar a instância manualmente, clique no botão "Parar" na seção "Vertex AI Workbench" do console. Se quiser excluir o notebook completamente, clique no botão "Excluir".

Interromper instância

Para excluir o bucket do Storage, use o menu de navegação do console do Cloud, acesse o Storage, selecione o bucket e clique em "Excluir":

Excluir armazenamento