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-processing
和 sagemaker-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
).
这揭示了管道的详细信息,包括所有当前和以前的运行。 根据以下屏幕截图,选择最新的以显示管道的可视化表示。
管道的 DAG 由服务根据步骤之间的数据依赖关系以及自定义添加的依赖关系(本示例中未添加任何内容)自动创建。
运行完成后,如果成功,您应该会看到所有步骤都变为绿色。
选择任何单个步骤都会显示有关特定步骤的详细信息,包括输入、输出、日志和初始配置设置。 这使您可以深入了解管道并调查任何失败的步骤。
同样,当管道完成运行时,模型将保存在模型注册表中。 要访问它,在 SageMaker资源 窗格中,选择 模型注册 在下拉菜单中选择您的模型。 这将显示已注册模型的列表,如以下屏幕截图所示。 选择一个以打开该特定型号版本的详细信息页面。
打开模型的一个版本后,选择 更新状态 和 批准 批准模型。
此时,根据您的用例,您可以设置此批准以触发进一步的操作,包括根据您的需要部署模型。
模型的无服务器部署
在 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上.
关于作者
乔治·席纳斯 是 EMEA 地区的 AI/ML 专家解决方案架构师。 他常驻伦敦,与英国和爱尔兰的客户密切合作。 Georgios 帮助客户在 AWS 上设计和部署机器学习应用程序,特别关注 MLOps 实践,并使客户能够大规模执行机器学习。 在业余时间,他喜欢旅行、烹饪以及与朋友和家人共度时光。