使用SageMaker Python SDK流水线注册模型遇类型错误求解决方案
解决方案
错误原因
在SageMaker Pipeline上下文环境中,Model对象的model_data参数使用了来自训练步骤的Pipeline变量(step_train.properties.ModelArtifacts.S3ModelArtifacts),当调用model.register()时,底层的Botocore序列化逻辑会尝试对该变量执行*str*操作,但Pipeline变量不支持此方法,从而抛出错误。
修复步骤
修改Model对象的model_data参数:
将model_data的Pipeline变量通过.to_string()方法转换为执行时可解析的字符串表达式,避免序列化时触发*str*操作。修改后的Model创建代码:
model = Model( image_uri=image_uri, model_data=step_train.properties.ModelArtifacts.S3ModelArtifacts.to_string(), sagemaker_session=sagemaker_session, role=role, )验证其他Pipeline变量(如model_metrics):
如果model_metrics中使用了来自评估步骤的Pipeline变量(比如模型统计文件的S3路径),同样需要对这些变量调用.to_string()方法,示例:model_metrics = ModelMetrics( model_statistics=MetricsSource( s3_uri=step_eval.properties.EvaluationMetrics.S3EvaluationOutputPath.to_string(), content_type="application/json" ) )保留原有注册逻辑:
后续的model.register()和ModelStep代码无需修改,保持原逻辑即可:model_register = model.register( content_types=["text/csv"], response_types=["text/csv"], model_metrics=model_metrics, inference_instances=["ml.t2.medium", "ml.m5.large"], transform_instances=["ml.m5.large"], approval_status="PendingManualApproval", model_package_group_name="ReturnModelPackage", ) step_model_register = ModelStep( name="ReturnModelRegister", step_args=model_register )
原理说明
.to_string()方法会将Pipeline变量转换为一个特殊的表达式字符串,SageMaker Pipeline在执行阶段会自动解析该表达式,获取对应的实际S3路径值,既满足了Pipeline变量的传递需求,又避免了序列化时的类型错误。
内容的提问来源于stack exchange,提问作者Kedhar
相关产品推荐
相关产品推荐

