Usar componentes de pipeline do Google Cloud

Ao usar os componentes do Google Cloud Pipeline (GCPC), é possível usar os seguintes recursos do Vertex AI e Google Cloud para proteger seus componentes e artefatos.

Especificar uma conta de serviço para um componente

Quando você usa um componente, há a opção de especificar uma conta de serviço. O componente é iniciado e age com as permissões dessa conta de serviço. Por exemplo, é possível usar o seguinte código para especificar a conta de serviço de um componente ModelDeploy:

model_deploy_op = ModelDeployOp(model=training_job_run_op.outputs["model"],
    endpoint=endpoint_op.outputs["endpoint"],
    automatic_resources_min_replica_count=1,
    automatic_resources_max_replica_count=1,
    service_account="SERVICE_ACCOUNT_ID@PROJECT_ID.iam.gserviceaccount.com")

Substitua:

  • SERVICE_ACCOUNT_ID: o ID da conta de serviço.
  • PROJECT_ID: o ID do projeto

Saiba mais sobre como usar uma conta de serviço personalizada e configurar uma conta de serviço para uso com o Vertex AI Pipelines.

Usar o VPC Service Controls para evitar a exfiltração de dados

O VPC Service Controls pode ajudar você a reduzir o risco de exfiltração de dados do Vertex AI Pipelines. Quando você usa o VPC Service Controls para criar um perímetro de serviço, os recursos e os dados criados pelo Vertex AI Pipelines e os componentes do Google Cloud Pipeline são automaticamente protegidos. Por exemplo, quando você usa o VPC Service Controls para proteger o pipeline, os artefatos a seguir não podem deixar o perímetro de serviço:

  • Dados de treinamento para um modelo do AutoML
  • Modelos que você criou
  • Resultados de uma solicitação de previsão em lote

Saiba mais sobre o VPC Service Controls com o Vertex AI.

Configurar o peering de rede VPC

É possível configurar os componentes do Google Cloud Pipeline para fazer peering com uma nuvem privada virtual fornecendo parâmetros extras. Por exemplo, é possível usar o seguinte código para especificar uma rede VPC para um componente EndpointCreate:

endpoint_create_op = EndpointCreateOp(
    project="PROJECT_ID",
    location="REGION",
    display_name="endpoint-display-name",
    network="NETWORK")

Substitua:

  • PROJECT_ID: o ID do projeto
  • REGION: a região em que você está usando a Vertex AI.
  • NETWORK: a rede VPC, por exemplo, "projects/12345/global/networks/myVPC"

Saiba mais sobre o peering de rede VPC no Vertex AI.

Usar chaves de criptografia gerenciadas pelo cliente (CMEK)

Por padrão, o Google Cloud automaticamente criptografa os dados quando em repouso por meio de chaves de criptografia gerenciadas pelo Google. Caso você precise atender a requisitos específicos de compliance e conformidade relacionados às chaves que protegem seus dados, use as chaves de criptografia gerenciadas pelo cliente (CMEKs, na sigla em inglês) para os recursos. Antes de começar a usar chaves de criptografia gerenciadas pelo cliente, saiba mais sobre os benefícios das CMEKs no Vertex AI e dos recursos atuais compatíveis com CMEK.

Como configurar um componente com CMEK

Depois de criar um keyring e uma chave no Cloud Key Management Service e conceder permissões de criptografia e descriptografia à Vertex AI, crie um novo suporte a CMEK especificando sua chave como um dos parâmetros de criação. Por exemplo, é possível usar o seguinte código para especificar uma chave para um componente ModelBatchPredict:

model_batch_predict_op = ModelBatchPredictOp(project="PROJECT_ID",
    model=model_upload_op.outputs["model"],
    encryption_spec_key_name="projects/PROJECT_ID/locations/LOCATION_ID/keyRings/KEY_RING_NAME/cryptoKeys/KEY_NAME")

Substitua:

  • PROJECT_ID pelo ID do projeto no Google Cloud.
  • LOCATION_ID: um identificador válido de região ou local, por exemplo, us-central1.
  • KEY_RING_NAME: o nome do keyring para CMEK. Para mais informações sobre keyrings, consulte Recursos do Cloud KMS.
  • KEY_NAME: o nome da chave CMEK.

Observação: componentes do Google Cloud que não são da Vertex AI podem exigir permissões extras. Por exemplo, um componente do BigQuery pode exigir permissão de criptografia e descriptografia. Além disso, o local da chave CMEK precisa ser o mesmo do componente. Por exemplo, se um componente do BigQuery carregar dados de um conjunto de dados baseado no local multirregional dos EUA, a chave CMEK também precisará estar no local multirregional dos EUA.

Consumir ou produzir artefatos no componente

O SDK dos componentes do Google Cloud Pipeline define um conjunto de tipos de artefato de metadados de ML que servem como entrada e saída de componentes. Alguns componentes de pipeline do Google Cloud consomem esses artefatos como entrada ou os produzem como saída.

Nesta página, você verá como consumir e produzir esses artefatos.

Consumir um artefato de ML

Consumir um artefato no componente YAML

Os metadados do artefato podem servir como entrada para um componente. Para preparar um artefato a ser consumido como entrada, é preciso extraí-lo e colocá-lo em um arquivo YAML do componente.

Por exemplo, o componente ModelUploadOp gera um artefato google.VertexModel que pode ser consumido por um componente ModelDeployOp. Use o seguinte código em um arquivo YAML de componente para recuperar um recurso Model do Vertex AI das entradas (referência):

"model": "',"{{$.inputs.artifacts['model'].metadata['resourceName']}}", '"'

Para conferir o esquema completo dos metadados do artefato, consulte o arquivo artifact_types.py no repositório do Kubeflow no GitHub.

Consumir um artefato em um componente leve do Python

from kfp.dsl import Artifact, Input

@dsl.component
def classification_model_eval_metrics(
    project: str,
    location: str,  # "us-central1",
    model: Input[Artifact],
) :
   # Consumes the `resourceName` metadata
   model_resource_path = model.metadata["resourceName"]

Para um exemplo de como consumir os tipos de artefatos do Vertex ML Metadata, consulte Treinar um modelo de classificação usando dados tabulares e o Vertex AI AutoML.

Criar um artefato de ML

Os exemplos de código a seguir mostram como criar um artefato do Vertex ML Metadata que um componente do GCPC possa aceitar como entrada.

Usar um nó de importação

O exemplo a seguir cria um nó do importador que registra uma nova entrada de artefato no Vertex ML Metadata. O nó do importador usa o URI e os metadados do artefato como primitivos e os empacota em um artefato.

from google_cloud_pipeline_components import v1
from google_cloud_pipeline_components.types import artifact_types
from kfp.components import importer_node
from kfp import dsl

@dsl.pipeline(name=_PIPELINE_NAME)
def pipeline():
  # Using importer and UnmanagedContainerModel artifact for model upload
  # component.
  importer_spec = importer_node.importer(
      artifact_uri='gs://managed-pipeline-gcpc-e2e-test/automl-tabular/model',
      artifact_class=artifact_types.UnmanagedContainerModel,
      metadata={
          'containerSpec': {
              'imageUri':
                  'us-docker.pkg.dev/vertex-ai/automl-tabular/prediction-server:prod'
          }
      })

  # Consuming the UnmanagedContainerModel artifact for the previous step
  model_upload_with_artifact_op = v1.model.ModelUploadOp(
      project=_GCP_PROJECT_ID,
      location=_GCP_REGION,
      display_name=_MODEL_DISPLAY_NAME,
      unmanaged_container_model=importer_spec.outputs['artifact'])

Usar componentes baseados em função do Python

O exemplo a seguir mostra como gerar um artefato de Vertex ML Metadata diretamente de um componente do Python.

from google_cloud_pipeline_components import v1
from kfp.components import importer_node
from kfp import dsl

@dsl.component(
    base_image='python:3.9',
    packages_to_install=['google-cloud-aiplatform'],
)
# Note currently KFP SDK doesn't support outputting artifacts in `google` namespace.
# Use the base type dsl.Artifact instead.
def return_unmanaged_model(model: dsl.Output[dsl.Artifact]):
  model.metadata['containerSpec'] = {
      'imageUri':
          'us-docker.pkg.dev/vertex-ai/automl-tabular/prediction-server:prod'
  }
  model.uri = f'gs://automl-tabular-pipeline/automl-tabular/model'

@dsl.pipeline(name=_PIPELINE_NAME)
def pipeline():

  unmanaged_model_op = return_unmanaged_model()

  # Consuming the UnmanagedContainerModel artifact for the previous step
  model_upload_with_artifact_op = v1.model.ModelUploadOp(
      project=_GCP_PROJECT_ID,
      location=_GCP_REGION,
      display_name=_MODEL_DISPLAY_NAME,
      unmanaged_container_model=unmanaged_model_op.outputs['model'])

Usar seu próprio componente baseado em contêineres

O exemplo a seguir mostra como gerar um artefato VertexBatchPredictionJob como saída de um componente baseado em contêiner usando a classe de utilitário artifact_types.py.

bp_job_artifact = VertexBatchPredictionJob(
    'batchpredictionjob', vertex_uri_prefix + get_job_response.name,
    get_job_response.name, get_job_response.output_info.bigquery_output_table,
    get_job_response.output_info.bigquery_output_dataset,
    get_job_response.output_info.gcs_output_directory)

    output_artifacts = executor_input_json.get('outputs', {}).get('artifacts', {})
    executor_output['artifacts'] = bp_job_artifact.to_executor_output_artifact(output_artifacts[bp_job_artifact.name])