sagemaker自定义@step装饰器抛出“TypeError:管道变量不支持__str__操作。请使用`.to_string()`”

问题描述 投票:0回答:1

我正在我的 sagemaker 管道中创建模型卡步骤,因此我定义了我的 model_card 方法,如下所示:

def create_model_card(model_package_details, bucket):
        import sagemaker
        model_card_name = "TestingModelCard"
        sagemaker_session = sagemaker.session.Session()

        Get model package details
        mp_details = ModelPackage.from_model_package_arn(
            model_package_arn=model_package_details,
            sagemaker_session=sagemaker_session,
        )

        print(f"Model Package ARN: {model_package_details}")

        my_card = ModelCard(
            name=model_card_name,
            status=ModelCardStatusEnum.PENDING_REVIEW,
            model_package_details=mp_details,
            sagemaker_session=sagemaker_session
        )
        my_card.create()
        return f"Model card {model_card_name} and package arn {model_package_details} created successfully"

现在在我的管道中,按照

[documentation][1]
调用步骤,如下所示:

model_card_pipeline_params = {"model_package_details": model_package_arn_ref, "bucket": default_bucket}

step_delayed_model_card = function_step.step(_func=create_model_card(**model_card_pipeline_params),
                                                 security_group_ids=network_config.security_group_ids,
                                                 subnets=network_config.subnets,
                                                 role=role,
                                                 name="CreateModelCard",
                                                 instance_type="ml.m5.xlarge")

PS:model_package_details 是模型包 ARN,作为我之前 lambdastep 的输出。 有了这个我收到这个错误

step_delayed_model_card = function_step.step(_func=create_model_card(**model_card_pipeline_params),
  File "/home/runner/.local/lib/python3.10/site-packages/pipelines/abalone/pipeline.py", line 302, in create_model_card
    mp_details = ModelPackage.from_model_package_arn(
  File "/home/runner/.local/lib/python3.10/site-packages/sagemaker/model_card/model_card.py", line 462, in from_model_package_arn
    model_package_response = cls.call_describe_model_package(
  File "/home/runner/.local/lib/python3.10/site-packages/sagemaker/model_card/model_card.py", line 378, in call_describe_model_package
    model_package_response = sagemaker_session.sagemaker_client.describe_model_package(
  File "/home/runner/.local/lib/python3.10/site-packages/botocore/client.py", line 553, in _api_call
    return self._make_api_call(operation_name, kwargs)
  File "/home/runner/.local/lib/python3.10/site-packages/botocore/client.py", line 962, in _make_api_call
    request_dict = self._convert_to_request_dict(
  File "/home/runner/.local/lib/python3.10/site-packages/botocore/client.py", line 1036, in _convert_to_request_dict
    request_dict = self._serializer.serialize_to_request(
  File "/home/runner/.local/lib/python3.10/site-packages/botocore/validate.py", line 381, in serialize_to_request
    raise ParamValidationError(report=report.generate_report())
  File "/home/runner/.local/lib/python3.10/site-packages/botocore/validate.py", line 102, in generate_report
    error_messages.append(self._format_error(error))
  File "/home/runner/.local/lib/python3.10/site-packages/botocore/validate.py", line 125, in _format_error
    f'Invalid type for parameter {name}, value: {param}, '
  File "/home/runner/.local/lib/python3.10/site-packages/sagemaker/workflow/entities.py", line 90, in __str__
    raise TypeError(
TypeError: Pipeline variables do not support __str__ operation. Please use `.to_string()` to convert it to string type in execution time or use `.expr` to translate it to Json for display purpose in Python SDK. 
python-3.x amazon-web-services amazon-sagemaker
1个回答
0
投票

您遇到的错误是由于尝试在需要字符串的操作中直接使用

SageMaker
管道变量。解决方案是使用
.to_string()
方法将管道变量转换为字符串表示形式,然后再在此类上下文中使用它们。这种调整可以让您有效地使用管道变量,而不会遇到类型错误:

def create_model_card(model_package_details, bucket):
    import sagemaker
    from sagemaker.workflow.parameters import ParameterString

    model_card_name = "TestingModelCard"
    sagemaker_session = sagemaker.session.Session()

    # Check if model_package_details is a pipeline parameter and convert to string if necessary
    if isinstance(model_package_details, ParameterString):
        model_package_details_str = model_package_details.to_string()
    else:
        model_package_details_str = model_package_details

    # Use the string representation for operations that require a string
    print(f"Model Package ARN: {model_package_details_str}")

    mp_details = ModelPackage.from_model_package_arn(
        model_package_arn=model_package_details_str,  # Use the string version here
        sagemaker_session=sagemaker_session,
    )

    my_card = ModelCard(
        name=model_card_name,
        status=ModelCardStatusEnum.PENDING_REVIEW,
        model_package_details=mp_details,
        sagemaker_session=sagemaker_session
    )
    my_card.create()
    return f"Model card {model_card_name} and package arn {model_package_details_str} created successfully"

© www.soinside.com 2019 - 2024. All rights reserved.