You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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_

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 01:27:27