如何使用SageMaker Pipelines部署调优后的最优模型
问题背景
- 已基于AWS SageMaker Pipeline完成XGBoost模型的训练、超参数调优、评估、模型注册全流程
- 部署最优模型时连续遇到两类报错,无法完成上线
- 初始实现参考了SageMaker官方调优步骤示例
遇到的具体报错
- 直接调用
best_model.deploy(...)部署失败:tuning_step.get_top_model_s3_uri(top_k=0,s3_bucket=model_bucket_key)返回Join类型对象,deploy接口要求模型S3路径为字符串类型,无法解析。对应实现代码:
tuning_step = TuningStep(name="HPTuning", tuner=tuner_log, inputs={ "train":..., "validation":... }, cache_config=cache_config) best_model = Model(image_uri=image_uri, model_data=tuning_step.get_top_model_s3_uri(top_k=0,s3_bucket=model_bucket_key), sagemaker_session=sm_session, role=role, predictor_cls=XGBoostPredictor) register_step = RegisterModel(name="RegisterBestChurnModel", estimator=xgb_estimator, model_data=tuning_step.get_top_model_s3_uri(top_k=0, s3_bucket=model_bucket_key), content_types=["text/csv"], response_types=["test/csv"], inference_instances=["ml.t2.medium", "ml.m5.large"], transform_instances=["ml.m5.large"], approval_status="Approved", model_metrics=model_metrics)
- 尝试部署已注册模型版本时抛出属性错误,对应实现代码:
model_package_arn = register_step.properties.ModelPackageArn, model = ModelPackage(role=role, model_package_arn=create_top_step.properties.ModelArn, sagemaker_session=session) model.deploy(initial_instance_count=1, instance_type='ml.m5.xlarge')
报错信息:
/opt/conda/lib/python3.7/site-packages/sagemaker/model.py in _create_sagemaker_model(self, *args, **kwargs) 1532 container_def["Environment"] = self.env 1533 -> 1534 self._ensure_base_name_if_needed(model_package_name.split("/")[-1]) 1535 self._set_model_name_if_needed() 1536 AttributeError: 'tuple' object has no attribute 'split'
问题根因
两个报错的核心原因有两个:
- 你在流水线定义阶段获取的步骤输出(比如
tuning_step.get_top_model_s3_uri()返回值、step.properties属性)都是运行时动态解析的占位符对象(Join、PropertiesExpression类型),不是实际的字符串值,直接把这些占位符传给流水线外的deploy()方法,SDK无法识别。 - 你写注册模型部署代码时,
model_package_arn = register_step.properties.ModelPackageArn,这行末尾多了个英文逗号,Python会自动把这个变量转为单元素元组,直接触发tuple has no attribute 'split'的报错,和动态引用问题无关,是语法错误。
可行部署方案
根据部署场景二选一即可:
场景1:流水线执行完成后单独部署
等流水线全流程运行成功后,拉取步骤输出的实际字符串值再调用部署接口,不要在定义流水线的代码块里直接写部署逻辑。
方式1:直接部署超参调优产出的最优模型
# 替换成你自己的流水线执行ARN pipeline_execution = sm_session.pipeline_execution( pipeline_execution_arn="arn:aws:sagemaker:xxx" ) # 从流水线执行结果里拿到实际的调优任务名 tuning_step_meta = [ s for s in pipeline_execution.step_executions if s.step_name == "HPTuning" ][0] tuning_job_name = tuning_step_meta.metadata["TuningJobArn"].split("/")[-1] # 挂载调优任务拿到最优模型 tuner = HyperparameterTuner.attach(tuning_job_name, sagemaker_session=sm_session) best_estimator = tuner.best_estimator() # 执行部署 predictor = best_estimator.deploy( initial_instance_count=1, instance_type="ml.m5.xlarge", predictor_cls=XGBoostPredictor )
方式2:部署已经注册到模型仓库的版本
# 从流水线执行结果里拿到实际的模型包ARN register_step_meta = [ s for s in pipeline_execution.step_executions if s.step_name == "RegisterBestChurnModel" ][0] model_package_arn = register_step_meta.metadata["RegisterModel"]["Arn"] # 注意不要加末尾逗号 # 初始化模型包并部署 model = ModelPackage( role=role, model_package_arn=model_package_arn, sagemaker_session=sm_session ) predictor = model.deploy(initial_instance_count=1, instance_type="ml.m5.xlarge")
场景2:流水线内自动部署最优模型
如果要实现训练-调优-注册-部署全流程自动跑,不要自己手动调用model.deploy(),要用SageMaker Pipelines原生的步骤类,这些类原生支持解析动态占位符:
from sagemaker.workflow.model_step import ModelStep from sagemaker.workflow.deploy_step import DeployStep # 这里传入动态S3路径占位符是合法的,ModelStep会在运行时自动解析 best_model = Model( image_uri=image_uri, model_data=tuning_step.get_top_model_s3_uri(top_k=0,s3_bucket=model_bucket_key), sagemaker_session=sm_session, role=role, predictor_cls=XGBoostPredictor ) # 第一步:流水线内创建模型实体 create_model_step = ModelStep( name="CreateBestModel", step_args=best_model.create(instance_type="ml.m5.xlarge") ) # 配置部署参数 deploy_config = DeployConfig( endpoint_config_name="churn-pred-endpoint-config", endpoint_name="churn-pred-endpoint", initial_instance_count=1, instance_type="ml.m5.xlarge" ) # 第二步:流水线内执行部署,依赖模型创建步骤 deploy_step = DeployStep( name="DeployBestModel", model=create_model_step.properties.ModelName, deploy_config=deploy_config ) # 最后把create_model_step、deploy_step按顺序加到pipeline的steps列表里即可
内容的提问来源于stack exchange,提问作者Jayanth_
相关产品推荐
相关产品推荐

