亚马逊AWS官方博客

基于 Amazon SageMaker 创建一套持久的定制化 R 环境

Original URL: https://aws.amazon.com/cn/blogs/machine-learning/creating-a-persistent-custom-r-environment-for-amazon-sagemaker/

Amazon SageMaker是一项全托管服务,可帮助您快速构建、训练以及部署机器学习(ML)模型。Amazon SageMaker消除了机器学习流程各步骤所涉及的繁重工作,极大降低了高质量模型的开发门槛。2019年8月,Amazon SageMaker宣布在全球各服务区域预装R内核。此项功能为开箱即用,同时预安装有reticulate库。该库负责为Amazon SageMaker Python SDK提供R接口,允许您直接从R脚本中调用Python模块。

本文讨论了如何在内置R内核之上,通过Amazon SageMaker创建自定义R环境(内核),以及如何在会话之间实现环境持久化。本文还解释了如何在R环境中安培新的软件包,如何在Amazon Simple Storage Service (Amazon S3)上保存这套新环境,以及如何使用它通过Amazon SageMaker生命周期配置创建新的Amazon SageMaker实例。本文也提供相应bash脚本,供您在创建或启动Amazon SageMaker notebook实例时配置生命周期。

背景介绍

Amazon SageMaker中的R内核以IRKernel 软件包构建而成,该软件包将在Jupyter环境中安装名为 ir且显示名称R的内核。

您可以使用Conda管理这套环境,并安装特定的软件包与依赖项。但在默认情况下,从notebook实例处安装的R内核无法持久至其他notebooke实例的会话当中。每当启动及停止Amazon SageMaker实例时,R内核都会返回其默认环境。

本文将引导大家使用以下资源在Amazon SageMaker中安装R软件包:

  • Anaconda Cloud
  • CRAN
  • Github

在环境创建完成之后,您可以将其保存在实例的Amazon Elastic Block Store (Amazon EBS)存储当中以实现持久化。您也可以将该环境存储在Amazon S3上,并使用它为新的Amazon SageMaker实例构建自定义R环境。关于更多详细信息,请参阅使用生命周期配置脚本定制notebook实例

创建一个基于R内核的Amazon SageMaker notebook实例

要创建一个基于R内核的Amazon SageMaker notebook实例,请完成以下操作步骤:

在打开新的notebook后,我们将在notebook区域的右上角看到R徽标。

关于创建基于R内核的Amazon SageMaker notebook实例的更多详细信息,请参阅在Amazon SageMaker notebook实例上使用R代码

在Amazon SageMaker 的R内核中安装软件包

Amazon SageMaker R内核提供超过140种标准软件包。要获取已安装软件包的清单,您可以在配合R内核的SageMaker notebook中运行以下脚本:

installed.packages()

如果您需要安装其他软件包,则可以通过Anaconda Cloud、CRAN归档或者直接通过GitHub进行安装。

通过Anaconda Cloud安装

R软件包的首选安装方法,是从Anaconda Cloud存储库进行安装。您可以通过这种方式访问不同的通道(例如R与Conda Forge),从而安装软件包的特定版本。如果您使用R内核在Amazon SageMaker中执行此项操作,请使用system() 命令以提交conda install命令。

如果大家是在Amazon SageMaker Jupyter bash终端上进行安装,则可使用conda install,如下所示:

conda install -n R -c conda-forge r-rjava

但在Amazon SageMaker中,请输入以下代码:

system("conda install -n R -c conda-forge r-rjava")

上述代码使用conda-forge 通道,此通道负责安装rJava的0.9_12版本(截至本文发布之时)。但如果您使用以下代码(使用r channel),则其将安装0.9_11版本(截至本文发布之时):

system("conda install -n R -c r r-rjava")

要搜索特定软件包名称并为您的版本选择正确的通道,请访问Anaconda Cloud网站并搜索对应软件包。R软件包的命名格式为“r-<package_name>”。

Conda是安装软件包的首选方法,而Anaconda Cloud则凭借接入Conda环境最稳定版本的取向成为最佳归档选项。

通过CRAN归档安装

作为Anaconda的替代方案,大家也可以使用综合R归档网络(CRAN)归档完成安装。CRAN归档是一套由FTP与Web服务器组成的网络,分布于世界各地,其中保存有相同的R代码以及说明文档的最新版本。您可以使用此归档文件通过install.packages()在R中安装软件包,以保证安装的是软件包的最新版本。具体参见以下代码:

install.packages(c('mlbench', 'MVar'),
      repo = 'http://cran.rstudio.com',
      dependencies = TRUE)

使用以下代码将该软件包导入您的R代码:

library(mlbench)

Amazon SageMaker实例使用Amazon Linux AMI,这是一套从与CentOS演变而来的发行版,可用于在Amazon Elastic Compute Cloud (Amazon EC2)实例当中运行Amazon SageMaker。如果您打算直接通过源代码安装软件包,请保证选择正确的操作系统。大家可以在Amazon SageMaker Jupyter bash终端中使用以下脚本检查操作系统:

sh-4.2$ cat /etc/os-release

输出结果如下所示(截至本文发布之时):

NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL=http://aws.amazon.com/amazon-linux-ami/

通过 Github安装

您还可以使用devtoolsinstall_github直接从软件包开发者的库中获取内容。具体参见以下代码:

install.packages("devtools")
devtools::install_github("malcolmbarrett/ggdag")

上述代码将安装软件包及其依赖项。但请注意,我们不推荐您将此作为Amazon SageMaker当中的首选软件包安装方法。

在不同会话间实现自定义R环境持久化

在默认情况下,每当您停止及启动Amazon SageMaker实例时,Amazon SageMaker都会启动基础R内核。而在停止实例时,您所安装的所有其他软件包都将丢失,且再次启动实例时又需要重新安装各软件包——很明显,这种方式既费时又麻烦。解决方案是将环境保存在实例的EBS存储之上,并在启动时使用Amazon SageMaker生命周期配置脚本将EBS存储与自定义R内核相对接。关于更多说给诈,请参阅使用生命周期配置脚本实现notebook实例定制化

本节将概述实现自定义R环境持久化的各个操作步骤。

将环境保存在Amazon SageMaker EBS之上

大家首先需要通过环境克隆操作,将当前环境保存在实例的EBS存储之上。您可以在Amazon Sagemaker Jupyter bash终端中运行以下脚本:

conda create --prefix /home/ec2-user/SageMaker/envs/custom-r --clone R

这将在您有权访问的实例EBS上的Amazon SageMaker文件夹下创建一个envs/custom-r 文件夹,具体参见以下截屏内容。

如果您希望稍后在同一Amazon SageMaker实例(注意,并非在其他不同实例中)中使用这套自定义环境,则可跳过生命周期配置部分内容,直接前往本文中的使用自定义R环境启动实例部分。

在Amazon S3中保存环境以创建新的Amazon SageMaker实例

如果需要在创建Amazon SageMaker实例时重复使用同一套自定义R环境(例如在您的开发团队内部),大家可以将该环境以.zip文件形式保存至Amazon S3,并在Create步骤中将其下载至实例当中。您可以在Amazon SageMaker Juypyter bash终端内运行以下脚本:

zip -r ~/SageMaker/custom_r.zip ~/SageMaker/envs/
aws s3 cp ~/SageMaker/custom_r.zip s3://[YOUR BUCKET]/

通过生命周期配置,使用自定义R环境创建新实例

要创建新实例,并在该实例中使用已有的自定义环境,大家需要将.zip环境从Amazon S3引入当前实例。您可以使用生命周期配置脚本在Amazon SageMaker控制台上自动执行此项操作。该脚本将.zip文件从Amazon S3下载至实例EBS上的/SageMaker/文件夹当中、解压该文件、重新创建/envs/文件夹,而后删除冗余文件夹。

  • 在Amazon SageMaker控制台的Notebook之下,选择Lifecycle configurations。
  • 选择Create Configuration
  • 将其命名为Custom-R-Env
  • Create notebook选项卡中,输入以下脚本。
## On-Create: Bringing custom environment from S3 to SageMaker instance
## NOTE: Your SageMaker IAM role should have access to this bucket

#!/bin/bash    
sudo -u ec2-user -i <<'EOF'
aws s3 cp s3://[YOUR BUCKET]/custom_r.zip ~/SageMaker/
unzip ~/SageMaker/custom_r.zip -d ~/SageMaker/
mv ~/SageMaker/home/ec2-user/SageMaker/envs/ ~/SageMaker/envs
rm -rf ~/SageMaker/home/
rm ~/SageMaker/custom_r.zip
EOF

  • 点击Create Configuration

通过生命周期配置,使用自定义R环境启动实例

无论是在同一实例中创建自定义R环境并将其克隆至./envs/文件夹,还是在创建实例时从Amazon S3上下载.zip文件,此步骤的具体操作都完全相同。

此脚本将在./evns/文件夹(其中包含自定义R环境)与Anaconda Custom-R-Env环境之间创建一个链接,从而在Amazon SageMaker内核中列出该环境。

  • 在Amazon SageMaker控制台的Notebook下,选择Lifecycle configurations。
  • 选择Create Configuration
  • 将其命名为 Custom-R-Env (如果您已经在之前的步骤中创建了该配置,则可直接从列表中选定配置并选择Edit)。
  • Start notebook选项卡上,输入以下脚本:
## On-Start: After you set up the environment in the instance
## then you can have this life-cycle config to link the custom env with kernel

#!/bin/bash    
sudo -u ec2-user -i <<'EOF'    
ln -s /home/ec2-user/SageMaker/envs/custom-r /home/ec2-user/anaconda3/envs/custom-r
EOF
echo "Restarting the Jupyter server..."
restart jupyter-server

  • 点击Create Configuration (如果要编辑现有配置,则点击Update)。

将生命周期配置指定给Amazon SageMaker实例

在创建notebook实例时,您可以为其指定生命周期配置。关于更多详细信息,请参阅使用生命周期配置脚本定制notebook实例

要使用您的生命周期配置(Custom-R-Env)创建一个notebook,大家需要在Additional Configuration 部分将该脚本指定给当前notebook。其他操作步骤与创建常规Amazon SageMaker实例相同。

使用自定义R环境

在打开创建该自定义环境的现有实例时,您会看到各相关文件、代码以及/envs/文件夹已经存在。

但如果您创建了一个新实例,并使用生命周期脚本从Amazon S3处提取该环境,则需要完成以下操作步骤:

  • 当您的实例状态显示为In Service时,打开Jupyter。大家可以看到Amazon SageMaker文件中存在一个/envs/文件夹,这就是您的自定义环境。
  • New下拉菜单当中,选择conda_r_custom-r


现在,我们已经拥有一个包含自定义R环境的notebook。在此notebook中,我们会在Jupyter环境的右上角看到R徽标,这代表当前内核为R内核,内核名称应为conda_r_custom-r。要测试这套环境,请导入自定义环境中包含的某一套库(例如rJava)。

library(rJava)

现在,您的自定义R环境已经启动并在实例中正常运行,您可以使用reticulate 软件包在R中进行编程了。

结论

本文引导大家为Amazon SageMaker notebook实例创建自定义持久R环境。关于Amazon SageMaker上的R notebooks,请参阅Amazon SageMaker示例GitHub repo。关于创建基于R内核的Amazon SageMaker notebook实例的更多详细信息,请参考在Amazon SageMaker notebook实例上使用R代码博文。关于如何通过R使用Amazon SageMaker更多功能的详细信息,请访问Amazon SageMaker R用户指南。此外,您可以参考AWS机器学习博客获取关于Amazon SageMaker的更多专业扩展资源。

本篇作者

Nick Minaie

人工智能与机器学习(AI/ML)专业解决方案架构师,负责帮助客户开发完善的规模化机器学习解决方案。在业余时间,Nick喜欢抽象绘画及探索大自然。