如何从Sagemaker模型注册表/模型组获取最新已批准模型的名称?
获取SageMaker模型组中最新已批准模型的ModelName
问题背景
调用CreateTransformJob接口时需要传入ModelName(即SageMaker Model资源的名称),该名称不同于模型注册表/模型组名称、模型包名称。现有场景为已有现成模型,仅需通过模型组名称获取对应最新已批准模型的ModelName,无需通过流水线重新构建。
替代解析S3路径的可靠方案
之前通过解析模型包S3路径的方式存在脆弱性(路径格式可能随SageMaker更新变化),推荐以下两种更可靠的方法:
方法1:通过模型包标签关联查找Model资源
如果模型由SageMaker Pipeline创建,流水线通常会自动给Model资源和对应模型包添加关联标签(比如SageMakerPipelineExecutionArn或自定义标识标签),可利用标签过滤查找:
import boto3 sm_client = boto3.client("sagemaker") # 1. 获取模型组中最新已批准的模型包 model_packages = sm_client.list_model_packages( ModelPackageGroupName="model-group-name", SortBy="CreationTime", SortOrder="Descending" ) approved_pk = next( pk for pk in model_packages["ModelPackageSummaryList"] if pk["ModelApprovalStatus"] == "Approved" ) model_package_arn = approved_pk["ModelPackageArn"] # 2. 获取模型包的流水线执行ARN标签 model_package_tags = sm_client.list_tags(ResourceArn=model_package_arn)["Tags"] pipeline_execution_arn = next( tag["Value"] for tag in model_package_tags if tag["Key"] == "SageMakerPipelineExecutionArn" ) # 3. 通过标签过滤查找对应的Model资源 models = sm_client.list_models( NameContains="pipelines-", TagFilters=[{"Key": "SageMakerPipelineExecutionArn", "Value": pipeline_execution_arn}] ) # 取最新创建的Model latest_model = sorted( models["Models"], key=lambda x: x["CreationTime"], reverse=True )[0] model_name = latest_model["ModelName"]
方法2:直接从模型包创建临时Model(适合无关联Model资源的场景)
如果模型包没有关联的Model资源,可直接用模型包创建临时Model,获取名称后可按需删除:
import boto3 import uuid sm_client = boto3.client("sagemaker") # 1. 获取最新已批准模型包 model_packages = sm_client.list_model_packages( ModelPackageGroupName="model-group-name", SortBy="CreationTime", SortOrder="Descending" ) approved_pk = next( pk for pk in model_packages["ModelPackageSummaryList"] if pk["ModelApprovalStatus"] == "Approved" ) model_package_arn = approved_pk["ModelPackageArn"] # 2. 创建临时Model temp_model_name = f"temp-transform-model-{uuid.uuid4().hex[:8]}" sm_client.create_model( ModelName=temp_model_name, ExecutionRoleArn="你的SageMaker执行角色ARN", PrimaryContainer={ "ModelPackageName": model_package_arn } ) # 3. 获取可用的ModelName model_name = temp_model_name # (可选)TransformJob完成后删除临时Model # sm_client.delete_model(ModelName=temp_model_name)
对原有解析S3路径方法的说明
原有方法通过拆分模型包的ModelDataUrl提取模型名,在流水线生成模型的场景下暂时可用,但依赖S3路径的固定格式,一旦SageMaker调整路径结构就会失效,不建议长期使用。
内容的提问来源于stack exchange,提问作者Dawid Laszuk
相关产品推荐
相关产品推荐

