自定义附加组件 - 亚马逊 SageMaker AI

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

自定义附加组件

模板

模板是可重复使用的工作区配置,可用作管理员控制的工作区创建蓝图。它们为工作空间配置值提供默认值,并提供护栏来控制数据科学家可以做什么。模板存在于集群级别,可以跨命名空间重复使用。

SageMaker Spaces 创建了两个系统模板作为数据科学家的起点,一个用于代码编辑器,一个用于 JupyterLab。这些系统模板由插件管理,无法直接编辑。相反,管理员可以创建新模板并将其设置为默认模板。

任务治理

apiVersion: workspace.jupyter.org/v1alpha1 kind: WorkspaceTemplate metadata: name: my-jupyter-template namespace: my-namespace labels: kueue.x-k8s.io/priority-class: <user-input>-priority spec: displayName: "My Custom Jupyter Lab" description: "Custom Jupyter Lab with specific configurations" defaultImage: "public.ecr.aws/sagemaker/sagemaker-distribution:latest-cpu" allowedImages: - "public.ecr.aws/sagemaker/sagemaker-distribution:latest-cpu" - "public.ecr.aws/sagemaker/sagemaker-distribution:latest-gpu" defaultResources: requests: cpu: "1" memory: "4Gi" limits: cpu: "4" memory: "16Gi" primaryStorage: defaultSize: "10Gi" minSize: "5Gi" maxSize: "50Gi" defaultStorageClassName: "sagemaker-spaces-default-storage-class" defaultMountPath: "/home/sagemaker-user" defaultContainerConfig: command: ["/opt/amazon/sagemaker/workspace/bin/entrypoint-workspace-jupyterlab"] defaultPodSecurityContext: fsGroup: 1000 defaultOwnershipType: "Public" defaultAccessStrategy: name: "hyperpod-access-strategy" allowSecondaryStorages: true appType: "jupyterlab"

SMD /自定义镜像

客户可以通过模板配置图像策略,方法是提供默认图像和允许的图像列表。此外,管理员可以选择是否允许数据科学家自带自定义映像。系统默认使用最新的 SageMaker 发行版,但是如果您想固定到特定版本,则可以在模板中指定要使用的确切 SMD 版本。

自定义图片要求:

  • curl如果你想使用空闲关机

  • 端口 8888

  • 远程访问

远程 IDE 要求

VS Code 版本要求

需要使用 VS Code 版本 1.90 或更高版本。我们建议使用最新稳定版本的 VS Code

操作系统要求

您需要使用下列操作系统之一,才能远程连接到 Studio 空间:

本地计算机先决条件

在将本地 Visual Studio Code 连接到 Studio 空间之前,请确保您的本地计算机具有所需的依赖项和网络访问权限。

注意

具有软件安装限制的环境可能会阻止用户安装所需的依赖项。Visual Studio Code 的 AWS Toolkit for Visual Studio Code 在启动远程连接时会自动搜索这些依赖关系,如果缺少任何依赖关系,则会提示安装。与您的 IT 部门协调,确保这些组件可用。

必需的本地依赖关系

您的本地计算机必须安装以下组件:

特定于平台的要求

  • Windows 用户 — SSH 终端连接需要 PowerShell 5.1 或更高版本

网络连接要求

您的本地计算机必须具有访问会话管理器端点的网络访问权限。例如,在美国东部(弗吉尼亚北部)(us-east-1),它们可以是:

映像要求

SageMaker 分发图片

使用具有远程访问权限的 SageMaker 分发版时,请使用SageMaker 分发版本 2.7 或更高版本。

自定义图片

使用远程访问自带镜像 (BYOI) 时,请确保遵守自定义镜像规范,并确保安装了以下依赖项:

  • curlwget — 下载 AWS CLI 组件时必填项

  • unzip— 解压缩 AWS CLI 安装文件所必需的

  • tar— 档案提取所必需的

  • gzip— 处理压缩文件所必需的

实例要求

  • 内存 – 8GB 或更多

  • 使用内存至少为 8GB 的实例。因内存不足(小于 8GB),无法支持以下实例类型:ml.t3.mediumml.c7i.largeml.c6i.largeml.c6id.largeml.c5.large。如需更完整的实例类型列表,请参阅 Amazon EC2 按需定价页面

通过预热容器镜像来优化 Kubernetes 的启动时间

容器镜像拉取性能已成为许多 EKS 客户的重大瓶颈,尤其是在 AI/ML 工作负载依赖越来越大的容器镜像的情况下。在每个 EKS 节点上首次使用这些大图像时,拉取和解压缩它们通常需要几分钟。这种延迟会增加启动 SageMaker Spaces 时的延迟,并直接影响用户体验,尤其是在需要快速启动的环境中,例如笔记本电脑、交互式开发作业。

图像预热是一种技术,用于在需要之前将特定的容器映像预加载到 EKS/HyperPod 集群中的每个节点。集群不会等待 pod 触发第一次拉取大镜像,而是主动下载和缓存所有节点上的图像。这样可以确保在工作负载启动时,所需的映像已经在本地可用,从而消除了长时间的冷启动延迟。图像预热可提高 SageMaker Spaces 的启动速度,并为最终用户提供更具可预测性和响应性的体验。

预热通过 DaemonSet

我们建议使用 DaemonSet 来预加载图像。A DaemonSet 可确保集群中的每个节点上运行一个 Pod。 DaemonSet Pod 中的每个容器都引用您想要缓存的图像。当 Kubernetes 启动 Pod 时,它会自动拉取图像,从而预热每个节点上的缓存。

以下示例说明如何创建预加载两个 GPU 映像的。 DaemonSet 每个容器都运行一个轻量级sleep infinity命令,以最小的开销保持 pod 处于活动状态。

cat <<EOF | kubectl apply -n "namespace_1" -f - apiVersion: apps/v1 kind: DaemonSet metadata: name: image-preload-ds spec: selector: matchLabels: app: image-preloader template: metadata: labels: app: image-preloader spec: containers: - name: preloader-3-4-2 image: public.ecr.aws/sagemaker/sagemaker-distribution:3.4.2-gpu command: ["sleep"] args: ["infinity"] resources: requests: cpu: 1m memory: 16Mi limits: cpu: 5m memory: 32Mi - name: preloader-3-3-2 image: public.ecr.aws/sagemaker/sagemaker-distribution:3.3.2-gpu command: ["sleep"] args: ["infinity"] resources: requests: cpu: 1m memory: 16Mi limits: cpu: 5m memory: 32Mi EOF

工作方式

  • 每个容器都引用一张图片。

  • Kubernetes 必须先下载每张镜像,然后才能启动容器。

  • 当 Pod 在每个节点上运行后,图像就会被缓存在本地。

  • 现在,使用这些映像的任何工作负载的启动速度都要快得多。

空间默认存储 (EBS)

默认情况下,系统使用 EBS CSI 驱动程序为每个工作空间配置 EBS 存储卷。 SageMaker 创建用于工作空间的 EBS 存储类,管理员可以使用模板设置自定义这些卷的默认和最大大小。对于使用 CLI 工具的高级用户,您还可以自定义工作空间的存储类别,这样用户就可以利用其他存储类别,包括为其 EBS 卷配置客户管理的 KMS 密钥。

请注意,EBS 卷绑定到特定的可用区,这意味着只能将工作空间调度到与其存储卷位于同一可用区的节点上。如果集群容量存在但不在正确的可用区中,则可能导致调度失败。

其他存储

SageMaker Spaces 支持将其他存储卷(例如 Amazon EFS、 FSx for Lustre 或 S3 Mountpoint)附加到您的开发空间。这使您可以访问共享数据集、协作处理项目或使用高性能存储来处理工作负载。

先决条件

在为空间添加更多存储空间之前,您必须:

  1. 通过 E KS 插件(亚马逊 EFS CSI 驱动程序、Amazon for Lustre CSI 驱动程序或亚马逊 FSx S3 CSI 驱动程序的 Mountpoint)安装相应的 CSI 驱动程序插件

  2. 设置存储资源并 PersistentVolumeClaims按照特定存储类型的 CSI 驱动程序文档进行操作

  3. 确保 PVC 在您计划创建空间的同一个命名空间中可用

将存储空间附加到空间

PersistentVolumeClaim 配置完成后,您可以使用 HyperPod CLI 或 kubectl 将其连接到空间。

HyperPod CLI

hyp create hyp-space \ --name my-space \ --display-name "My Space with FSx" \ --memory 8Gi \ --volume name=shared-fsx,mountPath=/shared,persistentVolumeClaimName=my-fsx-pvc

kubectl

apiVersion: workspace.jupyter.org/v1alpha1 kind: Workspace metadata: name: my-space spec: displayName: "My Space with FSx" desiredStatus: Running volumes: - name: shared-fsx mountPath: /shared persistentVolumeClaimName: my-fsx-pvc

多卷

您可以使用 CLI 指定多个--volume标志,或者使用 kubectl 在volumes数组中指定多个条目,从而将多个额外的存储卷附加到单个空间。

HyperPod CLI

hyp create hyp-space \ --name my-space \ --display-name "My Space with Multiple Storage" \ --memory 8Gi \ --volume name=shared-efs,mountPath=/shared,persistentVolumeClaimName=my-efs-pvc \ --volume name=datasets,mountPath=/datasets,persistentVolumeClaimName=my-s3-pvc

kubectl

apiVersion: workspace.jupyter.org/v1alpha1 kind: Workspace metadata: name: my-space spec: displayName: "My Space with Multiple Storage" desiredStatus: Running volumes: - name: shared-efs mountPath: /shared persistentVolumeClaimName: my-efs-pvc - name: datasets mountPath: /datasets persistentVolumeClaimName: my-s3-pvc

资源配置

SageMaker Spaces 允许您为开发环境配置计算资源,包括 CPU、内存和 GPU 资源,以满足您的工作负载要求。

GPU 配置

SageMaker Spaces 支持整个 GPU 分配和使用 NVIDIA 多实例 GPU (MIG) 技术的 GPU 分区。这使您可以针对不同类型的机器学习工作负载优化 GPU 利用率。

整个 GPU 分配

HyperPod CLI

hyp create hyp-space \ --name gpu-space \ --display-name "GPU Development Space" \ --image public.ecr.aws/sagemaker/sagemaker-distribution:latest-gpu \ --memory 16Gi \ --gpu 1 \ --gpu-limit 1

kubectl

apiVersion: workspace.jupyter.org/v1alpha1 kind: Workspace metadata: name: gpu-space spec: displayName: "GPU Development Space" image: "public.ecr.aws/sagemaker/sagemaker-distribution:latest-gpu" desiredStatus: Running resources: requests: memory: "16Gi" nvidia.com/gpu: "1" limits: memory: "16Gi" nvidia.com/gpu: "1"

GPU 分区 (MIG)

使用 NVIDIA 多实例 GPU (MIG) 技术进行 GPU 分区允许您将单个 GPU 分区为较小的隔离实例。您的 HyperPod 集群必须具有支持 MIG 的 GPU 节点并配置了 MIG 配置文件。有关在 HyperPod 集群上设置 MIG 的更多信息,请参阅使用 NVIDIA MIG 进行 GPU 分区

HyperPod CLI

hyp create hyp-space \ --name mig-space \ --display-name "MIG GPU Space" \ --image public.ecr.aws/sagemaker/sagemaker-distribution:latest-gpu \ --memory 8Gi \ --accelerator-partition-type mig-3g.20gb \ --accelerator-partition-count 1

kubectl

apiVersion: workspace.jupyter.org/v1alpha1 kind: Workspace metadata: name: mig-space spec: displayName: "MIG GPU Space" image: "public.ecr.aws/sagemaker/sagemaker-distribution:latest-gpu" desiredStatus: Running resources: requests: memory: "8Gi" nvidia.com/mig-3g.20gb: "1" limits: memory: "8Gi" nvidia.com/mig-3g.20gb: "1"

生命周期

生命周期配置提供了在创建或启动工作区时运行的启动脚本。这些脚本允许管理员在启动期间自定义工作区环境。这些是最大大小为 1 KB 的 bash 脚本。如果您需要更大的设置配置,我们建议您在容器镜像中添加脚本并从生命周期配置中触发脚本。

我们利用 Kubernetes 容器生命周期挂钩来提供此功能 https://kubernetes。 io/docs/concepts/containers/container-lifecycle-hooks/。请注意,Kubernetes 不保证启动脚本何时会相对于容器的入口点运行。

空闲关闭

配置空闲工作空间的自动关闭以优化资源使用。

空闲关闭

idleShutdown: enabled: true idleShutdownTimeoutMinutes: 30 detection: httpGet: path: /api/idle port: 8888 scheme: HTTP

参数

启用(布尔值,必填)-启用或禁用工作区的空闲关机。

idleShutdownTimeout分钟(整数,必填项)-工作区关闭前处于非活动状态的分钟数。最小值为 1。

检测(对象,必填)-定义如何检测工作区空闲状态。

d@@ etection.httpGet(对象,可选)-用于空闲检测的 HTTP 端点配置。使用 Kubernetes 操作规范。 HTTPGet

  • 路径-请求的 HTTP 路径

  • 端口-端口号或名称

  • 方案-HTTP 或 HTTPS(默认值:HTTP)

配置位置

工作空间配置

直接在工作区规范中定义空闲关机:

apiVersion: workspace.jupyter.org/v1alpha1 kind: Workspace metadata: name: my-workspace spec: displayName: "Development Workspace" image: jupyter/scipy-notebook:latest idleShutdown: enabled: true idleShutdownTimeoutMinutes: 30 detection: httpGet: path: /api/idle port: 8888

模板配置

在 a 中定义默认的空闲关机行为 WorkspaceTemplate:

apiVersion: workspace.jupyter.org/v1alpha1 kind: WorkspaceTemplate metadata: name: jupyter-template spec: displayName: "Jupyter Template" defaultImage: jupyter/scipy-notebook:latest defaultIdleShutdown: enabled: true idleShutdownTimeoutMinutes: 30 detection: httpGet: path: /api/idle port: 8888 idleShutdownOverrides: allow: true minTimeoutMinutes: 60 maxTimeoutMinutes: 240

模板继承和覆盖

使用模板的工作空间会自动继承模板的defaultIdleShutdown配置。如果模板允许,工作区可以覆盖此配置。

改写政策

模板通过idleShutdownOverrides以下方式控制覆盖行为:

allo@@ w(布尔值,默认值:true)-工作空间是否可以覆盖默认的空闲关闭配置。

minTimeoutMinutes(整数,可选)-工作区覆盖允许的最小超时值。

maxTimeoutMinutes(整数,可选)-工作区覆盖允许的最大超时值。

继承示例

工作区继承模板默认值:

apiVersion: workspace.jupyter.org/v1alpha1 kind: Workspace metadata: name: my-workspace spec: displayName: "My Workspace" templateRef: name: jupyter-template # Inherits defaultIdleShutdown from template

重写示例

工作区会覆盖模板默认值:

apiVersion: workspace.jupyter.org/v1alpha1 kind: Workspace metadata: name: my-workspace spec: displayName: "My Workspace" templateRef: name: jupyter-template idleShutdown: enabled: true idleShutdownTimeoutMinutes: 60 # Must be within template bounds detection: httpGet: path: /api/idle port: 8888

锁定配置

防止工作区覆盖:

apiVersion: workspace.jupyter.org/v1alpha1 kind: WorkspaceTemplate metadata: name: locked-template spec: displayName: "Locked Template" defaultImage: jupyter/scipy-notebook:latest defaultIdleShutdown: enabled: true idleShutdownTimeoutMinutes: 30 detection: httpGet: path: /api/idle port: 8888 idleShutdownOverrides: allow: false # Workspaces cannot override

行为

启用空闲关闭后,系统会使用配置的 HTTP 端点定期检查工作区是否有活动。如果端点指示工作空间在指定的超时持续时间内处于空闲状态,则工作空间会自动停止。需要时,您可以手动重新启动工作区。

模板更新

诸如 Kubectl 或 Hyperpod CLI 和 SDK 之类的客户端工具可用于管理 EKS 集群中的空间。管理员可以为默认 Space 配置预置空间模板,而数据科学家则无需了解 Kubernetes 底层的复杂性即可自定义其集成开发环境。有关详细的使用说明,请参阅 CLI 和 SDK 文档,网址为https://sagemaker-hyperpod-cli.readthedocs.io/en/latest/index.html

管理员可以对空间模板执行 CRUD 操作,这些模板是创建空间时的基本配置。数据科学家可以对空间执行 CRUD 操作并覆盖各种参数,包括特定计算节点的多实例 GPU 配置文件。他们可以通过远程 VSCode 访问和 Web UI 启动、停止和连接到空间。更新空间模板后,随后创建的任何空间都将使用更新后的模板中的设置进行配置。当现有空间更新或启动时,将进行合规性检查。如果有任何设置超出范围或不匹配,则空间将无法更新或启动。

使用 hyp cli 和 kubectl

用户可以使用 Hyperpod CLI 对模板执行 CRUD

### 1. Create a Space Template hyp create hyp-space-template --file template.yaml ### 2. List Space Templates hyp list hyp-space-template hyp list hyp-space-template --output json ### 3. Describe a Space Template hyp describe hyp-space-template --name my-template hyp describe hyp-space-template --name my-template --output json ### 4. Update a Space Template hyp update hyp-space-template --name my-template --file updated-template.yaml ### 5. Delete a Space Template hyp delete hyp-space-template --name my-template

要创建自定义模板,您可以使用我们的系统模板作为起点。此模板适用于类似 SMD 的图像,但可以根据管理员使用的图像对其进行自定义。

自定义 JupyterLab 模板示例:

apiVersion: workspace.jupyter.org/v1alpha1 kind: WorkspaceTemplate metadata: name: my-jupyter-template namespace: my-namespace spec: displayName: "My Custom Jupyter Lab" description: "Custom Jupyter Lab with specific configurations" defaultImage: "public.ecr.aws/sagemaker/sagemaker-distribution:latest-cpu" allowedImages: - "public.ecr.aws/sagemaker/sagemaker-distribution:latest-cpu" - "public.ecr.aws/sagemaker/sagemaker-distribution:latest-gpu" defaultResources: requests: cpu: "1" memory: "4Gi" limits: cpu: "4" memory: "16Gi" primaryStorage: defaultSize: "10Gi" minSize: "5Gi" maxSize: "50Gi" defaultStorageClassName: "sagemaker-spaces-default-storage-class" defaultMountPath: "/home/sagemaker-user" defaultContainerConfig: command: ["/opt/amazon/sagemaker/workspace/bin/entrypoint-workspace-jupyterlab"] defaultPodSecurityContext: fsGroup: 1000 defaultOwnershipType: "Public" defaultAccessStrategy: name: "hyperpod-access-strategy" allowSecondaryStorages: true appType: "jupyterlab"

自定义代码编辑器模板示例:

apiVersion: workspace.jupyter.org/v1alpha1 kind: WorkspaceTemplate metadata: name: my-code-editor-template namespace: my-namespace spec: displayName: "My Custom Code Editor" description: "Custom Code Editor with specific configurations" defaultImage: "public.ecr.aws/sagemaker/sagemaker-distribution:latest-cpu" allowedImages: - "public.ecr.aws/sagemaker/sagemaker-distribution:latest-cpu" - "public.ecr.aws/sagemaker/sagemaker-distribution:latest-gpu" defaultResources: requests: cpu: "1" memory: "4Gi" limits: cpu: "4" memory: "16Gi" primaryStorage: defaultSize: "10Gi" minSize: "5Gi" maxSize: "50Gi" defaultStorageClassName: "sagemaker-spaces-default-storage-class" defaultMountPath: "/home/sagemaker-user" defaultContainerConfig: command: ["/opt/amazon/sagemaker/workspace/bin/entrypoint-workspace-code-editor"] defaultPodSecurityContext: fsGroup: 1000 defaultOwnershipType: "Public" defaultAccessStrategy: name: "hyperpod-access-strategy" allowSecondaryStorages: true appType: "code-editor"