Interrogation d'entités de lignée - Amazon SageMaker

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Interrogation d'entités de lignée

Amazon génère SageMaker automatiquement des graphiques des entités de lignage lorsque vous les utilisez. Vous pouvez interroger ces données pour répondre à diverses questions. Vous pouvez interroger vos entités de lignée pour :

  • Récupérer tous les jeux de données impliqués dans la création d'un modèle.

  • Récupérer toutes les tâches impliquées dans la création d'un point de terminaison.

  • Récupérer tous les modèles utilisant un jeu de données.

  • Récupérer tous les points de terminaison qui utilisent un modèle.

  • Récupérer les points de terminaison qui proviennent d'un jeu de données précis.

  • Récupérer l'exécution du pipeline qui a créé une tâche d'entraînement.

  • Récupérer les relations entre les entités à des fins d'enquête, de gouvernance et de reproductibilité.

  • Récupérer tous les essais en aval qui utilisent l'artefact.

  • Récupérer tous les essais en amont qui utilisent l'artefact.

  • Récupérer la liste des artefacts qui utilisent l'URI S3 fourni.

  • Récupérer les artefacts en amont qui utilisent l'artefact de jeu de données.

  • Récupérer les artefacts en aval qui utilisent l'artefact de jeu de données.

  • Récupérer les jeux de données qui utilisent l'artefact d'image.

  • Récupérer les actions qui utilisent le contexte.

  • Récupérer les tâches de traitement qui utilisent le point de terminaison.

  • Récupérer les tâches de transformation qui utilisent le point de terminaison.

  • Récupérer les composants d'essai qui utilisent le point de terminaison.

  • Récupérez le ARN pour l'exécution du pipeline associé au groupe de packages de modèles.

  • Récupérer tous les artefacts qui utilisent l'action.

  • Récupérer tous les jeux de données en amont qui utilisent l'action d'approbation de package de modèles.

  • Récupérer le package de modèles à partir de l'action d'approbation de package de modèles

  • Récupérer les contextes de point de terminaison en aval qui utilisent le point de terminaison.

  • Récupérez le ARN pour l'exécution du pipeline associé au composant d'essai.

  • Récupérer les jeux de données qui utilisent le composant d'essai.

  • Récupérer les modèles qui utilisent le composant d'essai.

  • Explorer votre lignée à des fins de visualisation.

Limites
  • L'interrogation de lignée n'est pas disponible dans les régions suivantes :

    • Afrique (Le Cap) – af-south

    • Asie-Pacifique (Jakarta) : ap-southeast-3

    • Asie-Pacifique (Osaka) – ap-northeast-3

    • Europe (Milan) – eu-south-1

    • Europe (Espagne) — eu-south-2

    • Israël (Tel Aviv) – il-central-1

  • La profondeur maximale des relations à découvrir est actuellement limitée à 10.

  • Le filtrage se limite aux propriétés suivantes : date de dernière modification, date de création, type et type d'entité de lignée.

Démarrer avec l'interrogation des entités de lignage

Il existe deux méthodes simples pour démarrer :

Les exemples suivants montrent comment utiliser le LineageQuery et pour créer des requêtes LineageFilter APIs afin de répondre à des questions sur le graphe de lignage et d'extraire des relations entre entités pour quelques cas d'utilisation.

Exemple Utilisation du LineageQuery API pour rechercher des associations d'entités
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)
Exemple Rechercher tous les jeux de données associés à un point de terminaison
# 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)
Exemple Rechercher les modèles associés à un point de terminaison
# 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)
Exemple Rechercher les composants d'évaluation associés au point de terminaison
# 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)
Exemple Changer le point focal de la lignée

La LineageQuery peut être modifiée pour avoir différents start_arns qui modifient le point focal de la lignée. En outre, le LineageFilter peut prendre plusieurs sources et entités pour étendre la portée de la requête.

Dans l'exemple suivant, nous utilisons le modèle comme point focal de la lignée et nous recherchons les points de terminaison et les jeux de données qui lui sont associés.

# 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)
Exemple Utilisation de LineageQueryDirectionEnum.BOTH pour rechercher des relations ascendantes et descendantes

Lorsque la direction est définie sur BOTH, la requête parcourt le graphique pour trouver les relations ascendantes et descendantes. Cette traversée s'effectue non seulement à partir du nœud de départ, mais aussi de chaque nœud visité. Par exemple, si une tâche d'entraînement est exécutée deux fois et que les deux modèles générés par la tâche d'entraînement sont déployés sur des points de terminaison, le résultat de la requête avec la direction définie sur BOTH affiche les deux points de terminaison. En effet, la même image est utilisée pour l'entraînement et le déploiement du modèle. Étant donné que l'image est commune au modèle, le start_arn et les deux points de terminaison apparaissent dans le résultat de la requête.

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)
Exemple Directions dans LineageQuery - ASCENDANTS versus DESCENDANTS

Pour comprendre la direction dans le graphique de lignée, prenez le graphique de relations d'entité suivant - Jeu de données -> Tâche d'entraînement -> Modèle -> Point de terminaison

Le point de terminaison est un descendant du modèle, et le modèle est un descendant du jeu de données. De même, le modèle est un ascendant du point de terminaison. Le paramètre direction peut être utilisé pour spécifier si la requête doit renvoyer des entités descendantes ou ascendantes de l'entité dans start_arns. Si le start_arns contient un modèle et que la direction est DESCENDANTS, la requête renvoie le point de terminaison. Si la direction est ASCENDANTS, la requête renvoie le jeu de données.

# 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)
Exemple SDKfonctions d'assistance pour faciliter les requêtes de lignage

Les classes EndpointContextModelArtifact, et DatasetArtifact ont des fonctions d'assistance qui sont des enveloppes LineageQuery API pour faciliter l'exploitation de certaines requêtes de lignage. L'exemple suivant montre comment utiliser cette fonction d'assistance.

# 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)
Exemple Obtention d'une visualisation de graphique de lignée

Une classe d'assistance Visualizer est fournie dans l'exemple de bloc-notes visualizer.py pour aider à tracer le graphique de lignée. Lorsque la réponse de la requête est rendue, un graphique avec les relations de lignée du StartArns s'affiche. La visualisation montre StartArns les relations avec les autres entités de lignage renvoyées lors de l'query_lineageAPIaction.

# 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")