📢 转载信息
原文作者:Pranav Murthy, Nikita Arbuzov, and Raj Bagwe
今天,我们很高兴为 SageMaker Studio 推出一项新功能:SOCI (Seekable Open Container Initiative) 索引。SOCI 支持容器镜像的延迟加载,这意味着系统最初只下载镜像中必需的部分,而不是整个容器。
SageMaker Studio 是一个用于端到端机器学习 (ML) 开发的 Web 集成开发环境 (IDE),用户可以在其中为完整的 ML 工作流程构建、训练、部署和管理传统 ML 模型和基础模型 (FM)。
每个 SageMaker Studio 应用程序都在一个容器中运行,该容器打包了所需的库、框架和依赖项,以确保在不同工作负载和用户会话中保持一致的执行。这种容器化架构使 SageMaker Studio 能够支持各种 ML 框架,如 TensorFlow、PyTorch、scikit-learn 等,同时保持强大的环境隔离。尽管 SageMaker Studio 为最常见的 ML 环境提供了容器,但数据科学家可能需要通过添加或删除包、配置自定义环境变量或安装专业依赖项来为特定用例定制这些环境。SageMaker Studio 通过 生命周期配置 (LCCs) 支持这种定制,LCCs 允许用户在 Studio IDE 空间启动时运行 bash 脚本。然而,使用 LCCs 重复定制环境会变得耗时且难以规模化维护。为解决此问题,SageMaker Studio 支持构建和注册 自定义容器镜像,其中包含预配置的库和框架。这些可重用的自定义镜像减少了设置摩擦,提高了跨项目的可重现性,使数据科学家能够专注于模型开发,而不是环境管理。
随着 ML 工作负载变得越来越复杂,驱动这些环境的容器镜像越来越大,导致启动时间变长,从而延迟了工作效率并中断了开发工作流程。数据科学家、ML工程师和开发人员在初始化环境时可能会等待更长时间,特别是在不同框架之间切换时,或者在使用预装了大量库和依赖项的镜像时。这种启动延迟成为迭代式 ML 开发中的一个主要瓶颈,而在这种开发中,快速实验和快速原型设计至关重要。SOCI 不再预先下载整个容器镜像,而是创建一个索引,允许系统仅在启动应用程序时获取所需的文件和层,额外的组件按需加载。这显著将容器启动时间从几分钟减少到几秒钟,使您的 SageMaker Studio 环境启动更快,让您能更早地投入到 ML 项目中,最终提高开发人员的生产力并缩短 ML 实验的洞察时间。
先决条件
要在 SageMaker Studio 中使用 SOCI 索引,您需要:
- 一个拥有管理 SageMaker 和 ECR 资源权限的 AWS 身份和访问管理 (IAM) 角色的 AWS 账户。有关详细信息,请参阅 创建 AWS 账户。
- 如果这是您首次使用 Amazon SageMaker Studio,您需要先创建一个 SageMaker 域。
- 一个私有的 Amazon Elastic Container Registry (ECR) 仓库,用于存储带有 SOCI 索引的容器镜像。
- 验证您已安装 AWS CLI 2.0 或更高版本,以便与这些服务交互并管理您的 SOCI 索引镜像。
SageMaker Studio SOCI 索引 – 功能概述
SOCI(Seekable Open Container Initiative),最初由 AWS 开源,通过选择性镜像加载解决了 SageMaker Studio 中的容器启动延迟问题。这项技术创建了一个专门的索引,映射了容器镜像的内部结构,以便在不首先下载整个容器存档的情况下,对单个文件进行精细化访问。传统的容器镜像以 Gzipped tar 文件中分层的有序列表形式存储,通常需要在访问任何内容之前完全下载。SOCI 通过生成一个单独的索引(存储为 OCI Artifact)来克服这一限制,该索引通过 OCI 引用类型链接到原始容器镜像。这种设计保留了所有原始容器镜像,保持了图像摘要的一致性,并确保了签名有效性——这对于具有严格安全要求的 AI/ML 环境至关重要。
对于 SageMaker Studio 用户,您可以通过与 Finch 容器运行时 的集成来实现 SOCI 索引,这使得在使用“自带镜像 (BYOI)”的所有实例类型上,容器启动时间减少了 35-70%。这种实现超越了当前仅限于特定第一方镜像和实例类型组合的优化策略,为 SageMaker AI Studio 和 SageMaker 统一 Studio 环境提供了更快的应用程序启动时间。
创建 SOCI 索引
要创建和管理 SOCI 索引,您可以使用几种容器管理工具,每种工具根据您的开发环境和偏好提供不同的优势:
- Finch CLI 是 AWS 开发的一个与 Docker 兼容的命令行工具,提供对构建和推送 SOCI 索引的原生支持。它提供了一个类似 Docker 的熟悉界面,并包含内置的 SOCI 功能,使得无需额外工具即可轻松创建索引镜像。
- nerdctl 充当 containerd(行业标准的容器运行时)的替代容器 CLI。它提供与 Docker 兼容的命令,同时提供与 containerd 功能的直接集成,包括对 SOCI 的支持以实现延迟加载功能。
- Docker + SOCI CLI 将广泛使用的 Docker 工具链与专用的 SOCI 命令行界面相结合。这种方法允许您利用现有的基于 Docker 的开发流程,同时通过单独的 CLI 工具添加 SOCI 索引功能,为已投入到 Docker 开发流程中的团队提供灵活性。
在标准的 SageMaker Studio 工作流程中,启动机器学习环境需要在下载整个容器镜像后才能开始任何应用程序。当用户启动新的 SageMaker Studio 会话时,系统必须从容器注册表中拉取包含 TensorFlow、PyTorch、scikit-learn、Jupyter 和相关依赖项等框架的整个镜像。这个过程是顺序且耗时的——容器运行时下载每个压缩层,将完整的文件系统提取到本地存储,然后应用程序才能开始初始化。对于典型的 2-5 GB 的 ML 镜像,这会导致 3-5 分钟的启动时间,在迭代式开发工作流程中造成了重大摩擦,因为数据科学家经常需要在不同环境之间切换或重新启动会话。SOCI 增强的工作流程通过启用智能、按需的文件检索来改变容器启动。SOCI 不下载整个镜像,而是创建一个可搜索的索引,映射压缩的容器层中每个文件的精确位置。启动 SageMaker Studio 应用程序时,系统仅下载 SOCI 索引(通常为 10-20 MB)和应用程序启动所需的最小文件集——通常占总镜像大小的 5-10%。容器立即开始运行,而在后台进程继续根据应用程序请求下载剩余文件。这种延迟加载方法将初始启动时间从几分钟减少到几秒钟,使用户几乎可以立即开始富有成效的工作,而环境的初始化则在后台透明地完成。
将镜像转换为 SOCI
您可以使用以下命令将现有镜像转换为 SOCI 镜像并将其推送到您的私有 ECR:
#/bin/bash # 下载并安装 soci-snapshotter, containerd, and nerdctl sudo yum install soci-snapshotter sudo yum install containerd jq sudo systemctl start soci-snapshotter sudo systemctl restart containerd sudo yum install nerdctl # 设置您的注册表变量 REGISTRY="123456789012.dkr.ecr.us-west-2.amazonaws.com" REPOSITORY_NAME="my-sagemaker-image" # 认证以进行镜像拉取和推送 AWS_REGION=us-west-2 REGISTRY_USER=AWS REGISTRY_PASSWORD=$(/usr/local/bin/aws ecr get-login-password --region $AWS_REGION) echo $REGISTRY_PASSWORD | sudo nerdctl login -u $REGISTRY_USER --password-stdin $REGISTRY # 拉取原始镜像 sudo nerdctl pull $REGISTRY/$REPOSITORY_NAME\:original-image # 使用 convert 子命令创建 SOCI 索引 sudo nerdctl image convert --soci $REGISTRY/$REPOSITORY_NAME\:original-image $REGISTRY/$REPOSITORY_NAME\:soci-image # 推送 SOCI v2 索引镜像 sudo nerdctl push --platform linux/amd64 $REGISTRY/$REPOSITORY_NAME\:soci-image
此过程会在您的 ECR 仓库中为原始容器镜像创建两个工件:
- SOCI 索引 – 启用延迟加载的元数据。
- 镜像索引清单 (Image index manifest) – OCI 合规的清单,将两者链接在一起。
要在 SageMaker Studio 中使用 SOCI 索引镜像,您在创建 SageMaker 镜像和 SageMaker 镜像版本资源时,必须引用镜像索引 URI 而不是原始容器镜像 URI。镜像索引 URI 对应于您在 SOCI 转换过程中指定的标签(例如,上一个示例中的 soci-image)。
#/bin/bash # 使用 SOCI v2 镜像索引 URI IMAGE_INDEX_URI="123456789012.dkr.ecr.us-west-2.amazonaws.com/my-sagemaker-image:soci-image" # 创建 SageMaker 镜像 aws sagemaker create-image \ --image-name "my-sagemaker-image" \ --role-arn "arn:aws:iam::123456789012:role/SageMakerExecutionRole" # 使用 SOCI 索引创建 SageMaker 镜像版本 aws sagemaker create-image-version \ --image-name "my-sagemaker-image" \ --base-image "$IMAGE_INDEX_URI" # 为 JupyterLab 创建 App 镜像配置 aws sagemaker create-app-image-config \ --app-image-config-name "my-sagemaker-image-config" \ --jupyter-lab-app-image-config '{ "FileSystemConfig": { "MountPath": "/home/sagemaker-user", "DefaultUid": 1000, "DefaultGid": 100 } }' #更新域以包含自定义镜像(必需步骤) aws sagemaker update-domain \ --domain-id "d-xxxxxxxxxxxx" \ --default-user-settings '{ "JupyterLabAppSettings": { "CustomImages": [{ "ImageName": "my-sagemaker-image", "AppImageConfigName": "my-sagemaker-image-config" }] } }'
镜像索引 URI 包含对容器镜像及其相关 SOCI 索引的引用,通过 OCI 镜像索引清单进行连接。当 SageMaker Studio 使用此 URI 启动应用程序时,它会自动检测 SOCI 索引并启用延迟加载功能。
SOCI 索引支持 SageMaker 统一 Studio 和 SageMaker AI 的所有 ML 环境(JupyterLab、CodeEditor 等)。有关设置客户镜像的更多信息,请参阅 SageMaker 自带镜像文档。
基准测试 SOCI 对 SageMaker Studio JupyterLab 启动的影响
SageMaker Studio 中此新功能的主要目标是通过减少使用自定义镜像启动的 SageMaker Studio 应用程序的启动持续时间来简化最终用户体验。为了衡量在 SageMaker Studio 中使用 SOCI 延迟加载自定义容器镜像的有效性,我们将实证量化并对比启用 SOCI 前后给定自定义镜像的启动持续时间。此外,我们将对代表各种依赖项、文件和数据的自定义镜像进行此测试,以评估其对具有不同自定义镜像需求的用户可能产生的效果差异。
为了实证量化自定义镜像应用启动的启动持续时间,我们将使用 SageMaker CreateApp API 以编程方式启动 JupyterLab 和 CodeEditor 应用程序——指定候选 sageMakerImageArn 和 sageMakerImageVersionAlias 事件时间以及适当的 instanceType——记录 eventTime 以供分析。然后,我们将每秒轮询 SageMaker ListApps API 以监控应用启动情况,记录第一个报告 Status 为 InService 的响应的 eventTime。该特定应用程序的这两个时间之间的差值即为启动持续时间。
对于此分析,我们创建了两组私有 ECR 仓库,每组都包含相同的 SageMaker 自定义容器镜像,但只有一组实现了 SOCI 索引。当比较 ECR 中等效的镜像时,我们可以在一个仓库中看到 SOCI 工件。我们将应用部署到单个 SageMaker AI 域。所有自定义镜像都附加到该域,以便其 SageMaker Studio 用户在调用 JupyterLab 空间启动时可以选择这些自定义镜像。
为了运行测试,对于每个自定义镜像,我们调用十次 CreateApp API 调用:
"requestParameters": { "domainId": "<>", "spaceName": "<>", "appType": "JupyterLab", "appName": "default", "tags": [], "resourceSpec": { "sageMakerImageArn": "<>", "sageMakerImageVersionAlias": "<>", "instanceType": "<>" }, "recoveryMode": false }
下表汇总了启用 SOCI 索引后 Amazon SageMaker 发行版镜像的启动加速情况:
| 应用类型 | 实例类型 | 镜像 | 应用启动持续时间 (秒) | 应用启动持续时间减少百分比 | |
| 常规镜像 | SOCI 镜像 | ||||
| SMAI JupyterLab | t3.medium | SMD 3.4.2 | 231 | 150 | 35.06% |
| t3.medium | SMD 3.4.2 | 350 | 191 | 45.43% | |
| c7i.large | SMD 3.4.2 | 331 | 141 | 57.40% | |
| SMAI CodeEditor | t3.medium | SMD 3.4.2 | 202 | 110 | 45.54% |
| t3.medium | SMD 3.4.2 | 213 | 78 | 63.38% | |
| c7i.large | SMD 3.4.2 | 279 | 91 | 67.38% |
注意:每次应用启动延迟及其改进可能因 SageMaker ML 实例的可用性而异。
基于这些发现,我们看到使用 SOCI 索引运行 SageMaker Studio 自定义镜像比不使用 SOCI 索引时能让 SageMaker Studio 用户更快地启动其应用程序。具体来说,我们观察到容器启动时间快了约 35-70%。
结论
在本文中,我们向您展示了将 SOCI 索引引入 SageMaker Studio 如何改善机器学习从业者的开发者体验。通过延迟加载优化容器启动时间——将等待时间从几分钟减少到一分钟以内——AWS 帮助数据科学家、ML 工程师和开发人员花费更少的时间等待,将更多时间用于创新。这一改进解决了迭代式 ML 开发中最常见的摩擦点之一,即频繁的环境切换和重启会影响生产力。有了 SOCI,团队可以保持开发速度,试验不同的框架和配置,从而加速从实验到生产部署的进程。
🚀 想要体验更好更全面的AI调用?
欢迎使用青云聚合API,约为官网价格的十分之一,支持300+全球最新模型,以及全球各种生图生视频模型,无需翻墙高速稳定,文档丰富,小白也可以简单操作。
作者简介
Pranav Murthy 是 AWS 的一名资深生成式 AI 数据科学家,专注于帮助组织在 Amazon SageMaker AI 上利用生成式 AI、深度学习和机器学习进行创新。在过去的 10 多年里,他开发并扩展了先进的计算机视觉 (CV) 和自然语言处理 (NLP) 模型,以解决高影响力的难题——从优化全球供应链到实现实时视频分析和多语言搜索。当他不构建 AI 解决方案时,Pranav 喜欢下棋等策略游戏、旅行探索新文化,以及指导有抱负的 AI 从业者。您可以在 LinkedIn 上找到 Pranav。
Raj Bagwe 是亚马逊云计算公司 (Amazon Web Services) 的一名资深解决方案架构师,常驻加利福尼亚州旧金山。在 AWS 工作超过 6 年,他帮助客户应对复杂的技术挑战,专长于云架构、安全和迁移。在业余时间,他指导机器人团队并打排球。您可以在 LinkedIn 上找到 Raj。
Nikita Arbuzov 是亚马逊云计算公司 (Amazon Web Services) 的一名软件开发工程师,在纽约工作和维护 SageMaker Studio 平台及其应用程序。拥有超过 3 年的后端平台延迟优化经验,他致力于改善 SageMaker AI 和 SageMaker 统一 Studio 的客户体验和可用性。在业余时间,Nikita 喜欢进行各种户外活动,如山地自行车、皮划艇和单板滑雪,喜欢在美国各地旅行,并热衷于结交新朋友。您可以在 LinkedIn 上找到 Nikita。
评论区