写点什么

如何将您的自定义容器镜像导入 Amazon SageMaker Studio Notebooks

  • 2021 年 12 月 24 日
  • 本文字数:8974 字

    阅读完需:约 29 分钟

如何将您的自定义容器镜像导入Amazon SageMaker Studio Notebooks


Amazon SageMaker Studio 是第一套用于机器学习(ML)的全集成开发环境(IDE)。Amazon SageMaker Studio 可帮助数据科学家们快速启动 Studio notebooks 以探索数据、构建模型、启动 Amazon SageMaker 训练作业并部署托管端点。Studio notebooks 中随附一组预构建镜像,这些镜像由 Amazon SageMaker Python SDK 与 IPython 运行时或内核的最新版本构成。凭借此项新功能,您可以轻松将自定义镜像导入 Amazon SageMaker notebooks 当中。在本文中,我们将具体探讨如何将自定义容器镜像导入 Amazon SageMaker notebooks。


  • Amazon SageMaker Studio

https://aws.amazon.com/sagemaker/

  • Amazon SageMaker Python SDK

https://sagemaker.readthedocs.io/en/stable/


开发人员与数据科学家一般需要在以下几种不同用例内使用自定义镜像:


  • 访问流行机器学习框架(包括 TensorFlow、MXNet 以及 PyTorch 等)的特定或最新版本。

  • 将本地开发的自定义代码或算法引入 Studio notebooks 内以进行快速迭代及模型训练。

  • 通过 API 访问数据湖或本地数据存储,且管理员需要在镜像中添加相应驱动程序。

  • 访问后端运行时(也称内核);除 IPython 之外,还有 R、Julia 或其它环境等。您也可以使用本文中概述的方法安装其他自定义内核。


在大型企业中,机器学习平台管理员往往需要保证安全团队预先批准第三方软件包及代码,而非直接通过互联网下载。在常见的工作流示例中,机器学习平台团队会批准一组要使用的软件包与框架,使用这些软件包构建自定义容器、测试容器中的漏洞,而后将核准后的镜像推送至私有容器注册表内,例如 Amazon Elastic Container Registry(Amazon ECR)。现在,机器学习平台团队可以将经过核准的镜像直接附加至 Studio 域内(请参见以下工作流程图)。您只需在 Studio 中选定所需的获准自定义镜像即可。在当前版本中,单一 Studio 域最多可以包含 30 个自定义镜像,您可以根据需求添加新版本或删除镜像。


  • Amazon ECR

https://aws.amazon.com/ecr/



现在,我们将逐步介绍如何使用此项功能将自定义容器镜像导入 Amazon SageMaker Studio notebooks 当中。这里主要演示在互联网上使用时的默认方法,您也可以对其稍加修改以配合 Amazon Virtual Private Cloud(Amazon VPC)进行使用。


  • Amazon VPC

https://aws.amazon.com/vpc/


先决条件


在开始之前,大家需要满足以下先决条件:


  • 亚马逊云科技账户。

  • 确保用于访问 Amazon SageMaker 的角色拥有以下 Amazon Web Services 身份与访问管理(IAM)权限,使 Amazon SageMaker Studio 能够在 Amazon ECR 中以 smstudio 为前缀创建一个 repo,并面向此 repo 进行镜像推送与提取。要使用现有 repo,请将其中的 Resource 部分替换为您的 repo ARN。要构建容器镜像,您可以使用本地 Docker 客户端,或者直接在 Amazon SageMaker Studio 中创建镜像。本文采用后一种方法。要在 Amazon ECR 内创建 repo,Amazon SageMaker Studio 需要使用 Amazon CodeBuild;


  • Amazon CodeBuild:

https://aws.amazon.com/codebuild/


您还需要拥有使用 Amazon CodeBuild 的权限,具体如下所示。


{            "Effect": "Allow",            "Action": [                "ecr:CreateRepository",                "ecr:BatchGetImage",                "ecr:CompleteLayerUpload",                "ecr:DescribeImages",                "ecr:DescribeRepositories",                "ecr:UploadLayerPart",                "ecr:ListImages",                "ecr:InitiateLayerUpload",                "ecr:BatchCheckLayerAvailability",                "ecr:GetDownloadUrlForLayer",                "ecr:PutImage"            ],            "Resource": "arn:aws:ecr:*:*:repository/smstudio*"        },        {            "Effect": "Allow",            "Action": "ecr:GetAuthorizationToken",            "Resource": "*"           }{            "Effect": "Allow",            "Action": [                "codebuild:DeleteProject",                "codebuild:CreateProject",                "codebuild:BatchGetBuilds",                "codebuild:StartBuild"            ],            "Resource": "arn:aws:codebuild:*:*:project/sagemaker-studio*"}{            "Effect": "Allow",            "Action": "iam:PassRole",            "Resource": "arn:aws:iam::*:role/*",            "Condition": {                "StringLikeIfExists": {                    "iam:PassedToService": "codebuild.amazonaws.com"                }            }}
复制代码

左右滑动查看更多


您的 Amazon SageMaker 角色还应在 Amazon CodeBuild 中拥有信任策略,具体如下所示。关于更多详细信息,请参阅使用 Amazon SageMaker Studio 镜像构建 Amazon CLI 在 Studio notebooks 中构建容器镜像


  • 使用 Amazon SageMaker Studio 镜像构建 Amazon CLI 在 Studio notebooks 中构建容器镜像:

https://aws.amazon.com/blogs/machine-learning/using-the-amazon-sagemaker-studio-image-build-cli-to-build-container-images-from-your-studio-notebooks/


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


在您的本地机器上安装 Amazon Web Services 命令行界面(Amazon CLI)。关于详尽操作说明,请参阅安装 Amazon Web Services


  • 安装 Amazon Web Services:

https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html


准备一个 Amazon SageMaker Studio 域。要创建此域,请使用 CreateDomain API 或者 create-domain CLI 命令。


  • CreateDomain API: 

https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateDomain.html


  • create-domain CLI:

https://docs.aws.amazon.com/cli/latest/reference/sagemaker/create-domain.html


如果您希望使用自有 Amazon VPC 以安全引入自定义容器,则需要完成以下操作:


  • 带有专有子网的 Amazon VPC。


  • 用于以下服务的 Amazon VPC 端点:

Amazon Simple Storage Service (Amazon S3)

https://aws.amazon.com/s3/

Amazon SageMaker

Amazon ECR

Amazon Security Token Service (Amazon STS)

https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html

用于构建 Docker 容器的 Amazon CodeBuild


要设置上述资源,请参阅使用专用 Amazon VPC 保护 Amazon SageMaker Studio 连接以及相关 GitHub repo


  • 专用 Amazon VPC 保护 Amazon SageMaker Studio 连接:

https://aws.amazon.com/blogs/machine-learning/securing-amazon-sagemaker-studio-connectivity-using-a-private-vpc/

  • GitHub repo:

https://github.com/aws-samples/amazon-sagemaker-studio-vpc-blog


创建 Amazon Dockerfile


为了体现数据科学家使用最新框架进行试验的普遍性需求,我们在本次演练中使用以下 Amazon Dockerfile,其选择最新的 TensorFlow 2.3 版本作为基础镜像。您也可以使用自己指定的 Amazon Dockerfile 进行替换。目前,Amazon SageMaker Studio 已经能够支持多种基础镜像,例如 Ubuntu、Amazon Linux 2 等等。Amazon Dockerfile 将安装运行 Juypter notebooks 所需要的 IPython 运行时,同时安装 Amazon SageMaker Python SDK 与 boto3。


除了笔记本电脑之外,除了 notebooks 之外,数据科学家与机器学习工程师们还经常使用各种流行 IDE(例如 Visual Studio Code 或者 PyÇharm)在本地 notebooks 上进行迭代与试验。您可能希望将这些脚本引入云端,借此进行扩展化训练或数据处理。您可以将这些脚本打包进 Docker 容器之内,并在 Amazon SageMaker Studio 的本地存储中查看。在以下 Amazon Dockerfile 中,我们复制的 train.py 脚本是一套用于在 MNIST 数据集上训练简单深度学习模型的基础脚本。您也可以使用自己的脚本或包含代码的软件包替换此脚本:


FROM tensorflow/tensorflow:2.3.0RUN apt-get update RUN apt-get install -y gitRUN pip install --upgrade pipRUN pip install ipykernel && \    python -m ipykernel install --sys-prefix && \    pip install --quiet --no-cache-dir \    'boto3>1.0<2.0' \    'sagemaker>2.0<3.0'
复制代码

左右滑动查看更多


COPY train.py /root/train.py #可以替换为您的自定义脚本或软件包


以下代码为 train.py 脚本:


import tensorflow as tfimport os 
mnist = tf.keras.datasets.mnist(x_train, y_train), (x_test, y_test) = mnist.load_data()x_train, x_test = x_train / 255.0, x_test / 255.0
model = tf.keras.models.Sequential([  tf.keras.layers.Flatten(input_shape=(28, 28)),  tf.keras.layers.Dense(128, activation='relu'),  tf.keras.layers.Dropout(0.2),  tf.keras.layers.Dense(10, activation='softmax')])model.compile(optimizer='adam',              loss='sparse_categorical_crossentropy',              metrics=['accuracy'])model.fit(x_train, y_train, epochs=1)model.evaluate(x_test, y_test)
复制代码

左右滑动查看更多


除了自定义脚本之外,您也可以添加其他文件,例如可通过 Amazon Secrets Manager Amazon Systems Manager Parameter Store 访问客户端 secrets 以及环境变量的 Python 文件、用于连接私有 PyPi repo 的 config 文件、或者其他软件包管理工具。您也可以使用自定义镜像复制脚本,但在这种情况下,Amazon Dockerfile 中的一切 Entrypoint 或 CMD 命令均无法运行。


  • Amazon Secrets Manager:

https://aws.amazon.com/secrets-manager/

  • Amazon Systems Manager Parameter Store:

https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html


设置安装文件夹


您需要在本地机器上创建一个文件夹,并向其中添加以下文件:


  • 在上一步中创建完成的 Amazon Dockerfile。

  • 名为 app-image-config-input.json 的文件,具体内容如下:


"AppImageConfigName": "custom-tf2",    "KernelGatewayImageConfig": {        "KernelSpecs": [            {                "Name": "python3",                "DisplayName": "Python 3"            }        ],        "FileSystemConfig": {            "MountPath": "/root/data",            "DefaultUid": 0,            "DefaultGid": 0        }    }}
复制代码


我们将此 Amazon Dockerfile 的后端内核设置为 IPython 内核,并提供指向 Amazon Elastic File System(Amazon EFS)的挂载路径。Amazon SageMaker 可以识别出 Juypter 定义的内核。例如,对于 R 内核,您可以将之前代码中的 Name 部分设置为 ir。请注意保证其中的 Uid、Gid 以及内核名称与 Docker 镜像中的 kernelspecs 及用户信息相匹配。要获取这些值,请参阅本文档


  • Amazon Elastic File System

https://aws.amazon.com/efs/

  • 文档

https://github.com/aws-samples/sagemaker-studio-custom-image-samples/blob/main/DEVELOPMENT.md


  • 使用以下内容创建一个名为 default-user-settings.json 的文件。如果您需要添加多个自定义镜像,请直接将其添加至 CustomImages 列表。


{  "DefaultUserSettings": {    "KernelGatewayAppSettings": {      "CustomImages": [          {                   "ImageName": "tf2kernel",                   "AppImageConfigName": "custom-tf2"                }            ]        }    }}
复制代码

左右滑动查看更多


创建镜像并将其附加至您的 Studio 域


如果您已经拥有现成的域,则直接使用新镜像进行更新即可。在本节中,我们将演示现有 Studio 用户如何进行镜像附加。关于启动新用户的说明,请参阅使用 IAM 登入 Amazon SageMaker Studio


  • 使用 IAM 登入 Amazon SageMaker Studio

https://docs.aws.amazon.com/sagemaker/latest/dg/onboard-iam.html


首先,我们使用 Amazon SageMaker Studio Docker 构建 Amazon CLI 构建 Amazon Dockerfile,并将其推送至 Amazon ECR。请注意,您也可以使用其他方法将容器推送至 Amazon ECR,例如通过本地 Docker 客户端以及 Aamzon CLI。


  • 使用您的用户信息登录至 Studio。

  • 将您的 Amazon Dockerfile、以及其他需要复制到容器当中的代码或依赖项上传至 Studio 域。

  • 导航至包含 Amazon Dockerfile 的文件夹。

  • 在终端窗口或 notebook 内 —>


!pip install sagemaker-studio-image-build
复制代码


  • 导出一个名为 IMAGE_NAME 的变量,并将其设定为您在 default-user-settings.json 当中所指定的值。

sm-docker build . –repository smstudio-custom:IMAGE_NAME


  • 如果要使用其他 repo,请将以上代码中的 smstudio-custom 替换为您的 repo 名称。


Amazon SageMaker Studio 将为您构建 Docker 镜像,将该镜像推送至 Amazon ECR 当中一个名为 smstudio-custom 的 repo 内,并为其标记适当的镜像名称。要进一步自定义此项功能(例如提供详细的文件路径或其他选项),请参阅使用 Amazon SageMaker Studio 镜像构建 Amazon CLI 在 Studio notebooks 中构建容器镜像。要让以上 pip 命令在专用 Amazon VPC 环境下起效,您需要设置互联网路由或访问专用 repo 内的相应软件包。

  • 使用 Amazon SageMaker Studio 镜像构建 Amazon CLI 在 Studio notebooks 中构建容器镜像

https://aws.amazon.com/blogs/machine-learning/using-the-amazon-sagemaker-studio-image-build-cli-to-build-container-images-from-your-studio-notebooks/

  • 在之前的安装文件夹中,创建一个名为 create-and-update-image.sh 的新文件:


ACCOUNT_ID=AWS ACCT ID # 替换为您的AWS账户IDREGION=us-east-2 # 替换为您的区域DOMAINID=d-####### # 替换为您的SageMaker Studio域名称IMAGE_NAME=tf2kernel # 替换为您的镜像名称
# 使用Amazon SageMaker Studio## 使用ECR中的镜像创建SageMaker镜像(根据需求修改镜像名称)ROLE_ARN='The Execution Role ARN for the execution role you want to use'
aws --region ${REGION} sagemaker create-image \    --image-name ${IMAGE_NAME} \    --role-arn ${ROLE_ARN}
aws --region ${REGION} sagemaker create-image-version \    --image-name ${IMAGE_NAME} \    --base-image "${ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com/smstudio-custom:${IMAGE_NAME}"
## 为此镜像创建AppImageConfig(根据需要修改app-image-config-input.json中的AppImageConfigName与KernelSpecs参数)aws --region ${REGION} sagemaker create-app-image-config --cli-input-json file://app-image-config-input.json
## 提供镜像与AppImageConfig以更新此域aws --region ${REGION} sagemaker update-domain --domain-id ${DOMAINID} --cli-input-json file://default-user-settings.json
复制代码

左右滑动查看更多


请参阅 Amazon CLI 以了解可在 create-image API 中使用的各项参数的详细信息。要检查当前状态,请导航至您的 Amazon SageMaker 控制台,并在导航面板中选择 Amazon SageMaker Studio。


使用 Studio UI 附加镜像


您也可以通过 UI 完成将镜像附加至 Studio 域的最后一步。在此用例中,UI 将处理镜像与镜像版本的创建操作,并使用附加的镜像完成域更新。


  • 在 Amazon SageMaker 控制台上,选择 Amazon SageMaker Studio。


在 Control Panel 页面上,可以看到已经置备完成的 Studio 域以及您所创建的所有用户配置。


  • 选择 Attach image



  • 选择要附加新镜像,还是附加原有镜像。

a. 如果您选择 Existing image,请从 Amazon SageMaker 镜像库中选择一个镜像。

b. 如果您选择 New image,请提供 Docker 镜像的 Amazon ECR 注册表路径。此路径需要与 Studio 域处于同一区域内。Amazon ECR repo 还需要与您的 Studio 域处于同一账户内;如果需要跨账户操作,则 Studio 必须具备相应权限。


  • 选择 Next。



  • Image name 部分,输入名称。

  • Image display name 部分,输入描述性名称。

  • Description 部分,输入标签定义。

  • 在 IAM role 部分,选择 Amazon SageMaker 用于向 Amazon SageMaker 镜像附加 Amazon ECR 镜像的 IAM 角色。

  • 此外,您也可以对镜像做出其他标记。

  • 选择 Next。



  • 在 Kernel name 部分,输入 Python 3。

  • 选择 Submit



绿色复选框代表镜像已被成功附加至域内。



Amazon SageMaker 镜像存储将自动对镜像进行版本控制。您可以选择一个预先附加的镜像,而后选择 Detach 以分离该镜像及所有相关版本,或者选择 Attach image 以附加新版本。各镜像的版本数量或分离镜像的功能不受限制。


自定义镜像用户体验


下面,我们尝试 Studio 的实际用户体验。

  • 使用您的用户资料登录至 Studio。

  • 要启动新活动,请选择 Launcher。

  • Select a Amazon SageMaker image to launch your activity 部分,选择 tf2kernel。



  • 选择 Notebook 图标,使用自定义内核打开一个新 notebook。


Notebook 内核需要几分钟才能启动完成,之后即可开始使用!


在 Notebook 中测试您的自定义容器


在内核启动并开始运行之后,您即可在 notebook 中运行代码。首先,我们测试 Amazon Dockerfile 中指定的 TensorFlow 是否为正确版本。在以下截屏中,可以看到我们刚刚创建的 notebook 正在使用 tf2kernel。



Amazon SageMaker notebooks 还会显示本地 CPU 与内存使用量。


接下来,我们直接在 notebook 中使用自定义训练脚本。将训练脚本复制到 notebook 单元中并运行。此脚本会从 tf.keras.datasets 处下载 mnist 数据集,并将数据拆分为训练数据集与测试数据集,自定义一项定制化深度神经网络算法,在训练数据集上训练算法,并在测试数据集上测试算法。



要尝试使用 TensorFlow 2.3 框架,大家可能希望测试新发布的 API,例如 Keras 中提供的预处理实用程序等新功能。在以下截屏中,我们导入了随 TensorFlow 2.3 版本发布的 keras.layers.experimental 库,其中包含用于数据预处理的新 API。我们加载其中一个 API,而后在 notebook 中重新运行脚本。



Amazon SageMaker 还能够在代码运行过程中动态修改 CPU 与内存使用率。通过引入自定义容器与训练脚本,此功能使您能够直接在 Amazon SageMaker notebook 中尝试自定义训练脚本与算法。如果您对 Studio notebook 中的试验结果感到满意,则可立即启动训练作业。


Docker file 中所包含的、使用 COPY 命令的 Python 文件或其他自定义文件运行情况如何?Amazon SageMaker Studio 会挂载 app-image-config-input.json 所提供的文件路径中的弹性文件系统,在本示例中我们将其设定为 root/data。为了避免 Studio 覆盖掉需要包含的自定义文件,COPY 命令会将 train.py 文件加载至路径/root 当中。要访问此文件,请打开终端或 notebook 并运行以下代码:


! cat /root/train.py
复制代码


这时您应看到以下截屏所示的输出结果。



可以看到 train.py 文件位于指定位置。


Amazon CloudWatch 中的日志记录


Amazon SageMaker Studio 还会将内核指标发布至 Amazon CloudWatch 供您进行故障排查。这些指标将被捕捉至/aws/sagemaker/studio 命名空间之内。


要访问日志,请在 Amazon CloudWatch 控制台上选择 Amazon CloudWatch Logs。在 Log groups 页面中,输入命名空间以查看与 Jupyter 服务器及内核网关相关的日志记录。



分离镜像或版本


您可以从域中分离镜像或特定镜像版本。


要分离镜像及其全部版本,请在 Custom images attached to domain 表内选定该镜像,而后选择 Detach。



您还可以选择删除镜像及所有版本,这不会影响到 Amazon ECR 中的镜像。



要分离镜像的特定版本,请选定该镜像。在 Image details 页面上,从 Image versions attached to domain 表中选择目标镜像版本(一个或者多个版本),而后选择 Detach。您会看到如上所示的警告及操作选项。


总结


Amazon SageMaker Studio 使您能够更轻松地对机器学习模型进行协作、实验、训练及部署。在这之前,数据科学家往往需要通过公共及私有代码 repo 以及软件包管理工具才能访问最新机器学习框架、自定义脚本以及软件包。现在,您可以将所有相关代码打包进自定义镜像之内,并使用 Studio notebook 启动这些镜像。这些镜像可供 Studio 域内的所有用户使用。您也可以使用此项功能使用 Python 之外的其他流行语言及运行时,包括 R、Julia 以及 Scala 等。您可以在 GitHub repo 中找到示例文件。关于此项功能的更多详细信息,请参阅自带 Amazon SageMaker 镜像


  • GitHub repo

https://github.com/aws-samples/sagemaker-studio-custom-image-samples

  • 自带 Amazon SageMaker 镜像

https://docs.aws.amazon.com/sagemaker/latest/dg/studio-byoi.html


本篇作者


Stefan Natu

亚马逊云科技公司高级机器学习专家

致力于帮助金融服务客户在亚马逊云科技上构建端到端机器学习解决方案。在业余时间,他喜欢阅读机器学习技术博客、演奏吉他和探索纽约当地的各种美食。


Jaipreet Singh

Amazon SageMaker Studio 团队高级软件工程师

自 2017 年立项以来就一直从事 Amazon SageMaker 的开发工作,并为多个 Jupyter 开源项目做出贡献。业余时间,他喜欢远足和滑雪。


Huong Nguyen

亚马逊云科技公司高级产品经理

负责 Amazon SageMaker Studio 的用户体验工作。她在企业级及消费级领域拥有 13 年客户体验与数据驱动产品开发经验。在业余时间,她喜欢读书、享受自然风光和陪伴家人。


用户头像

还未添加个人签名 2019.09.17 加入

还未添加个人简介

评论

发布
暂无评论
如何将您的自定义容器镜像导入Amazon SageMaker Studio Notebooks