Implemente um modelo no Vertex AI para obter previsões

Depois de preparar um modelo num cluster do Ray no Vertex AI, implemente o modelo para pedidos de previsão online através do seguinte processo:

Antes de começar, certifique-se de que lê a vista geral do Ray no Vertex AI e configura todas as ferramentas necessárias.

Os passos nesta secção partem do princípio de que usa o SDK do Ray no Vertex AI num ambiente Python interativo.

Comparação entre a inferência online do Vertex AI e a inferência do Ray

Funcionalidade Inferência online do Vertex AI (recomendado) Inferência do Ray (Ray Serve)
Escalabilidade Escala automática com base no tráfego (altamente escalável, mesmo para modelos GML) Altamente escalável com back-ends distribuídos e gestão de recursos personalizada
Gestão de infraestruturas Totalmente gerido pela Google Cloud, menos despesas gerais operacionais Requer uma configuração e uma gestão mais manuais na sua infraestrutura ou cluster do Kubernetes
API/Funcionalidades suportadas APIs REST e gRPC, inferências online e em lote, funcionalidades de explicabilidade, processamento em lote, colocação em cache e streaming APIs REST e gRPC, inferência em tempo real e em lote, composição de modelos, processamento em lote, colocação em cache, streaming
Formato do modelo Suporta várias frameworks, como TensorFlow, PyTorch, scikit-learn, XGBoost, através de contentores pré-criados ou de qualquer contentor personalizado Suporta várias frameworks, como TensorFlow, PyTorch e scikit-learn.
Facilidade de utilização Mais fácil de configurar e gerir, integrado com outras funcionalidades do Vertex AI Mais flexível e personalizável, mas requer um conhecimento mais profundo do Ray
Custo O custo depende dos tipos de máquinas, dos aceleradores e do número de réplicas O custo depende das suas escolhas de infraestrutura
Funcionalidades especializadas Monitorização de modelos, testes A/B, divisão de tráfego, integração do Registo de modelos do Vertex AI e dos Pipelines do Vertex AI Composição de modelos avançada, modelos de conjunto, lógica de inferência personalizada, integração com o ecossistema Ray

Importe e inicialize o cliente do Ray no Vertex AI

Se já tiver ligação ao cluster do Ray no Vertex AI, reinicie o kernel e execute o seguinte código. A variável runtime_env é necessária no momento da ligação para executar comandos de inferência online.

import ray
import vertexai

# The CLUSTER_RESOURCE_NAME is the one returned from vertex_ray.create_ray_cluster.
address = 'vertex_ray://{}'.format(CLUSTER_RESOURCE_NAME)

# Initialize Vertex AI to retrieve projects for downstream operations.
vertexai.init(staging_bucket=BUCKET_URI)

# Shutdown cluster and reconnect with required dependencies in the runtime_env.
ray.shutdown()

Onde:

  • CLUSTER_RESOURCE_NAME: o nome completo do recurso para o cluster do Ray no Vertex AI tem de ser exclusivo no seu projeto.

  • BUCKET_URI é o contentor do Cloud Storage para armazenar os artefactos do modelo.

Prepare e exporte o modelo para o Registo de modelos Vertex AI

Exporte o modelo do Vertex AI a partir do ponto de verificação do Ray e carregue o modelo para o Registo de modelos do Vertex AI.

TensorFlow

import numpy as np
from ray.air import session, CheckpointConfig, ScalingConfig
from ray.air.config import RunConfig
from ray.train import SyncConfig
from ray.train.tensorflow import TensorflowCheckpoint, TensorflowTrainer
from ray import train
import tensorflow as tf

from vertex_ray.predict import tensorflow

# Required dependencies at runtime
runtime_env = {
  "pip": [
      "ray==2.47.1", # pin the Ray version to prevent it from being overwritten
      "tensorflow",
      "IPython",
      "numpy",
  ],
}

# Initialize  Ray on Vertex AI client for remote cluster connection
ray.init(address=address, runtime_env=runtime_env)

# Define a TensorFlow model.

def create_model():
  model = tf.keras.Sequential([tf.keras.layers.Dense(1, activation="linear", input_shape=(4,))])
  model.compile(optimizer="Adam", loss="mean_squared_error", metrics=["mse"])
  return model

def train_func(config):
  n = 100
  # Create a fake dataset
  # data   : X - dim = (n, 4)
  # target : Y - dim = (n, 1)
  X = np.random.normal(0, 1, size=(n, 4))
  Y = np.random.uniform(0, 1, size=(n, 1))

  strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy()
  with strategy.scope():
      model = create_model()
      print(model)

  for epoch in range(config["num_epochs"]):
      model.fit(X, Y, batch_size=20)
      tf.saved_model.save(model, "temp/my_model")
      checkpoint = TensorflowCheckpoint.from_saved_model("temp/my_model")
      train.report({}, checkpoint=checkpoint)

trainer = TensorflowTrainer(
  train_func,
  train_loop_config={"num_epochs": 5},
  scaling_config=ScalingConfig(num_workers=1),
  run_config=RunConfig(
      storage_path=f'{BUCKET_URI}/ray_results/tensorflow',
      checkpoint_config=CheckpointConfig(
          num_to_keep=1  # Keep all checkpoints.
      ),
      sync_config=SyncConfig(
          sync_artifacts=True,
      ),
  ),
)

# Train the model.
result = trainer.fit()

# Register the trained model to Vertex AI Model Registry.
vertex_model = tensorflow.register_tensorflow(
  result.checkpoint,
)

sklearn

from vertex_ray.predict import sklearn
from ray.train.sklearn import SklearnCheckpoint

vertex_model = sklearn.register_sklearn(
  result.checkpoint,
)

XGBoost

from vertex_ray.predict import xgboost
from ray.train.xgboost import XGBoostTrainer

# Initialize  Ray on Vertex AI client for remote cluster connection
ray.init(address=address, runtime_env=runtime_env)

# Define an XGBoost model.
train_dataset = ray.data.from_pandas(
pd.DataFrame([{"x": x, "y": x + 1} for x in range(32)]))

run_config = RunConfig(
storage_path=f'{BUCKET_URI}/ray_results/xgboost',
checkpoint_config=CheckpointConfig(
    num_to_keep=1  # Keep all checkpoints.
),
sync_config=SyncConfig(sync_artifacts=True),
)

trainer = XGBoostTrainer(
label_column="y",
params={"objective": "reg:squarederror"},
scaling_config=ScalingConfig(num_workers=3),
datasets={"train": train_dataset},
run_config=run_config,
)
# Train the model.
result = trainer.fit()

# Register the trained model to Vertex AI Model Registry.
vertex_model = xgboost.register_xgboost(
result.checkpoint,
)

PyTorch

  • Converta os pontos de verificação do Ray num modelo.

  • Crie model.mar.

  • Crie um LocalModel com model.mar.

  • Carregue para o Registo de modelos do Vertex AI.

Implemente o modelo para inferências online

Implemente o modelo no ponto final online. Para mais informações, consulte o artigo Implemente o modelo num ponto final.

DEPLOYED_NAME = model.display_name + "-endpoint"
TRAFFIC_SPLIT = {"0": 100}
MACHINE_TYPE = "n1-standard-4"

endpoint = vertex_model.deploy(
    deployed_model_display_name=DEPLOYED_NAME,
    traffic_split=TRAFFIC_SPLIT,
    machine_type=MACHINE_TYPE,
)

Onde:

  • (Opcional) DEPLOYED_NAME: o nome a apresentar do modelo implementado. Se não fornecer um nome no momento da criação, o sistema usa o display_name do modelo.

  • (Opcional) TRAFFIC_SPLIT: um mapeamento do ID de um modelo implementado para a percentagem do tráfego deste ponto final que deve ser encaminhada para esse modelo implementado. Se o ID de um modelo implementado não estiver listado neste mapa, não recebe tráfego. Os valores de percentagem de tráfego têm de totalizar 100 ou o mapa tem de estar vazio se o ponto final não aceitar tráfego neste momento. A chave do modelo que está a ser implementado é "0". Por exemplo, {"0": 100}.

  • (Opcional) MACHINE_TYPE: especifique os recursos de computação.

Faça um pedido de inferência

Envie um pedido de inferência para o ponto final. Para mais informações, consulte o artigo Obtenha inferências online a partir de um modelo com preparação personalizada.

pred_request = [
    [ 1.7076793 , 0.23412449, 0.95170785, -0.10901471],
    [-0.81881499, 0.43874669, -0.25108584, 1.75536031]
]

endpoint.predict(pred_request)

Deve receber um resultado semelhante ao seguinte:

Prediction(predictions=[0.7891440987586975, 0.5843208432197571],
 deployed_model_id='3829557218101952512',
 model_version_id='1',
 model_resource_name='projects/123456789/locations/us-central1/models/123456789101112',
 explanations=None)

O que se segue?