使用 SageMaker Pipeline 和 RegisterModel 部署 PyTorch 模型时出错

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

任何人都可以提供使用 SageMaker Pipeline 部署 pytorch 模型的示例吗?

我使用了 SageMaker Studio 的 MLOps 模板(用于模型构建、训练和部署的 MLOps 模板)来构建 MLOps 项目。

该模板使用 sagemaker pipelines 构建用于预处理、训练和注册模型的管道。 部署脚本在YAML文件中实现并使用CloudFormation来运行。模型注册时会自动触发部署脚本。

该模板使用xgboost模型来训练数据并部署模型。我想使用 Pytorch 并部署它。 我成功地将pytorch替换为xgboost,并成功预处理数据、训练模型并注册模型。但我没有在我的模型中使用 inference.py 。所以我收到模型部署错误。

更新端点时的错误日志为:

FileNotFoundError: [Errno 2] No such file or directory: '/opt/ml/model/code/inference.py'

我试图找到使用 inference.py 进行 pytorch 模型的示例,但我找不到任何使用 sagemaker pipelinesRegisterModel 的示例。

如有任何帮助,我们将不胜感激。

下面您可以看到用于训练和注册模型的管道的一部分。

from sagemaker.pytorch.estimator import PyTorch
from sagemaker.workflow.pipeline import Pipeline
from sagemaker.workflow.steps import (
    ProcessingStep,
    TrainingStep,
)
from sagemaker.workflow.step_collections import RegisterModel

pytorch_estimator = PyTorch(entry_point= os.path.join(BASE_DIR, 'train.py'),
                            instance_type= "ml.m5.xlarge",
                            instance_count=1,
                            role=role,
                            framework_version='1.8.0',
                            py_version='py3',
                            hyperparameters = {'epochs': 5, 'batch-size': 64, 'learning-rate': 0.1})

step_train = TrainingStep(
        name="TrainModel",
        estimator=pytorch_estimator,

        inputs={
                "train": sagemaker.TrainingInput(
                            s3_data=step_process.properties.ProcessingOutputConfig.Outputs[
                            "train_data"
                            ].S3Output.S3Uri,
                            content_type="text/csv",
                        ),
                "dev": sagemaker.TrainingInput(
                            s3_data=step_process.properties.ProcessingOutputConfig.Outputs[
                            "dev_data"
                            ].S3Output.S3Uri,
                            content_type="text/csv"
                        ),
                "test": sagemaker.TrainingInput(
                            s3_data=step_process.properties.ProcessingOutputConfig.Outputs[
                            "test_data"
                            ].S3Output.S3Uri,
                            content_type="text/csv"
                        ),
        },
)
step_register = RegisterModel(
            name="RegisterModel",
            estimator=pytorch_estimator,
            model_data=step_train.properties.ModelArtifacts.S3ModelArtifacts,
            content_types=["text/csv"],
            response_types=["text/csv"],
            inference_instances=["ml.t2.medium", "ml.m5.large"],
            transform_instances=["ml.m5.large"],
            model_package_group_name=model_package_group_name,
            approval_status=model_approval_status,
        )
    
pipeline = Pipeline(
            name=pipeline_name,
            parameters=[
                processing_instance_type,
                processing_instance_count,
                training_instance_type,
                model_approval_status,
                input_data,
            ],
            steps=[step_process, step_train, step_register],
            sagemaker_session=sagemaker_session,
        )
pytorch aws-cloudformation amazon-sagemaker endpoint mlops
2个回答
0
投票

PyTorch api 使用基本 pytorch 图像。 当调用 sagemaker.pytorch.deploy 方法时,sagemaker 运行 '/opt/ml/model/code/inference.py'

但是在你的基础镜像中没有该文件。

因此,如果您想使用部署方法,您可以使用 sagemaker 风格制作“inference.py”(可以在 sagemaker 容器中执行)并构建并推送镜像。

然后就可以使用deploy方法了!

这是示例代码 https://sagemaker-workshop.com/custom/containers.html


0
投票

我遇到了类似的问题,但我认为这与

PyTorch
容器如何部署用于训练和推理有关。

我遵循了这段代码here。基本上,您需要使用

PyTorchModel
重新创建模式,而不是使用
PyTorch
模式。

这是片段:

model = PyTorchModel(
    entry_point="infer.py",
    source_dir=os.path.join(BASE_DIR, "sagemaker_intel"),
    image_uri = "441249477288.dkr.ecr.ap-south-1.amazonaws.com/sagemaker-inference",
    sagemaker_session=pipeline_session,
    role=role,
    model_data=step_train.properties.ModelArtifacts.S3ModelArtifacts,
    framework_version="1.11.0",
)

model_step_args = model.register(
    content_types=["application/x-npy"],
    response_types=["application/json"],
    inference_instances=["ml.t2.medium", "ml.t2.large"],
    transform_instances=["ml.m4.xlarge"],
    model_package_group_name=model_package_group_name,
    approval_status=model_approval_status,
    model_metrics=model_metrics,
)

step_register = ModelStep(
    name="RegisterIntelClassifierModel",
    step_args=model_step_args,
)

让我知道这是否有效。

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