Vertex ML Metadata를 사용하여 머신러닝(ML) 시스템에서 생성된 메타데이터를 추적하고 분석할 수 있습니다. 이 메타데이터를 추적하면 ML 시스템의 동작을 더 쉽게 분석할 수 있습니다. 그러면 시스템 성능 변화를 이해하거나 ML 시스템에서 생성한 아티팩트를 비교할 수 있습니다.
Vertex ML Metadata를 처음 사용하는 경우 Vertex ML Metadata 소개를 참조하여 ML 워크플로 메타데이터를 추적하고 분석하는 방법을 자세히 알아보세요.
다음 방법으로 분석하려는 Vertex ML Metadata를 쿼리하는 방법을 알아봅니다.
- 필터링 기준과 일치하는 모든 아티팩트, 실행 또는 컨텍스트의 쿼리
- 아티팩트를 실행에 연결하는 데 사용되는 이벤트와 함께 실행의 입력 및 출력 아티팩트의 쿼리
- 컨텍스트 계보 하위 그래프 쿼리. 이 쿼리는 아티팩트를 실행에 연결하는 이벤트와 함께 컨텍스트의 아티팩트와 실행을 반환합니다.
아티팩트, 실행, 컨텍스트 쿼리
Python용 Vertex AI SDK 또는 REST API에서 필터를 사용해 아티팩트, 실행, 컨텍스트 레코드를 쿼리하여 다음과 같은 쿼리를 만들 수 있습니다.
- 학습된 모델의 어떤 버전이 특정 품질 기준을 달성했나요?
- 특정 파이프라인에서 어떤 데이터 세트가 사용되나요?
다음 섹션에서는 필터 생성 방법, 아티팩트 쿼리 방법, 실행, 컨텍스트를 설명합니다.
필터 구문 개요
다음 섹션에서는 필터를 사용하여 아티팩트, 실행, 컨텍스트를 쿼리하는 방법을 설명합니다.
필드
아티팩트, 실행, 컨텍스트를 필터링할 때 지원되는 필드는 다음과 같습니다.
아티팩트 | 실행 | 컨텍스트 | |
---|---|---|---|
name |
|||
display_name |
|||
schema_title |
|||
create_time |
|||
update_time |
|||
metadata |
|||
state |
|||
uri |
필터는 따옴표로 묶여야 하며 필터의 일부인 따옴표는 백슬래시로 이스케이프해야 합니다.
비교 연산자
필터에서 =
, !=
, <
, >
, >=
, <=
비교 연산자를 사용할 수 있습니다.
예를 들어 다음 필터는 표시 이름이 my_artifact인 모든 아티팩트를 찾습니다.
REST
display_name=\"my_artifact\"
Python
"display_name=\"my_artifact\""
문자열 필드의 경우 *
문자와 함께 와일드 카드 필터링을 사용할 수 있습니다.
create_time
및 update_time
과 같은 타임스탬프 필드의 경우 RFC 3339 형식으로 날짜 형식을 지정해야 합니다. 예를 들면 다음과 같습니다.
REST
create_time=\"2021-05-11T12:30:00-08:00\"
Python
"create_time=\"2021-05-11T12:30:00-08:00\""
논리 연산자
AND
및 OR
논리 연산자를 사용하여 필터를 결합하여 복잡한 쿼리를 만들 수 있습니다.
다음 예시에서는 유형 ai_platform.model
이고 metadata
필드 precision
값이 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"
순회 연산자를 사용하여 메타데이터 필터링
metadata
필드는 google.protobuf.Struct
의 인스턴스로, 형식이 schema_title
필드에 지정된 스키마에 정의되어 있습니다. google.protobuf.Struct
는 키를 google.protobuf.Value
인스턴스에 매핑하는 데이터 구조입니다. google.protobuf.Value
데이터 구조는 데이터 유형에 따라 서로 다른 필드에 값을 저장합니다. 예를 들면 다음과 같습니다.
- 문자열은
metadata.FIELD_NAME.string_value
로 저장됩니다. - 번호는
metadata.FIELD_NAME.number_value
로 저장됩니다. - 부울은
metadata.FIELD_NAME.bool_value
로 저장됩니다.
metadata
를 필터링하려면 순회 연산자를 사용하여 필터링할 필드를 순회해야 합니다. 순회 연산자는 다음 형식을 사용합니다.
REST
metadata.FIELD_NAME.TYPE_NAME=\"FILTER_VALUE\"
Python
"metadata.FIELD_NAME.TYPE_NAME=\"FILTER_VALUE\""
예를 들어 다음과 같은 메타데이터 구조를 가정해 보겠습니다.
{
"field_1": 5,
"field_2": "example",
"field_3": {
...
},
"field_4": [],
"field_5": true,
}
다음 쿼리는 순회 연산자를 사용하여 이 예시 메타데이터를 필터링하는 방법을 보여줍니다.
값이 5 미만인
metadata.field_1
이 있는 레코드를 필터링합니다.
REST
metadata.field_1.number_value<5
Python
"metadata.field_1.number_value<5"
값이 example인
metadata.field_2
가 있는 레코드를 필터링합니다.
REST
metadata.field_2.string_value=\"example\"
Python
"metadata.field_2.string_value=\"example\""
값이 true인
metadata.field_5
가 있는 레코드를 필터링합니다.
REST
metadata.field_5.bool_value=true
Python
"metadata.field_5.bool_value=true"
상위 및 하위 관계로 컨텍스트 필터링
has 연산자를 사용하여 지정된 컨텍스트의 상위 또는 하위 컨텍스트를 찾을 수 있습니다.
has 연산자는 다음 형식을 사용합니다.
"parent_contexts:\"CONTEXT_RESOURCE_NAME\""
"child_contexts:\"CONTEXT_RESOURCE_NAME\""
컨텍스트 이름은 다음과 같은 컨텍스트의 전체 리소스 이름이어야 합니다.
project/PROJECT/locations/LOCATION/metadataStores/METADATA-STORE/contexts/CONTEXT
.
다음 필터는 has 연산자를 사용하는 방법을 보여줍니다.
지정된 파이프라인의 하위 요소인 모든 컨텍스트를 필터링합니다.
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\""
지정된 파이프라인의 상위 요소인 모든 컨텍스트를 필터링합니다
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\""
연결 및 기여 분석으로 컨텍스트, 실행, 아티팩트 필터링
in_context()
함수를 사용하여 컨텍스트와 연관된 아티팩트나 실행을 필터링할 수 있습니다. with_execution()
함수를 사용하여 실행과 연결된 특정 아티팩트 또는 컨텍스트를 필터링할 수 있습니다. 마찬가지로 with_artifact()
함수를 사용하여 아티팩트와 연결된 특정 실행 또는 컨텍스트를 필터링할 수 있습니다.
필터 함수는 다음 형식으로 사용됩니다.
"in_context(\"CONTEXT_RESOURCE_NAME\")"
"with_execution(\"EXECUTION_RESOURCE_NAME\")"
"with_artifact(\"ARTIFACT_RESOURCE_NAME\")"
컨텍스트, 실행, 아티팩트 이름은 다음과 같이 전체 리소스 이름이어야 합니다.
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
다음 예시에서는 지정된 파이프라인에 있는 객체를 필터링하는 방법을 보여줍니다.
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\")"
필터 함수에 와일드 카드 *
를 사용하여 각 리소스의 매개변수를 필터링할 수 있습니다. 예를 들어 다음을 사용하여 system.model
아티팩트 유형에서 작동하는 모든 실행을 필터링할 수 있습니다.
REST
with_artifact(\"*\",\"schema_title='name.model'\")
Python
"with_artifact(\"*\",\"schema_title='name.model'\")"
필터링할 수 있는 다른 지원되는 매개변수는 다음과 같습니다.
input=true/false
: 입력 또는 출력 아티팩트 유형을 필터링합니다.event_time
: 실행 또는 아티팩트 이벤트 시간을 필터링합니다.- 다른 모든 지원되는 필터 필드
필드를 논리 피연산자와 결합하여 복잡한 필터 쿼리를 구성할 수 있습니다. 지원되는 최대 중첩 함수 깊이는 5입니다.
아티팩트 쿼리
데이터 세트 및 모델과 같은 아티팩트는 ML 워크플로에서 사용하거나 생성하는 데이터를 나타냅니다. 다음 안내에 따라 아티팩트를 쿼리합니다.
REST
요청 데이터를 사용하기 전에 다음을 바꿉니다.
- LOCATION_ID: 리전
- PROJECT_ID: 프로젝트 ID
- METADATA_STORE: 아티팩트가 생성되는 메타데이터 저장소 ID입니다.
기본 메타데이터 저장소 이름은
default
로 지정됩니다. - PAGE_SIZE: (선택사항) 반환할 최대 아티팩트 수입니다. 이 값을 지정하지 않으면 서비스에서 레코드를 최대 100까지 반환합니다.
- PAGE_TOKEN: (선택사항) 이전 MetadataService.ListArtifacts 호출의 페이지 토큰입니다. 결과의 다음 페이지를 가져오려면 이 토큰을 지정하세요.
FILTER: 결과 집합에 아티팩트를 포함하는 데 필요한 조건을 지정합니다.
HTTP 메서드 및 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
요청을 보내려면 다음 옵션 중 하나를 펼칩니다.
다음과 비슷한 출력이 표시됩니다. ARTIFACT_ID는 아티팩트 레코드의 ID입니다.
{ "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
project
: 프로젝트 ID입니다. 이러한 ID는 Google Cloud 콘솔 시작 페이지에서 찾을 수 있습니다.location
: 사용 가능한 위치 목록을 참조하세요.display_name_filter
: 표시 이름에 적용할 필터이며 "display_name=\"dcmmy_filter\"" 형식의 리소스를 나열합니다.create_date_filter
: create_date 이름에 적용할 필터이며 "create_time>\"2022-06-11T12:30:00-08:00\"" 형식의 리소스를 나열합니다.
실행 쿼리
실행은 데이터 사전 처리 또는 모델 학습과 같은 ML 워크플로의 단계를 나타냅니다. 다음 안내를 따라 실행을 쿼리합니다.
REST
요청 데이터를 사용하기 전에 다음을 바꿉니다.
- LOCATION_ID: 리전
- PROJECT_ID: 프로젝트 ID
- METADATA_STORE: 실행이 생성된 메타데이터 저장소 ID입니다.
기본 메타데이터 저장소 이름은
default
로 지정됩니다. - PAGE_SIZE: (선택사항) 반환할 최대 아티팩트 수입니다. 이 값을 지정하지 않으면 서비스에서 레코드를 최대 100까지 반환합니다.
- PAGE_TOKEN: (선택사항) 이전 MetadataService.ListArtifacts 호출의 페이지 토큰입니다. 결과의 다음 페이지를 가져오려면 이 토큰을 지정하세요.
FILTER: 결과 집합에 실행을 포함하는 데 필요한 조건을 지정합니다.
HTTP 메서드 및 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
요청을 보내려면 다음 옵션 중 하나를 펼칩니다.
다음과 비슷한 출력이 표시됩니다. EXECUTION_ID는 실행 레코드의 ID입니다.
{ "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
project
: 프로젝트 ID입니다. 이러한 ID는 Google Cloud 콘솔 시작 페이지에서 찾을 수 있습니다.location
: 사용 가능한 위치 목록을 참조하세요.display_name_filter
: 표시 이름에 적용할 필터이며 "display_name=\"dcmmy_filter\"" 형식의 리소스를 나열합니다.create_date_filter
: create_date 이름에 적용할 필터이며 "create_time>\"2022-06-11T12:30:00-08:00\"" 형식의 리소스를 나열합니다.
컨텍스트 쿼리
컨텍스트를 사용하면 실행, 아티팩트, 기타 컨텍스트 집합을 그룹화할 수 있습니다. 컨텍스트를 쿼리하려면 다음 안내를 따르세요.
REST
요청 데이터를 사용하기 전에 다음을 바꿉니다.
- LOCATION_ID: 리전
- PROJECT_ID: 프로젝트 ID
- METADATA_STORE: 컨텍스트가 생성되는 메타데이터 저장소 ID입니다.
기본 메타데이터 저장소 이름은
default
로 지정됩니다. - PAGE_SIZE: (선택사항) 반환할 최대 아티팩트 수입니다. 이 값을 지정하지 않으면 서비스에서 레코드를 최대 100까지 반환합니다.
- PAGE_TOKEN: (선택사항) 이전 MetadataService.ListArtifacts 호출의 페이지 토큰입니다. 결과의 다음 페이지를 가져오려면 이 토큰을 지정하세요.
FILTER: 결과 집합에 컨텍스트를 포함하는 데 필요한 조건을 지정합니다.
HTTP 메서드 및 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
요청을 보내려면 다음 옵션 중 하나를 펼칩니다.
다음과 비슷한 출력이 표시됩니다. CONTEXT_ID는 컨텍스트 레코드의 ID입니다.
{ "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": {} } ] }
실행의 입력 및 출력 아티팩트 쿼리
다음 안내에 따라 아티팩트를 실행에 연결하는 이벤트와 함께 지정된 컨텍스트의 아티팩트와 실행을 쿼리합니다.
Python용 Vertex AI SDK
입력 아티팩트
이 Python SDK 샘플에서는 실행의 입력 아티팩트를 쿼리합니다.
Python
출력 아티팩트
이 Python SDK 샘플에서는 실행의 출력 아티팩트를 쿼리합니다.
Python
REST
이 REST 샘플에는 실행의 입력 및 출력 아티팩트 모두에 대한 쿼리가 포함됩니다.
REST
요청 데이터를 사용하기 전에 다음을 바꿉니다.
- LOCATION_ID: 리전
- PROJECT_ID: 프로젝트 ID
- METADATA_STORE: 실행이 생성된 메타데이터 저장소 ID입니다.
기본 메타데이터 저장소 이름은
default
로 지정됩니다. - EXECUTION_ID: 실행 레코드의 ID입니다.
HTTP 메서드 및 URL:
GET https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/metadataStores/METADATA_STORE/executions/EXECUTION_ID:queryExecutionInputsAndOutputs
요청을 보내려면 다음 옵션 중 하나를 펼칩니다.
다음과 비슷한 출력이 표시됩니다. EXECUTION_ID는 실행 레코드의 ID입니다. 실행 ID를 지정하지 않으면 Vertex ML Metadata에서 이 실행의 고유 식별자를 생성합니다. ARTIFACT_ID는 아티팩트 레코드의 ID입니다.
{ "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", } ] }
컨텍스트 계보 하위 그래프 쿼리
다음 안내에 따라 아티팩트를 실행에 연결하는 이벤트와 함께 지정된 컨텍스트의 아티팩트와 실행을 쿼리합니다.
REST
요청 데이터를 사용하기 전에 다음을 바꿉니다.
- LOCATION_ID: 리전
- PROJECT_ID: 프로젝트 ID
- METADATA_STORE: 실행이 생성된 메타데이터 저장소 ID입니다.
기본 메타데이터 저장소 이름은
default
로 지정됩니다. - CONTEXT_ID: (선택사항) 컨텍스트 레코드의 ID입니다.
HTTP 메서드 및 URL:
GET https://LOCATION_ID-aiplatform.googleapis.com/v1/projects/PROJECT_ID/locations/LOCATION_ID/metadataStores/METADATA_STORE/contexts/CONTEXT_ID:queryContextLineageSubgraph
요청을 보내려면 다음 옵션 중 하나를 펼칩니다.
다음과 비슷한 출력이 표시됩니다. EXECUTION_ID는 실행 레코드의 ID입니다. 실행 ID를 지정하지 않으면 Vertex ML Metadata에서 이 실행의 고유 식별자를 생성합니다. ARTIFACT_ID는 아티팩트 레코드의 ID입니다.
{ "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", } ] }