Analiza Vertex ML Metadata

Puedes usar Vertex ML Metadata para hacer un seguimiento y analizar los metadatos que generan los sistemas de aprendizaje automático (AA). Mediante el seguimiento de estos metadatos, es más fácil analizar el comportamiento de tu sistema de AA. Esto puede ayudarte a comprender los cambios en el rendimiento de tu sistema o a comparar los artefactos que produjo tu sistema de AA.

Si no estás familiarizado con Vertex ML Metadata, lee la introducción a Vertex ML Metadata para obtener más información sobre el seguimiento y el análisis de los metadatos de tu flujo de trabajo de AA.

Aprende realizar las consultas de Vertex ML Metadata que quieres analizar de las siguientes maneras:

  • Consulta todos los artefactos, las ejecuciones o los contextos que coinciden con tus criterios de filtrado.
  • Consulta los artefactos de entrada y de salida de una ejecución, junto con los eventos que se usaron para conectar los artefactos con la ejecución.
  • Consulta el subgrafo de linaje de un contexto. Esta consulta muestra los artefactos y las ejecuciones de un contexto, junto con los eventos que conectan los artefactos con las ejecuciones.

Consulta artefactos, ejecuciones y contextos

Puedes usar el SDK de Vertex AI para Python o la API de REST a fin de consultar artefactos, ejecuciones y registros de contextos con filtros a fin de crear consultas como las siguientes:

  • ¿Qué versiones de un modelo entrenado alcanzaron un cierto umbral de calidad?
  • ¿Qué conjunto de datos se usa en una canalización determinada?

En las siguientes secciones, se muestra cómocrear filtros y cómo consultar artefactos, ejecuciones y contextos.

Descripción general de la sintaxis del filtro

En las siguientes secciones se describe cómo usar filtros para buscar artefactos, ejecuciones y contextos.

Campos

Los siguientes campos son compatibles cuando se filtran artefactos, ejecuciones y contextos.

Artefacto Ejecución Context
name
display_name
schema_title
create_time
update_time
metadata
state
uri

Tu filtro debe estar entre comillas y todas las comillas que formen parte del filtro deben escaparse con una barra inversa.

Operadores de comparación

Puedes usar los siguientes operadores de comparación en tus filtros: =, !=, <, >, >= y <=.

Por ejemplo, en los siguientes filtros se encuentran todos los artefactos en los que el nombre visible es my_artifact.

REST

display_name=\"my_artifact\"

Python

"display_name=\"my_artifact\""

Para los campos de string, puedes usar el filtro de comodín con el caracter *.

Para los campos de marca de tiempo, como create_time y update_time, debes formatear la fecha con el formato RFC 3339, por ejemplo:

REST

create_time=\"2021-05-11T12:30:00-08:00\"

Python

"create_time=\"2021-05-11T12:30:00-08:00\""

Operadores lógicos

Puedes usar los operadores lógicos AND y OR para combinar filtros para crear una consulta compleja.

En el siguiente ejemplo, se muestra cómo consultar los artefactos de tipo ai_platform.model y un campo metadata precision con un valor numérico mayor que 0.9.

REST

schema_title=\"ai_platform.Model\"+AND+metadata.precision.number_value>0.9

Python

"create_time=\"schema_title=\"ai_platform.Model\" AND metadata.precision.number_value>0.9"

Filtra metadatos con el operador de desvío

El campo metadata es una instancia de google.protobuf.Struct cuyo formato se define en el esquema especificado en el campo schema_title. google.protobuf.Struct es una estructura de datos que asigna claves a instancias google.protobuf.Value. La estructura de datos google.protobuf.Value almacena valores en diferentes campos según su tipo de datos Por ejemplo:

  • las strings se almacenan como metadata.FIELD_NAME.string_value,
  • los números se almacenan como metadata.FIELD_NAME.number_value,
  • los booleanos se almacenan como metadata.FIELD_NAME.bool_value.

Para filtrar en metadata, debes usar el operador de desvío a fin de recorrer el campo que deseas filtrar. El operador de desvío usa el siguiente formato.

REST

metadata.FIELD_NAME.TYPE_NAME=\"FILTER_VALUE\"

Python

"metadata.FIELD_NAME.TYPE_NAME=\"FILTER_VALUE\""

Por ejemplo, considera una estructura de metadatos como la siguiente:

{
   "field_1": 5,
   "field_2": "example",
   "field_3": {
     ...
   },
   "field_4": [],
   "field_5": true,
}

En las siguientes consultas, se ilustra cómo usar el operador de desvío para filtrar los metadatos de este ejemplo.

  • Filtra los registros que tengan metadata.field_1 con un valor inferior a 5.

REST

metadata.field_1.number_value<5

Python

"metadata.field_1.number_value<5"
  • Filtra los registros que tienen metadata.field_2 con un valor igual a ejemplo.

REST

metadata.field_2.string_value=\"example\"

Python

"metadata.field_2.string_value=\"example\""
  • Filtra los registros que tengan metadata.field_5 con un valor igual a verdadero.

REST

metadata.field_5.bool_value=true

Python

"metadata.field_5.bool_value=true"

Filtra contextos según las relaciones superiores y secundarias

Puedes usar el operador has para buscar contextos superiores o secundarios de un contexto específico.

El operador usa el siguiente formato:

  • "parent_contexts:\"CONTEXT_RESOURCE_NAME\""
  • "child_contexts:\"CONTEXT_RESOURCE_NAME\""

El nombre del contexto debe ser el nombre completo del recurso del contexto, como el siguiente: project/PROJECT/locations/LOCATION/metadataStores/METADATA-STORE/contexts/CONTEXT.

Los siguientes filtros demuestran cómo usar el operador has:

  • Filtra todos los contextos que sean secundarios de la canalización especificada.

REST

parent_contexts:\"project/12345/locations/us-central1/metadataStores/default/contexts/pipeline_1\"

Python

"parent_contexts:\"project/12345/locations/us-central1/metadataStores/default/contexts/pipeline_1\""
  • Filtra todos los contextos que sean superiores de la canalización especificada.

REST

child_contexts:\"project/12345/locations/us-central1/metadataStores/default/contexts/pipeline_1\"

Python

"child_contexts:\"project/12345/locations/us-central1/metadataStores/default/contexts/pipeline_1\""

Filtra contextos, ejecuciones y artefactos por asociación y atribución

Puedes usar la función in_context() para filtrar artefactos o ejecuciones que se asocian con un contexto. Puedes usar la función with_execution() para filtrar artefactos o contextos específicos asociados con una ejecución. De manera similar, puedes usar la función with_artifact() para filtrar ejecuciones o contextos específicos asociados con un artefacto.

Las funciones de filtro se usan en el siguiente formato.

  • "in_context(\"CONTEXT_RESOURCE_NAME\")"
  • "with_execution(\"EXECUTION_RESOURCE_NAME\")"
  • "with_artifact(\"ARTIFACT_RESOURCE_NAME\")"

El contexto, la ejecución y los nombres de los artefactos deben ser el nombre completo del recurso, como el siguiente.

  • project/PROJECT_ID/locations/LOCATION_ID/metadataStores/METADATA-STORE/contexts/CONTEXT
  • project/PROJECT_ID/locations/LOCATION_ID/metadataStores/METADATA-STORE/executions/EXECUTION
  • project/PROJECT_ID/locations/LOCATION_ID/metadataStores/METADATA-STORE/artifacts/ARTIFACT

En el siguiente ejemplo se muestra cómo filtrar objetos que se encuentran en la canalización especificada.

REST

in_context(\"project/12345/locations/us-central1/metadataStores/default/contexts/pipeline_1\")

Python

"in_context(\"project/12345/locations/us-central1/metadataStores/default/contexts/pipeline_1\")"

Puedes usar un comodín * en las funciones de filtro para filtrar los parámetros de cada recurso. Por ejemplo, puedes usar lo siguiente para filtrar todas las ejecuciones que actúan en un tipo de artefacto system.model.

REST

with_artifact(\"*\",\"schema_title='name.model'\")

Python

"with_artifact(\"*\",\"schema_title='name.model'\")"

Otros parámetros compatibles que puedes filtrar son los siguientes:

  • input=true/false: filtra los tipos de artefactos de entrada o salida.
  • event_time: filtra las ejecuciones o los tiempos de los eventos de los artefactos.
  • Todos los demás campos de filtro compatibles

Puedes combinar los campos con operandos lógicos para construir consultas de filtro complejas. Ten en cuenta que la profundidad máxima de la función anidada compatible es 5.

Consulta los artefactos

Los artefactos, como los conjuntos de datos y los modelos, representan los datos que usa o produce tu flujo de trabajo del AA. Usa las siguientes instrucciones para buscar artefactos.

REST

Antes de usar cualquiera de los datos de solicitud a continuación, haz los siguientes reemplazos:

  • LOCATION_ID: Tu región.
  • PROJECT_ID: El ID del proyecto.
  • METADATA_STORE: Es el ID del almacén de metadatos en el que se crea el artefacto. El almacén de metadatos predeterminado se llama default.
  • PAGE_SIZE: (Opcional) Es el número máximo de artefactos que se mostrarán. Si no se especifica este valor, el servicio muestra un máximo de 100 registros.
  • PAGE_TOKEN: (Opcional) Es un token de página de una llamada anterior a MetadataService.ListArtifacts. Especifica este token para obtener la siguiente página de resultados.
  • FILTER: Especifica las condiciones necesarias para incluir un artefacto en el conjunto de resultados.

Método HTTP y URL:

GET https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/metadataStores/METADATA_STORE/artifacts?pageSize=PAGE_SIZE&pageToken=PAGE_TOKEN&filter=FILTER

Para enviar tu solicitud, expande una de estas opciones:

Deberías ver un resultado similar al siguiente. ARTIFACT_ID: El ID del registro del artefacto.

{
  "artifacts": [
    {
      "name": "projects/PROJECT_ID/locations/LOCATION_ID/metadataStores/default/artifacts/ARTIFACT_ID",
      "displayName": "Example artifact",
      "uri": "gs://your_bucket_name/artifacts/dataset.csv",
      "etag": "67891011",
      "createTime": "2021-05-18T00:33:13.833Z",
      "updateTime": "2021-05-18T00:33:13.833Z",
      "state": "LIVE",
      "schemaTitle": "system.Dataset",
      "schemaVersion": "0.0.1",
      "metadata": {
        "payload_format": "CSV"
      },
      "description": "Description of the example artifact."
    },
    {
      "name": "projects/PROJECT_ID/locations/LOCATION/metadataStores/METADATA_STORE/artifacts/ARTIFACT_ID",
      "displayName": "Another example artifact",
      "uri": "gs://your_bucket_name/artifacts/dataset-2.csv",
      "etag": "67891012",
      "createTime": "2021-05-18T00:29:24.344Z",
      "updateTime": "2021-05-18T00:29:24.344Z",
      "state": "LIVE",
      "schemaTitle": "system.Dataset",
      "schemaVersion": "0.0.1",
      "metadata": {
        "payload_format": "CSV"
      },
      "description": "Description of the other example artifact."
    }
  ]
}

Python

Python

def list_artifact_sample(
    project: str,
    location: str,
    display_name_filter: Optional[str] = "display_name=\"my_model_*\"",
    create_date_filter: Optional[str] = "create_time>\"2022-06-11\"",
    order_by: Optional[str] = None,
):
    aiplatform.init(project=project, location=location)

    combined_filters = f"{display_name_filter} AND {create_date_filter}"
    return aiplatform.Artifact.list(
        filter=combined_filters,
        order_by=order_by,
    )

  • project: El ID del proyecto. Puedes encontrar estos ID en la página de bienvenida de la consola de Google Cloud.
  • location: Consulta Lista de ubicaciones disponibles.
  • display_name_filter: Filtro que se aplicará al nombre visible mientras se enumeran los recursos con el formato "display_name=\"my_filter\"" .
  • create_date_filter: Filtro que se aplicará al nombre de create_date mientras se enumeran los recursos con el formato "create_time>\"2022-06-11T12:30:00-08:00\"",.

Consulta ejecuciones

Las ejecuciones representan un paso en tu flujo de trabajo del AA, como el procesamiento previo de datos o el entrenamiento de un modelo. Usa las siguientes instrucciones para consultar las ejecuciones.

REST

Antes de usar cualquiera de los datos de solicitud a continuación, haz los siguientes reemplazos:

  • LOCATION_ID: Tu región.
  • PROJECT_ID: El ID del proyecto.
  • METADATA_STORE: Es el ID del almacén de metadatos en el que se crea la ejecución. El almacén de metadatos predeterminado se llama default.
  • PAGE_SIZE: (Opcional) Es el número máximo de artefactos que se mostrarán. Si no se especifica este valor, el servicio muestra un máximo de 100 registros.
  • PAGE_TOKEN: (Opcional) Es un token de página de una llamada anterior a MetadataService.ListArtifacts. Especifica este token para obtener la siguiente página de resultados.
  • FILTER: Especifica las condiciones necesarias para incluir una ejecución en el conjunto de resultados.

Método HTTP y URL:

GET https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/metadataStores/METADATA_STORE/executions?pageSize=PAGE_SIZE&pageToken=PAGE_TOKEN&filter=FILTER

Para enviar tu solicitud, expande una de estas opciones:

Deberías ver un resultado similar al siguiente. EXECUTION_ID es el ID del registro de ejecución.

{
  "executions": [
    {
      "name": "projects/PROJECT_ID/locations/LOCATION_ID/metadataStores/METADATA_STORE/executions/EXECUTION_ID",
      "displayName": "Example execution 1",
      "etag": "67891011",
      "createTime": "2021-05-18T00:06:56.177Z",
      "updateTime": "2021-05-18T00:06:56.177Z",
      "schemaTitle": "system.Run",
      "schemaVersion": "0.0.1",
      "metadata": {},
      "description": "Description of the example execution."
    },
    {
      "name": "projects/PROJECT_ID/locations/LOCATION_ID/metadataStores/METADATA_STORE/executions/EXECUTION_ID",
      "displayName": "Example execution 2",
      "etag": "67891011",
      "createTime": "2021-05-18T00:04:49.659Z",
      "updateTime": "2021-05-18T00:04:49.659Z",
      "schemaTitle": "system.Run",
      "schemaVersion": "0.0.1",
      "metadata": {},
      "description": "Description of the example execution."
    }
  ]
}

Python

Python

def list_execution_sample(
    project: str,
    location: str,
    display_name_filter: Optional[str] = "display_name=\"my_execution_*\"",
    create_date_filter:  Optional[str] = "create_time>\"2022-06-11T12:30:00-08:00\"",
):
    aiplatform.init(
        project=project,
        location=location)

    combined_filters = f"{display_name_filter} AND {create_date_filter}"

    return aiplatform.Execution.list(filter=combined_filters)

  • project: El ID del proyecto. Puedes encontrar estos ID en la página de bienvenida de la consola de Google Cloud.
  • location: Consulta Lista de ubicaciones disponibles.
  • display_name_filter: Filtro que se aplicará al nombre visible mientras se enumeran los recursos con el formato "display_name=\"my_filter\"" .
  • create_date_filter: Filtro que se aplicará al nombre de create_date mientras se enumeran los recursos con el formato "create_time>\"2022-06-11T12:30:00-08:00\"",.

Consulta contextos

Los contextos te permiten agrupar conjuntos de ejecuciones, artefactos y otros contextos. Usa las siguientes instrucciones para buscar contextos.

REST

Antes de usar cualquiera de los datos de solicitud a continuación, haz los siguientes reemplazos:

  • LOCATION_ID: Tu región.
  • PROJECT_ID: El ID del proyecto.
  • METADATA_STORE: Es el ID del almacén de metadatos en el que se crea el contexto. El almacén de metadatos predeterminado se llama default.
  • PAGE_SIZE: (Opcional) Es el número máximo de artefactos que se mostrarán. Si no se especifica este valor, el servicio muestra un máximo de 100 registros.
  • PAGE_TOKEN: (Opcional) Es un token de página de una llamada anterior a MetadataService.ListArtifacts. Especifica este token para obtener la siguiente página de resultados.
  • FILTER: Especifica las condiciones necesarias para incluir un contexto en el conjunto de resultados.

Método HTTP y URL:

GET https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/metadataStores/METADATA_STORE/contexts?pageSize=PAGE_SIZE&pageToken=PAGE_TOKEN&filter=FILTER

Para enviar tu solicitud, expande una de estas opciones:

Deberías ver un resultado similar al siguiente. CONTEXT_ID: El ID del registro de contexto.

{
  "contexts": [
    {
      "name": "projects/PROJECT_ID/locations/LOCATION_ID/metadataStores/METADATA_STORE/contexts/CONTEXT_ID",
      "displayName": "Experiment 1",
      "etag": "67891011",
      "createTime": "2021-05-18T22:36:02.153Z",
      "updateTime": "2021-05-18T22:36:02.153Z",
      "parentContexts": [],
      "schemaTitle": "system.Experiment",
      "schemaVersion": "0.0.1",
      "metadata": {}
    },
    {
      "name": "projects/PROJECT_ID/locations/LOCATION_ID/metadataStores/METADATA_STORE/contexts/CONTEXT_ID",
      "displayName": "Pipeline run 1",
      "etag": "67891011",
      "createTime": "2021-05-18T22:35:02.600Z",
      "updateTime": "2021-05-18T22:35:02.600Z",
      "parentContexts": [],
      "schemaTitle": "system.PipelineRun",
      "schemaVersion": "0.0.1",
      "metadata": {}
    }
  ]
}

Consulta artefactos de entrada y salida de una ejecución

Usa las siguientes instrucciones para consultar los artefactos y las ejecuciones en el contexto especificado, junto con los eventos que conectan los artefactos con las ejecuciones.

SDK de Vertex AI para Python

Artefactos de entrada

Esta muestra del SDK de Python implica consultar los artefactos de entrada de una ejecución.

Python

def get_execution_input_artifacts_sample(
    execution: aiplatform.Execution
):
    return execution.get_input_artifacts()

Artefactos de salida

Esta muestra del SDK de Python implica consultar los artefactos de salida de una ejecución.

Python

def get_execution_output_artifacts_sample(
    execution: aiplatform.Execution
):
    return execution.get_output_artifacts()

REST

En esta muestra de REST, se incluyen consultas de artefactos de entrada y salida de una ejecución.

REST

Antes de usar cualquiera de los datos de solicitud a continuación, haz los siguientes reemplazos:

  • LOCATION_ID: Tu región.
  • PROJECT_ID: El ID del proyecto.
  • METADATA_STORE: Es el ID del almacén de metadatos en el que se crea la ejecución. El almacén de metadatos predeterminado se llama default.
  • EXECUTION_ID: Es el ID del registro de ejecución.

Método HTTP y URL:

GET https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/metadataStores/METADATA_STORE/executions/EXECUTION_ID:queryExecutionInputsAndOutputs

Para enviar tu solicitud, expande una de estas opciones:

Deberías ver un resultado similar al siguiente. EXECUTION_ID es el ID del registro de ejecución. Si no se especifica el ID de ejecución, Vertex ML Metadata creó un identificador único para esta ejecución. ARTIFACT_ID es el ID del registro del artefacto.

{
  "artifacts": [
    {
      "name": "projects/PROJECT_ID/locations/LOCATION/metadataStores/METADATA_STORE/artifacts/ARTIFACT_ID",
      "displayName": "Example artifact",
      "uri": "gs://your_bucket_name/artifacts/dataset.csv",
      "etag": "678901011",
      "createTime": "2021-05-18T00:29:24.344Z",
      "updateTime": "2021-05-18T00:29:24.344Z",
      "state": "LIVE",
      "schemaTitle": "system.Dataset",
      "schemaVersion": "0.0.1",
      "metadata": {
        "payload_format": "CSV"
      },
      "description": "Description of the example artifact."
    },
    {
      "name": "projects/PROJECT_ID/locations/LOCATION_ID/metadataStores/METADATA_STORE/artifacts/ARTIFACT_ID",
      "displayName": "Example artifact 2",
      "uri": "gs://your_bucket_name/artifacts/dataset.csv",
      "etag": "678901011",
      "createTime": "2021-05-18T00:33:13.833Z",
      "updateTime": "2021-05-18T00:33:13.833Z",
      "state": "LIVE",
      "schemaTitle": "system.Dataset",
      "schemaVersion": "0.0.1",
      "metadata": {
        "payload_format": "CSV"
      },
      "description": "Description of the example artifact."
    }
  ],
  "executions": [
    {
      "name": "projects/PROJECT_ID/locations/LOCATION_ID/metadataStores/METADATA_STORE/executions/EXECUTION_ID",
      "displayName": "Example execution 1",
      "etag": "678901011",
      "createTime": "2021-05-18T00:04:49.659Z",
      "updateTime": "2021-05-18T00:04:49.659Z",
      "schemaTitle": "system.Run",
      "schemaVersion": "0.0.1",
      "metadata": {},
      "description": "Description of the example execution."
    }
  ],
  "events": [
    {
      "artifact": "projects/PROJECT_ID/locations/LOCATION/metadataStores/METADATA_STORE/artifacts/ARTIFACT_ID",
      "execution": "projects/PROJECT_ID/locations/LOCATION/metadataStores/METADATA_STORE/executions/EXECUTION_ID",
      "eventTime": "2021-05-18T00:04:49.659Z",,
      "type": "INPUT",
    },
    {
      "artifact": "projects/PROJECT_ID/locations/LOCATION/metadataStores/METADATA_STORE/artifacts/ARTIFACT_ID",
      "execution": "projects/PROJECT_ID/locations/LOCATION/metadataStores/METADATA_STORE/executions/EXECUTION_ID",
      "eventTime": "2021-05-18T00:04:49.659Z",,
      "type": "OUTPUT",
    }
  ]
}

Consulta el subgrafo de linaje de un contexto

Usa las siguientes instrucciones para consultar los artefactos y las ejecuciones en el contexto especificado, junto con los eventos que conectan los artefactos con las ejecuciones.

REST

Antes de usar cualquiera de los datos de solicitud a continuación, haz los siguientes reemplazos:

  • LOCATION_ID: Tu región.
  • PROJECT_ID: El ID del proyecto.
  • METADATA_STORE: Es el ID del almacén de metadatos en el que se crea la ejecución. El almacén de metadatos predeterminado se llama default.
  • CONTEXT_ID: (Opcional) El ID del registro de contexto.

HTTP method and URL:

GET https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/metadataStores/METADATA_STORE/contexts/CONTEXT_ID:queryContextLineageSubgraph

Para enviar tu solicitud, expande una de estas opciones:

Deberías ver un resultado similar al siguiente. EXECUTION_ID es el ID del registro de ejecución. Si no se especifica el ID de ejecución, Vertex ML Metadata creó un identificador único para esta ejecución. ARTIFACT_ID es el ID del registro del artefacto.

{
  "artifacts": [
    {
      "name": "projects/PROJECT_ID/locations/LOCATION/metadataStores/METADATA_STORE/artifacts/ARTIFACT_ID",
      "displayName": "Example artifact",
      "uri": "gs://your_bucket_name/artifacts/dataset.csv",
      "etag": "678901011",
      "createTime": "2021-05-18T00:29:24.344Z",
      "updateTime": "2021-05-18T00:29:24.344Z",
      "state": "LIVE",
      "schemaTitle": "system.Dataset",
      "schemaVersion": "0.0.1",
      "metadata": {
        "payload_format": "CSV"
      },
      "description": "Description of the example artifact."
    },
    {
      "name": "projects/PROJECT_ID/locations/LOCATION/metadataStores/METADATA_STORE/artifacts/ARTIFACT_ID",
      "displayName": "Example artifact 2",
      "uri": "gs://your_bucket_name/artifacts/dataset.csv",
      "etag": "678901011",
      "createTime": "2021-05-18T00:33:13.833Z",
      "updateTime": "2021-05-18T00:33:13.833Z",
      "state": "LIVE",
      "schemaTitle": "system.Dataset",
      "schemaVersion": "0.0.1",
      "metadata": {
        "payload_format": "CSV"
      },
      "description": "Description of the example artifact."
    }
  ],
  "executions": [
    {
      "name": "projects/PROJECT_ID/locations/LOCATION/metadataStores/METADATA_STORE/executions/EXECUTION_ID",
      "displayName": "Example execution 1",
      "etag": "678901011",
      "createTime": "2021-05-18T00:04:49.659Z",
      "updateTime": "2021-05-18T00:04:49.659Z",
      "schemaTitle": "system.Run",
      "schemaVersion": "0.0.1",
      "metadata": {},
      "description": "Description of the example execution."
    }
  ],
  "events": [
    {
      "artifact": "projects/PROJECT_ID/locations/LOCATION/metadataStores/METADATA_STORE/artifacts/ARTIFACT_ID",
      "execution": "projects/PROJECT_ID/locations/LOCATION/metadataStores/METADATA_STORE/executions/EXECUTION_ID",
      "eventTime": "2021-05-18T00:04:49.659Z",,
      "type": "INPUT",
    },
    {
      "artifact": "projects/PROJECT_ID/locations/LOCATION/metadataStores/METADATA_STORE/artifacts/ARTIFACT_ID",
      "execution": "projects/PROJECT_ID/locations/LOCATION/metadataStores/METADATA_STORE/executions/EXECUTION_ID",
      "eventTime": "2021-05-18T00:04:49.659Z",,
      "type": "OUTPUT",
    }
  ]
}

¿Qué sigue?