Dawid Laszuk
Dawid Laszuk

Reputation: 1978

Extract model name from Sagemaker Model Registry

Given Model Registry name, e.g. model-registry-name, or Model Group Name, e.g. model-group-name, how to get the model name of the latest approved model?

To CreateaTransformJob, one needs to provide a model name. This isn't Model Registry Name, nor Model Package Group name, nor Model Package name. What I used to do was to pull lots of script strings and parse s3 path, i.e.

import boto3

sm = boto3.client("sagemaker")
model_packages = sm.list_model_packages(
    ModelPackageGroupName='model-group-name', SortBy"CreationTime", SortOrder="Descending")
model_package = [pk for pk in model_packages["ModelPackageSummaryList"] 
                 if pk["ModelApprovalStatus"] == "Approved"][0]
model_package = sm.describe_model_package(ModelPackageName=model_package["ModelPackageArn"])
model_data = model_package["InferenceSpecification"]["Containers"][0]["ModelDataUrl"]
model_name = model_data.rsplit("/", 3)[1]

which would typically end up something like pipelines-{uid1}-{trimmedStepNa}-{uid2}.

I've seen that there's a similar StackOverflow question, i.e. Retrieve Sagemaker Model from Model Registry in Sagemaker Pipelines, but 1) we already have an existing model, and 2) this pipeline is purely for transforming data.

Upvotes: 0

Views: 1258

Answers (1)

Payton Staub
Payton Staub

Reputation: 602

A better way to do this would be with SageMaker's search API.

Your code will be the same up to the point that you find the latest approved model package, then you'll search for models that were created from that model package ARN:

import boto3

sm = boto3.client("sagemaker")
model_packages = sm.list_model_packages(
    ModelPackageGroupName='model-group-name', SortBy"CreationTime", SortOrder="Descending")
model_package = [pk for pk in model_packages["ModelPackageSummaryList"] 
                 if pk["ModelApprovalStatus"] == "Approved"][0]
model_package_arn = model_package["ModelPackageArn"]

models = sm.search(
    Resource='Model',
    SearchExpression={
        'Filters': [
            {
                'Name': 'Model.Containers.ModelPackageName',
                'Operator': 'Equals',
                'Value': model_package_arn
            },
        ]
    }
)["Results"]

model_name = models[0]["Model"]["Model"]["ModelName"]

Upvotes: 2

Related Questions