使用亚马逊 SageMaker JupyterLab 扩展程序在任何 JupyterLab 环境中安排笔记本电脑

Jupyter 笔记本电脑因能够以交互方式处理数据、构建 ML 模型以及通过推断数据来测试这些模型而受到数据科学家的高度青睐。但是,在某些情况下,数据科学家可能更愿意从笔记本电脑上的交互式开发过渡到批处理作业。此类用例的示例包括扩展先前在小型笔记本实例上的小型样本数据集上测试过的功能工程作业,运行夜间报告以深入了解业务指标,以及在新数据可用时按计划重新训练机器学习模型。

从笔记本上的交互式开发迁移到批处理作业需要将代码片段从笔记本复制到脚本中,将脚本及其所有依赖项打包到容器中,然后安排容器运行。要按计划重复运行此作业,您必须设置、配置和监督云基础架构以实现部署自动化,从而将宝贵的时间从核心数据科学开发活动中转移出来。

为了帮助简化从交互式笔记本迁移到批处理作业的流程,2022 年 12 月, 亚马逊 SageMaker Studio 和 St udio La b 推出了使用基于笔记本的工作流程将笔记本按计划作业运行的功能。现在,你可以使用同样的功能在任何 JupyterLab 环境中运行 Jupyter 笔记本电脑,例如在本地计算机上运行的 Amazon SageMaker 笔记本电脑实例和 Jupyter La b。SageMaker 提供了一个开源扩展,可以安装在任何 JupyterLab 环境中,并用于将笔记本作为临时作业按计划运行。

在这篇文章中,我们将向您展示如何在本地 JupyterLab 环境中按计划在 SageMaker 上运行笔记本作业。

解决方案概述

下图显示了在任何 JupyterLab 环境中调度笔记本作业的解决方案架构。SageMaker 扩展程序希望 JupyterLab 环境具有有效的 亚马逊云科技 证书和权限来安排笔记本任务。我们将在本文后面讨论设置证书和 亚马逊云科技 身份和访问管理 (IAM) 权限的步骤。除了 IAM 用户和代入角色会话安排任务外,您还需要为笔记本任务实例提供一个角色,让其代入访问您在 亚马逊简单存储服务 (Amazon S3) 中的数据或根据需要连接到 Amazon EMR 集群。

在以下部分中,我们将介绍如何设置架构和安装开源扩展,如何使用默认配置运行笔记本电脑,以及如何使用高级参数运行具有自定义设置的笔记本电脑。

先决条件

在这篇文章中,我们假设使用本地托管的 JupyterLab 环境。对于托管在云中的环境,您也可以遵循相同的安装步骤。

以下步骤假设你已经有一个有效的 Python 3 和 JupyterLab 环境(此扩展程序适用于 JupyterLab v3.0 或更高版本)。

如果您尚未安装 亚马逊云科技 命令行接口 (亚马逊云科技 CLI),请安装它。有关说明 ,请参阅 安装或更新 亚马逊云科技 CLI 的最新版本

设置 IAM 证书

您需要一个 IAM 用户或一个活跃的 IAM 角色会话才能提交 SageMaker 笔记本任务。要设置您的 IAM 证书,您可以使用您的 IAM 用户的 亚马逊云科技 证书配置 亚马逊云科技 CLI,或者代入 IAM 角色。有关设置证书的说明,请参阅 配置 亚马逊云科技 CLI 。IAM 委托人(用户或代入角色)需要以下权限才能安排笔记本作业。要将策略添加到您的委托人,请参阅 添加 IAM 身份权限

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "EventBridgeSchedule",
            "Effect": "Allow",
            "Action": [
                "events:TagResource",
                "events:DeleteRule",
                "events:PutTargets",
                "events:DescribeRule",
                "events:EnableRule",
                "events:PutRule",
                "events:RemoveTargets",
                "events:DisableRule"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/sagemaker:is-scheduling-notebook-job": "true"
                }
            }
        },
        {
            "Sid": "IAMPassRoleToNotebookJob",
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::*:role/SagemakerJupyterScheduler*",
            "Condition": {
                "StringLike": {
                    "iam:PassedToService": [
                        "sagemaker.amazonaws.com",
                        "events.amazonaws.com"
                    ]
                }
            }
        },
        {
            "Sid": "IAMListRoles",
            "Effect": "Allow",
            "Action": "iam:ListRoles",
            "Resource": "*" 
        },
        {
            "Sid": "S3ArtifactsAccess",
            "Effect": "Allow",
            "Action": [
                "s3:PutEncryptionConfiguration",
                "s3:CreateBucket",
                "s3:PutBucketVersioning",
                "s3:ListBucket",
                "s3:PutObject",
                "s3:GetObject",
                "s3:GetEncryptionConfiguration",
                "s3:DeleteObject",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::sagemaker-automated-execution-*"
            ]
        },
        {
            "Sid": "S3DriverAccess",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:GetObject",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::sagemakerheadlessexecution-*"
            ]
        },
        {
            "Sid": "SagemakerJobs",
            "Effect": "Allow",
            "Action": [
                "sagemaker:DescribeTrainingJob",
                "sagemaker:StopTrainingJob",
                "sagemaker:DescribePipeline",
                "sagemaker:CreateTrainingJob",
                "sagemaker:DeletePipeline",
                "sagemaker:CreatePipeline"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/sagemaker:is-scheduling-notebook-job": "true"
                }
            }
        },
         {
            "Sid": "AllowSearch",
            "Effect": "Allow",
            "Action": "sagemaker:Search",
            "Resource": "*"
        },
         {
            "Sid": "SagemakerTags",
            "Effect": "Allow",
            "Action": [
                "sagemaker:ListTags",
                "sagemaker:AddTags"
            ],
            "Resource": [
                "arn:aws:sagemaker:*:*:pipeline/*",
                "arn:aws:sagemaker:*:*:space/*",
                "arn:aws:sagemaker:*:*:training-job/*",
                "arn:aws:sagemaker:*:*:user-profile/*"
            ]
        },
        {
            "Sid": "ECRImage",
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken",
                "ecr:BatchGetImage"
            ],
            "Resource": "*"
        }
   ]
}

如果您的笔记本任务需要使用客户管理的 亚马逊云科技 密钥管理服务 (亚马逊云科技 KMS) 密钥进行加密,请同时添加允许 亚马逊云科技 KMS 访问的策略声明。有关示例策略,请参阅为本 地 Jupyter 环境 安装策略和权限

为笔记本作业实例设置 IAM 角色

SageMaker 需要 IAM 角色才能代表用户运行作业,例如运行笔记本作业。此角色应有权访问笔记本完成任务所需的资源,例如访问 Amazon S3 中的数据。

调度器扩展程序会自动在 亚马逊云科技 账户中查找 IAM 角色,使用前缀 SageMakerJupyterS cheduler 来运行笔记本任务。

要创建 IAM 角色,请使用 AmazonsagemakerFullAccess 策略 为亚马逊 SageMaker 创建执行角色 为角色命名 SagemakerJupyterSchedulerDemo ,或者提供一个带有预期前缀的名称。

创建角色后,在 信任关系 选项卡上,选择 编辑信任策略 。用以下内容替换现有的信任策略:

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

AmazonsagemakerFullAcces s 政策相当宽松,通常是实验和入门 SageMaker 的首选。我们强烈建议您根据 IAM 中的安全最佳实践,为未来任何工作负载创建最低范围策略。有关笔记本作业所需的最低权限集,请参阅 安装本地 Jupyter 环境的策略和权限。

安装扩展程序

在本地计算机上打开终端并运行以下命令安装扩展:

pip install amazon-sagemaker-jupyter-scheduler

此命令运行后,你可以通过运行 jupyter 实验室来启动 JupyterLab。

如果你是从 JupyterLab 终端中安装扩展程序,请重新启动 Jupyter 服务器来加载扩展。 你可以从 JupyterLab 的 “ 文件 ” 菜单 上选择 “ 关闭 ”,然后通过运行 jupyter 实验室从命令行启动 JupyterLab 来重新启动 JupyterLab。

提交笔记本作业

在您的环境中安装扩展程序后,您可以将任何独立的笔记本作为临时任务运行。让我们提交一个简单的 “Hello world” 笔记本作为计划作业运行。

  1. 在 “ 文件 ” 菜单上,选择 “ 新建 ” 和 “ 笔记本 ” 。
  2. 输入以下内容:
    
    # 安装软件包!pip 安装熊猫!pip 安装 boto3 # 导入区块导入 boto3 将熊猫作为 pd 导入 # 下载样本数据集 s3 = boto3.client (“s3") # 加载数据集 file_name = “abalone.csv” s3.download_file (“sagemaker-sample-file”,f” datasets/tabular/uci_abalone/abalone.csv “,文件名) # 显示数据集 df = pd.read_csv(文件名)df.hea
    d ()

成功安装扩展程序后,您将在笔记本电脑上看到笔记本日程安排图标。

  1. 选择该图标以创建笔记本作业。

或者,你可以在文件资源管理器中右键单击该笔记本,然后选择 创建笔记本作业

  1. 提供作业名称、输入文件、计算类型和其他参数。
  2. 将其余设置保留为默认值,然后选择 创建。

安排作业后,您将被重定向到 “ 笔记本作业 ” 选项卡,在该选项卡中,您可以查看笔记本作业列表及其状态,并在作业完成后查看笔记本输出和日志。您也可以从启动器访问此笔记本作业窗口,如以下屏幕截图所示。

高级配置

在您的本地计算机上,笔记本电脑会自动在 SageMaker Base Python 映像上运行,该镜像是 Docker Hub 发布的官方 Python 3.8 镜像,包括 Boto3 和 亚马逊云科技 CLI。在现实世界中,数据科学家需要为他们的笔记本安装特定的软件包或框架。有三种方法可以实现可重复的环境:

  • 最简单的选择是,你可以将软件包和框架直接安装在笔记本电脑的第一个单元上。
  • 您还可以在 其他选项 部分提供初始化脚本,指向本地存储器上的 bash 脚本,该脚本在笔记本启动时由笔记本作业运行。在下一节中,我们将展示使用初始化脚本安装软件包的示例。
  • 最后,如果您想在配置运行环境时获得最大的灵活性,可以使用 Python3 内核构建自己的自定义映像,将映像推送到 亚马逊弹性容器注册表 (Amazon ECR),然后在 “其他选项” 下为您的笔记本作业提供 ECR 映像 URI。 ECR 图像应符合 自定义 SageMaker 图像规范中列出的对 SageMaker 图像的要求。

此外,您的企业可能会设置防护措施,例如在 Amazon VPC 中以无互联网模式运行作业、为任务使用自定义的最低权限角色以及强制加密。您也可以在 “ 其他选项 ” 部分为笔记本作业指定此类配置。有关高级配置的详细列表,请参阅 其他选项

添加初始化脚本

为了展示初始化脚本,我们现在运行 GitHub 上可用的 Studio 笔记本作业的示例笔记本 。要运行此笔记本,你需要通过初始化脚本安装所需的软件包。完成以下步骤:

  1. 从你的 JupyterLab 终端运行以下命令下载文件:
    
    
    curl https://raw.githubusercontent.com/aws/amazon-sagemaker-examples/main/sagemaker-notebook-jobs/studio-scheduling/scheduled-example.ipynb > scheduled-example.ipynb 
     
    
  2. 在 “ 文件 ” 菜单上,选择 “ 新建 ” 和 “ 文本文件 ” 。
  3. 在文件中输入以下内容,然后将文件保存 为 init-script.sh
    
    echo “安装所需软件包” pip install--upgrade sagemaker pip install pandas numpy matplotlib scikit-learn 
     
    
  4. 从文件资源管理器中选择 s cheduled-example.ipynb 来打开笔记本。
  5. 选择笔记本作业图标来安排笔记本,然后展开 “ 其他选项 ” 部分。
  6. 初始化脚本位置 中 ,输入脚本的完整路径。

您还可以选择为笔记本作业自定义输入和输出 S3 文件夹。SageMaker 在指定的 S3 位置创建一个输入文件夹来存储输入文件,并创建一个用于存储笔记本输出的输出 S3 文件夹。您可以在此处指定加密、IAM 角色和 VPC 配置。有关自定义镜像 和 VPC 规范,请参阅 限制和注意事项

  1. 现在,只需更新初始化脚本, 为计划选择 “ 立即 运行 ”,然后选择 “ 创建 ” 。

作业完成后,您可以在 “输出 文件 ” 下 查看带有输出的笔记本和输出日志 ,如以下屏幕截图所示。在输出日志中,在运行笔记本之前,您应该能够看到初始化脚本正在运行。

要进一步自定义笔记本作业环境,您可以通过指定自定义图像的 ECR URI 来使用自己的图像。如果你自带镜像,请务必在构建镜像时安装 Python3 内核。有关可以使用 TensorFlow 运行笔记本的示例 Dockerfile,请参阅以下代码:

FROM tensorflow/tensorflow:latest
RUN pip install ipykernel && \
        python -m ipykernel install --sys-prefix

结论

在这篇文章中,我们向您展示了如何使用 SageMaker Jupyter 调度器扩展程序,在作为 SageMaker 训练作业托管的任何 JupyterLab 环境中运行您的笔记本电脑。 能够以无头方式按计划运行笔记本,可以大大减少数据科学家无差别的繁重工作,例如将笔记本重构为 Python 脚本、设置 Amaz on EventBridge 事件触发器 以及创建 亚马逊云科技 Lambda 函数或 SageMaker 管道来启动训练任务。 SageMaker 笔记本作业是按需运行的,因此您只需为笔记本电脑的运行时间付费,并且可以使用笔记本作业扩展程序随时从 JupyterLab 环境中查看笔记本输出。我们鼓励你尝试定期的笔记本作业,并通过 re : Post 与 机器学习和 AI 社区联系 以获取反 馈!


作者简介

Bhadrinath Pani 是亚马逊网络服务的软件开发工程师,负责亚马逊 SageMaker 互动机器学习产品,在汽车、物联网、增强现实/虚拟现实和计算机视觉等领域的软件开发方面拥有超过 12 年的经验。目前,他的主要重点是开发机器学习工具,旨在简化数据科学家的体验。在空闲时间,他喜欢与家人共度时光,探索太平洋西北地区的美景。

杜尔加·苏里 是亚马逊 SageMaker Service SA 团队的机器学习解决方案架构师。她热衷于让每个人都能使用机器学习。在 亚马逊云科技 工作的 4 年中,她帮助企业客户建立了 AI/ML 平台。当她不工作时,她喜欢骑摩托车、神秘小说,还喜欢和她5岁的哈士奇一起长途跋涉。


*前述特定亚马逊云科技生成式人工智能相关的服务仅在亚马逊云科技海外区域可用,亚马逊云科技中国仅为帮助您发展海外业务和/或了解行业前沿技术选择推荐该服务。