在 Amazon SageMaker PlatoBlockchain Data Intelligence 上使用 RStudio 创建 Amazon SageMaker 模型构建管道并部署 R 模型。 垂直搜索。 哎。

在 Amazon SageMaker 上使用 RStudio 创建 Amazon SageMaker 模型构建管道并部署 R 模型

2021 年 XNUMX 月,与 RStudio PBC我们 公布 一般可用 Amazon SageMaker 上的 RStudio,业界第一个完全托管的云端 RStudio Workbench IDE。 您现在可以携带当前的 RStudio 许可证轻松地将您的自我管理的 RStudio 环境迁移到 亚马逊SageMaker 只需几个简单的步骤。

RStudio 是用于机器学习 (ML) 和数据科学项目的 R 开发人员中最受欢迎的 IDE 之一。 RStudio 为 R 和企业级专业软件提供开源工具,供数据科学团队开发和分享他们在组织中的工作。 将 RStudio 引入 SageMaker 不仅可以让您以完全托管的方式访问 AWS 基础设施,还可以让您以本机方式访问 SageMaker。

在这篇文章中,我们将探讨如何通过 SageMaker 上的 RStudio 使用 SageMaker 功能来构建 SageMaker 管道,以构建、处理、训练和注册您的 R 模型。 我们还探索使用 SageMaker 进行模型部署,全部使用 R。

解决方案概述

下图显示了我们的解决方案中使用的架构。 本示例中使用的所有代码都可以在 GitHub存储库.

先决条件

要关注这篇文章,需要访问 SageMaker 上的 RStudio。 如果您不熟悉在 SageMaker 上使用 RStudio,请查看 在 Amazon SageMaker 上开始使用 RStudio.

我们还需要构建自定义 Docker 容器。 我们用 AWS 代码构建 构建这些容器,所以你需要一些额外的 AWS身份和访问管理 (IAM) 默认情况下您可能没有的权限。 在继续之前,请确保您使用的 IAM 角色具有 CodeBuild 的信任策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "codebuild.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

IAM 角色还需要以下权限才能在 CodeBuild 中运行构建并将映像推送到 Amazon Elastic Container注册 (亚马逊 ECR):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "codebuild:DeleteProject",
                "codebuild:CreateProject",
                "codebuild:BatchGetBuilds",
                "codebuild:StartBuild"
            ],
            "Resource": "arn:aws:codebuild:*:*:project/sagemaker-studio*"
        },
        {
            "Effect": "Allow",
            "Action": "logs:CreateLogStream",
            "Resource": "arn:aws:logs:*:*:log-group:/aws/codebuild/sagemaker-studio*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:GetLogEvents",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:log-group:/aws/codebuild/sagemaker-studio*:log-stream:*"
        },
        {
            "Effect": "Allow",
            "Action": "logs:CreateLogGroup",
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ecr:CreateRepository",
                "ecr:BatchGetImage",
                "ecr:CompleteLayerUpload",
                "ecr:DescribeImages",
                "ecr:DescribeRepositories",
                "ecr:UploadLayerPart",
                "ecr:ListImages",
                "ecr:InitiateLayerUpload", 
                "ecr:BatchCheckLayerAvailability",
                "ecr:PutImage"
            ],
            "Resource": "arn:aws:ecr:*:*:repository/sagemaker-studio*"
        },
        {
            "Sid": "ReadAccessToPrebuiltAwsImages",
            "Effect": "Allow",
            "Action": [
                "ecr:BatchGetImage",
                "ecr:GetDownloadUrlForLayer"
            ],
            "Resource": [
                "arn:aws:ecr:*:763104351884:repository/*",
                "arn:aws:ecr:*:217643126080:repository/*",
                "arn:aws:ecr:*:727897471807:repository/*",
                "arn:aws:ecr:*:626614931356:repository/*",
                "arn:aws:ecr:*:683313688378:repository/*",
                "arn:aws:ecr:*:520713654638:repository/*",
                "arn:aws:ecr:*:462105765813:repository/*"
            ]
        },
        {
            "Sid": "EcrAuthorizationTokenRetrieval",
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
              "s3:GetObject",
              "s3:DeleteObject",
              "s3:PutObject"
              ],
            "Resource": "arn:aws:s3:::sagemaker-*/*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:CreateBucket"
            ],
            "Resource": "arn:aws:s3:::sagemaker*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:GetRole",
                "iam:ListRoles"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::*:role/*",
            "Condition": {
                "StringLikeIfExists": {
                    "iam:PassedToService": "codebuild.amazonaws.com"
                }
            }
        }
    ]
}

创建基线 R 容器

要使用我们的 R 脚本处理和训练 SageMaker 处理和训练作业,我们需要创建自己的 Docker容器 包含必要的运行时和包。 使用您自己的容器(SageMaker 产品的一部分)的能力为开发人员和数据科学家提供了极大的灵活性,可以使用他们选择的工具和框架,几乎没有任何限制。

我们创建了两个启用 R 的 Docker 容器:一个用于处理作业,一个用于训练和部署我们的模型。 处理数据通常需要与建模不同的包和库,因此在这里将两个阶段分开并使用不同的容器是有意义的。

有关将容器与 SageMaker 一起使用的更多详细信息,请参阅 将 Docker 容器与 SageMaker 一起使用.

用于处理的容器定义如下:

FROM public.ecr.aws/docker/library/r-base:4.1.2

# Install tidyverse
RUN apt update && apt-get install -y --no-install-recommends 
    r-cran-tidyverse
    
RUN R -e "install.packages(c('rjson'))"

ENTRYPOINT ["Rscript"]

在这篇文章中,我们使用了一个简单且相对轻量级的容器。 根据您或您的组织的需要,您可能需要预安装多个 R 包。

用于训练和部署的容器定义如下:

FROM public.ecr.aws/docker/library/r-base:4.1.2

RUN apt-get -y update && apt-get install -y --no-install-recommends 
    wget 
    apt-transport-https 
    ca-certificates 
    libcurl4-openssl-dev 
    libsodium-dev
    
RUN apt-get update && apt-get install -y python3-dev python3-pip 
RUN pip3 install boto3
RUN R -e "install.packages(c('readr','plumber', 'reticulate'),dependencies=TRUE, repos='http://cran.rstudio.com/')"

ENV PATH="/opt/ml/code:${PATH}"

WORKDIR /opt/ml/code

COPY ./docker/run.sh /opt/ml/code/run.sh
COPY ./docker/entrypoint.R /opt/ml/entrypoint.R

RUN /bin/bash -c 'chmod +x /opt/ml/code/run.sh'

ENTRYPOINT ["/bin/bash", "run.sh"]

RStudio 内核在 Docker 容器上运行,因此您将无法直接在 Studio 会话中使用 Docker 命令构建和部署容器。 相反,您可以使用非常有用的库 Sagemaker-工作室-图像构建,这实际上将构建容器的任务外包给了 CodeBuild。

使用以下命令,我们创建了两个 Amazon ECR 注册表: sagemaker-r-processingsagemaker-r-train-n-deploy,并构建我们稍后使用的相应容器:

if (!py_module_available("sagemaker-studio-image-build")){py_install("sagemaker-studio-image-build", pip=TRUE)}
system("cd pipeline-example ; sm-docker build . —file ./docker/Dockerfile-train-n-deploy —repository sagemaker-r-train-and-deploy:1.0")
system("cd pipeline-example ; sm-docker build . —file ./docker/Dockerfile-processing —repository sagemaker-r-processing:1.0")

创建管道

现在容器已构建并准备就绪,我们可以创建协调模型构建工作流程的 SageMaker 管道。 完整代码在文件下 pipeline.R 在存储库中。 创建 SageMaker 管道的最简单方法是使用 SageMaker SDK,这是一个 Python 库,我们可以使用该库访问它 网纹. 这使我们无需离开 R 语言环境即可访问 SageMaker 的所有功能。

我们构建的管道具有以下组件:

  • 预处理步骤 – 这是 SageMaker 处理作业(使用 sagemaker-r-processing 容器)负责预处理数据并将数据拆分为训练和测试数据集。
  • 训练步骤 – 这是 SageMaker 培训工作(利用 sagemaker-r-train-n-deploy container) 负责训练模型。 在这个例子中,我们训练了一个简单的线性模型。
  • 评估步骤 – 这是 SageMaker 处理作业(使用 sagemaker-r-processing 容器)负责执行模型的评估。 具体来说,在这个示例中,我们对测试数据集上的 RMSE(均方根误差)感兴趣,我们希望在下一步中使用它并与模型本身相关联。
  • 条件步骤 – 这是 SageMaker 管道原生的条件步骤,允许我们根据某些参数对管道逻辑进行分支。 在这种情况下,管道会根据上一步中计算的 RMSE 值进行分支。
  • 注册模型步骤 – 如果前面的条件步骤是 True,并且模型的性能是可以接受的,则模型在模型注册表中注册。 有关详细信息,请参阅 使用模型注册表注册和部署模型.

首先调用 upsert 函数创建(或更新)管道,然后调用 start 函数实际开始运行管道:

source("pipeline-example/pipeline.R")
my_pipeline <- get_pipeline(input_data_uri=s3_raw_data)

upserted <- my_pipeline$upsert(role_arn=role_arn)
started <- my_pipeline$start()

检查管道和模型注册表

在 SageMaker 上使用 RStudio 的一大好处是,通过在 SageMaker 平台上,您可以使用正确的工具来完成正确的工作,并根据您的需要在它们之间快速切换。

一旦我们开始管道运行,我们就可以切换到 亚马逊SageMaker Studio,这使我们能够可视化管道并监控它的当前和以前的运行。

要查看我们刚刚创建并运行的管道的详细信息,请导航到 Studio IDE 界面,选择 SageMaker资源,选择 管道 在下拉菜单中,然后选择管道(在这种情况下, AbalonePipelineUsingR).

在 Amazon SageMaker PlatoBlockchain Data Intelligence 上使用 RStudio 创建 Amazon SageMaker 模型构建管道并部署 R 模型。 垂直搜索。 哎。

这揭示了管道的详细信息,包括所有当前和以前的运行。 根据以下屏幕截图,选择最新的以显示管道的可视化表示。

管道的 DAG 由服务根据步骤之间的数据依赖关系以及自定义添加的依赖关系(本示例中未添加任何内容)自动创建。

运行完成后,如果成功,您应该会看到所有步骤都变为绿色。

在 Amazon SageMaker PlatoBlockchain Data Intelligence 上使用 RStudio 创建 Amazon SageMaker 模型构建管道并部署 R 模型。 垂直搜索。 哎。

选择任何单个步骤都会显示有关特定步骤的详细信息,包括输入、输出、日志和初始配置设置。 这使您可以深入了解管道并调查任何失败的步骤。

同样,当管道完成运行时,模型将保存在模型注册表中。 要访问它,在 SageMaker资源 窗格中,选择 模型注册 在下拉菜单中选择您的模型。 这将显示已注册模型的列表,如以下屏幕截图所示。 选择一个以打开该特定型号版本的详细信息页面。

在 Amazon SageMaker PlatoBlockchain Data Intelligence 上使用 RStudio 创建 Amazon SageMaker 模型构建管道并部署 R 模型。 垂直搜索。 哎。

打开模型的一个版本后,选择 更新状态批准 批准模型。

此时,根据您的用例,您可以设置此批准以触发进一步的操作,包括根据您的需要部署模型。

模型的无服务器部署

在 SageMaker 上训练和注册模型后,在 SageMaker 上部署模型非常简单。

部署模型的方式有多种选择,例如批量推理、实时端点或异步端点。 每种方法都带有几个必需的配置,包括选择您想要的实例类型以及扩展机制。

对于这个例子,我们使用最近发布的 SageMaker 功能, 无服务器推理 (在撰写本文时处于预览模式),将我们的 R 模型部署在无服务器端点上。 对于这种类型的端点,我们只定义要分配给模型进行推理的 RAM 量,以及模型允许的最大并发调用数。 SageMaker 负责托管模型并根据需要进行自动缩放。 您只需为模型使用的确切秒数和数据付费,无需为空闲时间付费。

您可以使用以下代码将模型部署到无服务器端点:

model_package_arn <- 'ENTER_MODEL_PACKAGE_ARN_HERE'
model <- sagemaker$ModelPackage(
                        role=role_arn, 
                        model_package_arn=model_package_arn, 
                        sagemaker_session=session)
serverless_config <- sagemaker$serverless$ServerlessInferenceConfig(
                        memory_size_in_mb=1024L, 
                        max_concurrency=5L)
model$deploy(serverless_inference_config=serverless_config, 
             endpoint_name="serverless-r-abalone-endpoint")

如果您看到错误 ClientError: An error occurred (ValidationException) when calling the CreateModel operation: Invalid approval status "PendingManualApproval" 您要部署的模型尚未获得批准。 按照上一节中的步骤批准您的模型。

通过向我们部署的 HTTP 端点发送请求来调用端点,或者使用 SageMaker SDK。 在以下代码中,我们在一些测试数据上调用端点:

library(jsonlite)
x = list(features=format_csv(abalone_t[1:3,1:11]))
x = toJSON(x)

# test the endpoint
predictor <- sagemaker$predictor$Predictor(endpoint_name="serverless-r-abalone-endpoint", sagemaker_session=session)
predictor$predict(x)

我们调用的端点是一个无服务器端点,因此我们需要为所使用的确切持续时间和数据付费。 您可能会注意到,第一次调用端点时,它需要大约一秒钟的时间来响应。 这是由于无服务器端点的冷启动时间。 如果您稍后再次调用,模型会实时返回预测,因为它已经很暖和了。

完成对端点的试验后,可以使用以下命令将其删除:

predictor$delete_endpoint(delete_endpoint_config=TRUE)

结论

在这篇文章中,我们介绍了在 RStudio 环境中使用 R 创建 SageMaker 管道的过程,并展示了如何使用 SageMaker 模型注册表在 SageMaker 上的无服务器端点上部署 R 模型。

通过结合使用 RStudio 和 SageMaker,您现在可以使用我们首选的语言 R 在 AWS 上创建和编排完整的端到端 ML 工作流。

要深入了解此解决方案,我建议您查看此解决方案的源代码以及其他示例, GitHub上.


关于作者

在 Amazon SageMaker PlatoBlockchain Data Intelligence 上使用 RStudio 创建 Amazon SageMaker 模型构建管道并部署 R 模型。 垂直搜索。 哎。乔治·席纳斯 是 EMEA 地区的 AI/ML 专家解决方案架构师。 他常驻伦敦,与英国和爱尔兰的客户密切合作。 Georgios 帮助客户在 AWS 上设计和部署机器学习应用程序,特别关注 MLOps 实践,并使客户能够大规模执行机器学习。 在业余时间,他喜欢旅行、烹饪以及与朋友和家人共度时光。

时间戳记:

更多来自 AWS机器学习