本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
自定义插件
模板
模板是可重复使用的工作区配置,可用作管理员控制的工作区创建蓝图。它们为工作空间配置值提供默认值,并提供护栏来控制数据科学家可以做什么。模板存在于集群级别,可以跨命名空间重复使用。
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
操作系统要求
您需要使用下列操作系统之一,才能远程连接到 Studio 空间:
-
macOS 13+
-
Windows 10
-
Windows 11
-
Linux
-
-
不是开源版本
-
本地计算机先决条件
在将本地 Visual Studio Code 连接到 Studio 空间之前,请确保您的本地计算机具有所需的依赖项和网络访问权限。
注意
具有软件安装限制的环境可能会阻止用户安装所需的依赖项。Visual Studio Code 的 AWS Toolkit for Visual Studio Code 在启动远程连接时会自动搜索这些依赖关系,如果缺少任何依赖关系,则会提示安装。与您的 IT 部门协调,确保这些组件可用。
必需的本地依赖关系
您的本地计算机必须安装以下组件:
-
— 用于远程开发的标准 VS Code Marketplace 扩展
-
会话管理器插件-安全会话管理所必需的
-
SSH 客户端 — 大多数计算机上的标准组件(建议在 Windows 上使用 OpenSSH
) -
通常包含在 VS Code 安装中
特定于平台的要求
-
Windows 用户 — SSH 终端连接需要 PowerShell 5.1 或更高版本
网络连接要求
您的本地计算机必须具有访问会话管理器端点的网络访问权限。例如,在美国东部(弗吉尼亚北部)(us-east-1),它们可以是:
映像要求
SageMaker 分发图片
使用具有远程访问权限的 SageMaker 分发版时,请使用SageMaker 分发版本 2.7 或更高版本。
自定义镜像
使用远程访问自带镜像 (BYOI) 时,请确保遵守自定义镜像规范,并确保安装了以下依赖项:
-
curl或wget— 下载AWS CLI组件时必填项 -
unzip— 解压缩AWS CLI安装文件所必需的 -
tar— 档案提取所必需的 -
gzip— 处理压缩文件所必需的
实例要求
-
内存 – 8GB 或更多
-
使用内存至少为 8GB 的实例。因内存不足(小于 8GB),无法支持以下实例类型:
ml.t3.medium、ml.c7i.large、ml.c6i.large、ml.c6id.large和ml.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 卷绑定到特定的可用区,这意味着只能将工作空间调度到与其存储卷位于同一可用区的节点上。如果集群容量存在但不在正确的可用区中,则可能导致调度失败。
生命周期
生命周期配置提供了在创建或启动工作区时运行的启动脚本。这些脚本允许管理员在启动期间自定义工作区环境。这些是最大大小为 1 KB 的 bash 脚本。如果您需要更大的设置配置,我们建议您在容器镜像中添加脚本并从生命周期配置中触发该脚本。
我们利用 Kubernetes 容器生命周期挂钩来提供此功能 https://kubernetes。 io/docs/concepts/containers/container-lifecycle-hooks/
空闲关闭
配置空闲工作空间的自动关闭以优化资源使用。
空闲关闭
idleShutdown: enabled: true idleShutdownTimeoutMinutes: 30 detection: httpGet: path: /api/idle port: 8888 scheme: HTTP
Parameters
启用(布尔值,必填)-启用或禁用工作区的空闲关机。
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"