Consulta de entidades de linaje - Amazon SageMaker

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Consulta de entidades de linaje

Amazon genera SageMaker automáticamente gráficos de entidades de linaje a medida que los utilizas. Puede consultar estos datos para responder a una variedad de preguntas. Puede consultar las entidades de su linaje para:

  • Recuperar todos los conjuntos de datos que se utilizaron en la creación de un modelo.

  • Recuperar todos los trabajos necesarios para la creación de un punto de conexión.

  • Recuperar todos los modelos que utilizan un conjunto de datos.

  • Recuperar todos los puntos de conexión que utilizan un modelo.

  • Recuperar qué puntos de conexión se derivan de un determinado conjunto de datos.

  • Recuperar la ejecución de la canalización que creó un trabajo de entrenamiento.

  • Recuperar las relaciones entre las entidades para la investigación, la gobernanza y la reproducibilidad.

  • Recuperar todas las pruebas posteriores que utilizan el artefacto.

  • Recuperar todas las pruebas anteriores que utilizan el artefacto.

  • Recuperar una lista de artefactos que utilizan el URI de S3 proporcionado.

  • Recuperar los artefactos anteriores que utilizan el artefacto del conjunto de datos.

  • Recuperar los artefactos posteriores que utilizan el artefacto del conjunto de datos.

  • Recuperar los conjuntos de datos que utilizan el artefacto de imagen.

  • Recuperar las acciones que utilizan el contexto.

  • Recuperar los trabajos de procesamiento que utilizan el punto de conexión.

  • Recuperar los trabajos de transformación que utilizan el punto de conexión.

  • Recuperar los componentes de prueba que utilizan el punto de conexión.

  • Recupera los datos ARN para la ejecución de la canalización asociada al grupo de paquetes del modelo.

  • Recuperar todos los artefactos que utilizan la acción.

  • Recuperar todos los conjuntos de datos originales que utilizan la acción de aprobación del paquete de modelos.

  • Recuperar el paquete de modelos de la acción de aprobación del paquete de modelos.

  • Recuperar los contextos de punto de conexión posteriores que utilizan el punto de conexión.

  • Recupera el componente de prueba ARN para la ejecución de la canalización asociada al componente de prueba.

  • Recuperar los conjuntos de datos que utilizan el componente de prueba.

  • Recuperar los modelos que utilizan el componente de prueba.

  • Explorar su linaje para visualizarlo.

Limitaciones
  • La consulta de linaje no está disponible en las siguientes regiones:

    • África (Ciudad del Cabo): af-south

    • Asia-Pacífico (Yakarta) (ap-southeast-3)

    • Asia-Pacífico (Osaka) ap-northeast-3

    • Europa (Milán) (eu-south-1)

    • Europa (España): eu-south-2

    • Israel (Tel Aviv): il-central-1

  • La profundidad máxima de las relaciones por detectar está limitada actualmente a 10.

  • El filtrado se limita a las siguientes propiedades: fecha de la última modificación, fecha de creación, tipo y tipo de entidad de linaje.

Introducción a la consulta de entidades de linaje

La forma más sencilla para empezar es a través de:

En los siguientes ejemplos, se muestra cómo usar el gráfico de linaje LineageQuery y cómo construir consultas LineageFilter APIs para responder a preguntas sobre el gráfico de linaje y extraer las relaciones entre entidades para algunos casos de uso.

ejemplo Utilizándolo LineageQuery API para buscar asociaciones de entidades
from sagemaker.lineage.context import Context, EndpointContext from sagemaker.lineage.action import Action from sagemaker.lineage.association import Association from sagemaker.lineage.artifact import Artifact, ModelArtifact, DatasetArtifact from sagemaker.lineage.query import ( LineageQuery, LineageFilter, LineageSourceEnum, LineageEntityEnum, LineageQueryDirectionEnum, ) # Find the endpoint context and model artifact that should be used for the lineage queries. contexts = Context.list(source_uri=endpoint_arn) context_name = list(contexts)[0].context_name endpoint_context = EndpointContext.load(context_name=context_name)
ejemplo Buscar todos los conjuntos de datos asociados a un punto de conexión
# Define the LineageFilter to look for entities of type `ARTIFACT` and the source of type `DATASET`. query_filter = LineageFilter( entities=[LineageEntityEnum.ARTIFACT], sources=[LineageSourceEnum.DATASET] ) # Providing this `LineageFilter` to the `LineageQuery` constructs a query that traverses through the given context `endpoint_context` # and find all datasets. query_result = LineageQuery(sagemaker_session).query( start_arns=[endpoint_context.context_arn], query_filter=query_filter, direction=LineageQueryDirectionEnum.ASCENDANTS, include_edges=False, ) # Parse through the query results to get the lineage objects corresponding to the datasets dataset_artifacts = [] for vertex in query_result.vertices: dataset_artifacts.append(vertex.to_lineage_object().source.source_uri) pp.pprint(dataset_artifacts)
ejemplo Buscar los modelos asociados a un punto de conexión
# Define the LineageFilter to look for entities of type `ARTIFACT` and the source of type `MODEL`. query_filter = LineageFilter( entities=[LineageEntityEnum.ARTIFACT], sources=[LineageSourceEnum.MODEL] ) # Providing this `LineageFilter` to the `LineageQuery` constructs a query that traverses through the given context `endpoint_context` # and find all datasets. query_result = LineageQuery(sagemaker_session).query( start_arns=[endpoint_context.context_arn], query_filter=query_filter, direction=LineageQueryDirectionEnum.ASCENDANTS, include_edges=False, ) # Parse through the query results to get the lineage objects corresponding to the model model_artifacts = [] for vertex in query_result.vertices: model_artifacts.append(vertex.to_lineage_object().source.source_uri) # The results of the `LineageQuery` API call return the ARN of the model deployed to the endpoint along with # the S3 URI to the model.tar.gz file associated with the model pp.pprint(model_artifacts)
ejemplo Buscar los componentes de prueba asociados al punto de conexión
# Define the LineageFilter to look for entities of type `TRIAL_COMPONENT` and the source of type `TRAINING_JOB`. query_filter = LineageFilter( entities=[LineageEntityEnum.TRIAL_COMPONENT], sources=[LineageSourceEnum.TRAINING_JOB], ) # Providing this `LineageFilter` to the `LineageQuery` constructs a query that traverses through the given context `endpoint_context` # and find all datasets. query_result = LineageQuery(sagemaker_session).query( start_arns=[endpoint_context.context_arn], query_filter=query_filter, direction=LineageQueryDirectionEnum.ASCENDANTS, include_edges=False, ) # Parse through the query results to get the ARNs of the training jobs associated with this Endpoint trial_components = [] for vertex in query_result.vertices: trial_components.append(vertex.arn) pp.pprint(trial_components)
ejemplo Cambiar el punto focal del linaje

LineageQuery se puede modificar para que tenga diferentes start_arns, lo que cambia el punto focal del linaje. Además, LineageFilter pueden utilizarse varios orígenes y entidades para ampliar el alcance de la consulta.

A continuación, utilizamos el modelo como punto focal del linaje y buscamos los puntos de conexión y los conjuntos de datos asociados a él.

# Get the ModelArtifact model_artifact_summary = list(Artifact.list(source_uri=model_package_arn))[0] model_artifact = ModelArtifact.load(artifact_arn=model_artifact_summary.artifact_arn) query_filter = LineageFilter( entities=[LineageEntityEnum.ARTIFACT], sources=[LineageSourceEnum.ENDPOINT, LineageSourceEnum.DATASET], ) query_result = LineageQuery(sagemaker_session).query( start_arns=[model_artifact.artifact_arn], # Model is the starting artifact query_filter=query_filter, # Find all the entities that descend from the model, i.e. the endpoint direction=LineageQueryDirectionEnum.DESCENDANTS, include_edges=False, ) associations = [] for vertex in query_result.vertices: associations.append(vertex.to_lineage_object().source.source_uri) query_result = LineageQuery(sagemaker_session).query( start_arns=[model_artifact.artifact_arn], # Model is the starting artifact query_filter=query_filter, # Find all the entities that ascend from the model, i.e. the datasets direction=LineageQueryDirectionEnum.ASCENDANTS, include_edges=False, ) for vertex in query_result.vertices: associations.append(vertex.to_lineage_object().source.source_uri) pp.pprint(associations)
ejemplo Uso de LineageQueryDirectionEnum.BOTH para encontrar relaciones ascendentes y descendentes

Cuando la dirección está establecida en BOTH, la consulta recorre el gráfico para encontrar las relaciones ascendentes y descendentes. Este recorrido se realiza no solo desde el nodo inicial, sino también desde cada nodo visitado. Por ejemplo, si un trabajo de entrenamiento se ejecuta dos veces y los dos modelos generados por el trabajo de entrenamiento se despliegan en los puntos de conexión, el resultado de la consulta con la dirección establecida en BOTH muestra ambos puntos de conexión. Esto se debe a que se utiliza la misma imagen para entrenar e implementar el modelo. Como la imagen es común al modelo, el start_arn y ambos puntos de conexión aparecen en el resultado de la consulta.

query_filter = LineageFilter( entities=[LineageEntityEnum.ARTIFACT], sources=[LineageSourceEnum.ENDPOINT, LineageSourceEnum.DATASET], ) query_result = LineageQuery(sagemaker_session).query( start_arns=[model_artifact.artifact_arn], # Model is the starting artifact query_filter=query_filter, # This specifies that the query should look for associations both ascending and descending for the start direction=LineageQueryDirectionEnum.BOTH, include_edges=False, ) associations = [] for vertex in query_result.vertices: associations.append(vertex.to_lineage_object().source.source_uri) pp.pprint(associations)
ejemplo Direcciones en LineageQuery: ASCENDANTS vs. DESCENDANTS

Para entender la dirección del gráfico de linaje, tome el siguiente gráfico de relación entre entidades: Conjunto de datos -> Trabajo de entrenamiento -> Modelo -> Punto de conexión

El punto de conexión es un descendiente del modelo y el modelo es un descendiente del conjunto de datos. Del mismo modo, el modelo es un ascendente del punto de conexión. El parámetro direction se puede usar para especificar si la consulta debe devolver entidades descendientes o ascendentes de la entidad en start_arns. Si start_arns contiene un modelo y la dirección es DESCENDANTS, la consulta devuelve el punto de conexión. Si la dirección es ASCENDANTS, la consulta devuelve el conjunto de datos.

# In this example, we'll look at the impact of specifying the direction as ASCENDANT or DESCENDANT in a `LineageQuery`. query_filter = LineageFilter( entities=[LineageEntityEnum.ARTIFACT], sources=[ LineageSourceEnum.ENDPOINT, LineageSourceEnum.MODEL, LineageSourceEnum.DATASET, LineageSourceEnum.TRAINING_JOB, ], ) query_result = LineageQuery(sagemaker_session).query( start_arns=[model_artifact.artifact_arn], query_filter=query_filter, direction=LineageQueryDirectionEnum.ASCENDANTS, include_edges=False, ) ascendant_artifacts = [] # The lineage entity returned for the Training Job is a TrialComponent which can't be converted to a # lineage object using the method `to_lineage_object()` so we extract the TrialComponent ARN. for vertex in query_result.vertices: try: ascendant_artifacts.append(vertex.to_lineage_object().source.source_uri) except: ascendant_artifacts.append(vertex.arn) print("Ascendant artifacts : ") pp.pprint(ascendant_artifacts) query_result = LineageQuery(sagemaker_session).query( start_arns=[model_artifact.artifact_arn], query_filter=query_filter, direction=LineageQueryDirectionEnum.DESCENDANTS, include_edges=False, ) descendant_artifacts = [] for vertex in query_result.vertices: try: descendant_artifacts.append(vertex.to_lineage_object().source.source_uri) except: # Handling TrialComponents. descendant_artifacts.append(vertex.arn) print("Descendant artifacts : ") pp.pprint(descendant_artifacts)
ejemplo SDKfunciones auxiliares para facilitar las consultas de linaje

Las clases EndpointContextModelArtifact, y DatasetArtifact tienen funciones auxiliares que son envolventes LineageQuery API para facilitar el aprovechamiento de determinadas consultas de linaje. El siguiente ejemplo muestra cómo utilizar esta función auxiliar.

# Find all the datasets associated with this endpoint datasets = [] dataset_artifacts = endpoint_context.dataset_artifacts() for dataset in dataset_artifacts: datasets.append(dataset.source.source_uri) print("Datasets : ", datasets) # Find the training jobs associated with the endpoint training_job_artifacts = endpoint_context.training_job_arns() training_jobs = [] for training_job in training_job_artifacts: training_jobs.append(training_job) print("Training Jobs : ", training_jobs) # Get the ARN for the pipeline execution associated with this endpoint (if any) pipeline_executions = endpoint_context.pipeline_execution_arn() if pipeline_executions: for pipeline in pipelines_executions: print(pipeline) # Here we use the `ModelArtifact` class to find all the datasets and endpoints associated with the model dataset_artifacts = model_artifact.dataset_artifacts() endpoint_contexts = model_artifact.endpoint_contexts() datasets = [dataset.source.source_uri for dataset in dataset_artifacts] endpoints = [endpoint.source.source_uri for endpoint in endpoint_contexts] print("Datasets associated with this model : ") pp.pprint(datasets) print("Endpoints associated with this model : ") pp.pprint(endpoints) # Here we use the `DatasetArtifact` class to find all the endpoints hosting models that were trained with a particular dataset # Find the artifact associated with the dataset dataset_artifact_arn = list(Artifact.list(source_uri=training_data))[0].artifact_arn dataset_artifact = DatasetArtifact.load(artifact_arn=dataset_artifact_arn) # Find the endpoints that used this training dataset endpoint_contexts = dataset_artifact.endpoint_contexts() endpoints = [endpoint.source.source_uri for endpoint in endpoint_contexts] print("Endpoints associated with the training dataset {}".format(training_data)) pp.pprint(endpoints)
ejemplo Obtener una visualización de un gráfico de linaje

En el ejemplo de cuaderno visualizer.py se proporciona una clase auxiliar Visualizer para ayudar a trazar el gráfico de linaje. Cuando se representa la respuesta a la consulta, se muestra un gráfico con las relaciones de linaje de StartArns. A partir de ahí, StartArns la visualización muestra las relaciones con las demás entidades del linaje devueltas en la acción. query_lineage API

# Graph APIs # Here we use the boto3 `query_lineage` API to generate the query response to plot. from visualizer import Visualizer query_response = sm_client.query_lineage( StartArns=[endpoint_context.context_arn], Direction="Ascendants", IncludeEdges=True ) viz = Visualizer() viz.render(query_response, "Endpoint") query_response = sm_client.query_lineage( StartArns=[model_artifact.artifact_arn], Direction="Ascendants", IncludeEdges=True ) viz.render(query_response, "Model")