元鉴
返回中文阅读流

AWS Machine Learning Blog

在 DLAMI 和 DLC 上使用 SOCI 索引缩短容器冷启动时间

在本文中,我们将介绍如何在公开可用的 Deep Learning AMI 和容器上使用 SOCI,何时使用该工具提供的各种 SOCI 模式,以及如何在当前工作负载中快速高效地使用此工具。

中文内容

已翻译official company source英文原文2026-06-03

Deep Learning AMI 和 AWS Deep Learning Containers 现已支持 SOCI snapshotter 和索引。Seekable OCI(SOCI)是一项通过选择性文件下载实现高效容器镜像管理的技术。它使用基于层的索引系统来映射容器镜像中的文件位置,使容器能够仅加载必要文件即可启动(延迟加载)。这种方法减少了网络带宽使用量并缩短了容器启动时间,对于在云环境中管理大型容器镜像的组织尤其有价值。

在本文中,我们将介绍如何在公开可用的 Deep Learning AMIs 和 Containers 上使用 SOCI、何时使用该工具提供的各种 SOCI 模式,以及如何在当前工作负载中快速高效地使用该工具。

背景

随着各组织大规模部署人工智能(AI)和机器学习(ML)工作负载,容器启动时间已成为生产环境中的瓶颈。无论是启动训练作业、提供推理端点,还是自动扩展 GPU 集群,下载数 GB 容器镜像所花费的时间都会直接影响成本、用户体验和运营效率。传统的容器部署方法要求团队在工作负载开始之前下载完整镜像。对于生产中常用的镜像,这一过程可能需要数分钟才能启动。在开发过程中,几分钟的等待时间几乎不易察觉。但在生产环境中,这些时间会迅速累积。

大规模部署深度学习基础设施的组织通常会遇到几个关键挑战:

  • 冷启动时间过长。15–20 GB 的标准 Docker 镜像拉取每个实例可能需要 4–6 分钟,在扩展事件期间会延迟训练作业和推理端点。
  • 计算资源浪费。GPU 实例在镜像拉取期间处于空闲状态,在等待容器初始化完成时消耗昂贵的计算时长。
  • 扩展瓶颈。当需求激增触发自动扩展时,容器启动时间缓慢会阻碍快速响应,导致性能下降或请求被丢弃。
  • 带宽限制。大规模部署同时拉取庞大的镜像可能会耗尽网络带宽,在整个基础设施中造成级联延迟。
  • 开发者生产力。在迭代开发和实验周期中,数据科学家和机器学习工程师会浪费宝贵时间等待容器启动。

容器拉取机制

在为您的工作负载拉取容器时,AWS Deep Learning AMIs(DLAMI)和 Deep Learning Containers 提供三种选项:标准 Docker 拉取、SOCI 并行拉取,以及通过 SOCI 索引进行 SOCI 懒加载。可以将它们视为一系列权衡取舍的滑动刻度。Docker 拉取是顺序执行的,速度较慢。SOCI 并行拉取通过分块下载来提供更快的启动时间,但会消耗计算资源。SOCI 懒加载可提供近乎即时的容器加载,但需要按需获取文件。您可以使用以下指南为您的工作负载选择合适的机制:

  • 懒加载模式和并行拉取模式之间的选择取决于镜像、实例规格和存储配置。懒加载要求镜像具有 SOCI 索引。如果没有,系统会回退到标准拉取。
  • 规格较低的实例应使用懒加载以节省资源,而具有多个 vCPU 和高网络带宽的高规格实例则可从并行拉取模式中受益。存储性能各不相同:EBS 卷受其预置 IOPS 和卷类型限制,在解包期间可能形成瓶颈;而 NVMe 实例存储可提供最高 I/O 性能,但代价是在实例停止/启动周期之间无法保持数据持久性。

以下示例展示了基于 vLLM Deep Learning Container 的各种机制:

Comparison of container pull mechanisms showing Docker sequential pull, SOCI parallel pull, and SOCI lazy loading with relative startup times

深度学习容器拉取机制

解决方案架构

下图展示了将 SOCI 与 DLAMI 和 Deep Learning Containers 结合使用的架构。

Solution architecture showing SOCI snapshotter integration with DLAMI and Deep Learning Containers on Amazon EC2

使用 SOCI snapshotter 的容器启动时间对比

以下基准测试比较了标准 Docker 拉取与 SOCI snapshotter 在延迟加载和并行拉取模式下的表现。

延迟加载模式

延迟加载模式通过仅按需获取必要数据来立即启动容器,其余层会根据需要在后台加载。

先决条件

需要 SOCI 索引

重要:延迟加载模式要求容器镜像在注册表中存储有 SOCI 索引。如果没有 SOCI 索引,snapshotter 将回退到标准拉取行为,你将看不到任何性能提升。带有 -soci 标签后缀的 AWS Deep Learning Containers(DLCs)已预先创建 SOCI 索引并推送到注册表,可开箱即用地启用延迟加载。对于自定义镜像,你必须创建并推送 SOCI 索引。

环境

  • 实例类型:g5.2xlarge
  • EBS:大小 500GiB,IOPS 3000,吞吐量 125
  • 正文:AMI:Deep Learning Base OSS Nvidia Driver GPU AMI (Ubuntu 24.04) 20260413 ( ami-06abbbf2049359343 )
  • Docker 镜像:public.ecr.aws/deep-learning-containers/vllm:0.19.0-gpu-py312-ec2-soci
  • 镜像大小:9.72GB(压缩后),32.7GB(磁盘占用)
  • 网络:Corp

使用 Docker 启动容器(非 SOCI)

我们使用 Docker 直接启动推理服务器。由于本地不存在镜像,Docker 会在启动容器之前拉取并解压整个镜像。

总时间:6分59.099秒。

#!/bin/bash
time docker run \
    --gpus all \
    -d \
    -v ~/.cache/huggingface:/root/.cache/huggingface \
    --env "HUGGING_FACE_HUB_TOKEN=$HUGGING_FACE_HUB_TOKEN" \
    -p 8000:8000 \
    --ipc=host \
    public.ecr.aws/deep-learning-containers/vllm:0.19.0-gpu-py312-ec2-soci \
    --model mistralai/Mistral-7B-v0.1
# output
Unable to find image 'public.ecr.aws/deep-learning-containers/vllm:0.19.0-gpu-py312-ec2-soci' locally
0.19.0-gpu-py312-ec2-soci: Pulling from deep-learning-containers/vllm
340d44d2921c: Pull complete
....2001a2421bf1: Pull complete
Digest: sha256:a6344c96a33ef98a32a27f89b41b8c0529d4fbbba248eb57f811725d415f68fc
Status: Downloaded newer image for public.ecr.aws/deep-learning-containers/vllm:0.19.0-gpu-py312-ec2-soci
e12d969eb71517d9a6a23b9b11cfa22ddda26a95f6a0f0d8df00cd5c4fdfe912

real    6m59.099s
user    0m0.391s
sys     0m0.452s

使用 SOCI snapshotter(延迟加载)启动容器

我们使用带有 SOCI snapshotter 的 nerdctl 来启动推理容器。尽管本地不存在镜像,但经过 SOCI 索引的镜像允许 nerdctl 仅拉取索引和启动容器所需的必要层,从而实现其余层的延迟加载。总耗时:21.125 秒。

#!/bin/bash
time sudo nerdctl run \
     --snapshotter soci \
    --gpus all \
    -d \
    -v ~/.cache/huggingface:/root/.cache/huggingface \
    --env "HUGGING_FACE_HUB_TOKEN=$HUGGING_FACE_HUB_TOKEN" \
    -p 8000:8000 \
    --ipc=host \
    public.ecr.aws/deep-learning-containers/vllm:0.19.0-gpu-py312-ec2-soci \
    --model mistralai/Mistral-7B-v0.1
# output
public.ecr.aws/deep-learning-containers/vllm:0.19.0-gpu-py312-ec2-soci:           resolved       |++++++++++++++++++++++++++++++++++++++|
index-sha256:a6344c96a33ef98a32a27f89b41b8c0529d4fbbba248eb57f811725d415f68fc:    done           |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:d91ad3b46204eace6de2fb27c46d9600337fa9c124b4c82fe0f335d391017daa: done           |++++++++++++++++++++++++++++++++++++++|
config-sha256:886ed36d57c44081a74a0ab052f57366d96ab2c0fe39bb3e2f8a46cc20db8ec2:   done           |++++++++++++++++++++++++++++++++++++++|
elapsed: 10.5s                                                                    total:  48.1 K (4.6 KiB/s)
189307b7899438415f3df4288b3fbb26bcc4cd43678e88ec3b062bc6330e3e3b

real    0m21.125s
user    0m0.004s
sys     0m0.011s

延迟加载总结

使用带有延迟加载的 SOCI snapshotter,容器在 21.125 秒内启动,而使用标准 Docker 则需要 6 分 59.099 秒。这一改进是因为 SOCI 只拉取启动容器所需的必要层,其余层会在需要时按需加载。

并行拉取模式

延迟加载模式通过按需仅获取所需数据来立即启动容器,而并行拉取模式会在启动前下载整个镜像,但其并发度高于标准 Docker 拉取。该模式适用于需要在启动时完整镜像可用,或运行 I/O 密集型工作负载的场景。

环境

  • 实例类型:g5.4xlarge
  • EBS:500GiB gp3,16000 IOPS,1000 MB/s 吞吐量
  • 正文:AMI:Deep Learning Base OSS Nvidia Driver GPU AMI (Ubuntu 24.04) 20260413 ( ami-06abbbf2049359343 )
  • Docker 镜像:763104351884.dkr.ecr.us-east-1.amazonaws.com/sglang:0.5.10-gpu-py312-cu129-ubuntu24.04-sagemaker
  • 镜像大小:19.32GB(压缩后),60.4GB(磁盘使用量)
  • 网络:Corp

注意:我们在此基准测试中使用私有 ECR 镜像,因为公共 ECR 由 Amazon CloudFront 作为前端,后者会限制网络带宽并影响并行模式性能。私有 ECR 直接由 Amazon Simple Storage Service(Amazon S3)提供服务,可提供更高的吞吐量。

启用并行拉取模式

Deep Learning AMI 上的 SOCI snapshotter 默认采用延迟加载模式。要启用并行拉取模式,请修改 /etc/soci-snapshotter-grpc/config.toml 处的配置文件:

# Parallel Pull Mode - significantly improves image pull times for large AI/ML images
# These are conservative defaults recommended by AWS for ECR
[pull_modes.parallel_pull_unpack]
enable = true # false(default): lazy loading/true: parallel mode
max_concurrent_downloads = -1 # unlimited global cap across all images
max_concurrent_downloads_per_image = 20 # per-image download connections
concurrent_download_chunk_size = "16mb"
max_concurrent_unpacks = -1 # unlimited global cap across all images
max_concurrent_unpacks_per_image = 10 # per-image parallel unpack threads
discard_unpacked_layers = true

通过重启服务来应用配置:

sudo systemctl restart soci-snapshotter.service

提示:你可以根据实例类型和网络带宽调整 max_concurrent_downloads_per_image 和 max_concurrent_unpacks_per_image。如需详细的调优指导,请参阅 Introducing Seekable OCI Parallel Pull Mode for Amazon EKS。

验证并行模式是否处于活动状态

在拉取镜像期间监控 SOCI snapshotter 日志,以确认并行模式已启用:

journalctl -u soci-snapshotter -f

查找表明并行拉取/解包的日志条目:

Apr 16 23:59:08 ip-172-31-86-91 soci-snapshotter-grpc[3108]:
  {"layerDigest":"sha256:e87500e698966458d9dfc34df84602985c9821f39666619792fe6282aa6df5d4",
   "level":"info",
   "msg":"preparing snapshot with parallel pull/unpack",
   "time":"2026-04-16T23:59:08.654819383Z"}

使用 Docker 拉取镜像(非 SOCI)

标准 Docker 拉取会下载并提取层,并发度有限。

总耗时:4 分 44.163 秒

time docker pull \
  763104351884.dkr.ecr.us-east-1.amazonaws.com/sglang:0.5.10-gpu-py312-cu129-ubuntu24.04-sagemaker

Digest: sha256:fd0cf60bbb34a5d30f22595215a633e5d4a7260fc0868aabe3f04b1174b7365d
Status: Downloaded newer image for
  763104351884.dkr.ecr.us-east-1.amazonaws.com/sglang:0.5.10-gpu-py312-cu129-ubuntu24.04-sagemaker
763104351884.dkr.ecr.us-east-1.amazonaws.com/sglang:0.5.10-gpu-py312-cu129-ubuntu24.04-sagemaker

real    4m44.163s
user    0m0.339s
sys     0m0.423s

使用 SOCI 并行模式拉取镜像

将 nerdctl 与 SOCI 并行拉取模式一起使用,会在下载和解包操作中提高并发度。

总时间:2分12.846秒

time sudo nerdctl pull --snapshotter soci \
  763104351884.dkr.ecr.us-east-1.amazonaws.com/sglang:0.5.10-gpu-py312-cu129-ubuntu24.04-sagemaker

763104351884.dkr.ecr.us-east-1.amazonaws.com/sglang:0.5.10-gpu-py312-cu129-ubuntu24.04-sagemaker:
  resolved       |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:fd0cf60bbb34a5d30f22595215a633e5d4a7260fc0868aabe3f04b1174b7365d:
  done           |++++++++++++++++++++++++++++++++++++++|
config-sha256:5e6a53b7478b0631dd3c4222ab6619dae3a3dd32a565921f10b0b03fdc316d46:
  done           |++++++++++++++++++++++++++++++++++++++|
elapsed: 132.8s    total:  89.3 K (688.0 B/s)

real    2m12.846s
user    0m0.018s
sys     0m0.075s

并行拉取摘要

使用 SOCI 并行拉取模式将镜像拉取时间从 4 分 44 秒缩短至 2 分 12 秒,拉取性能提升了 2.2 倍。

结论

SOCI snapshotter 同时提升了容器启动和镜像拉取操作的性能:

  • 懒加载模式——容器启动时间提升了 20 倍(从 6 分钟以上缩短至约 21 秒)
  • 并行拉取模式——镜像拉取时间提升了 2.2 倍(从 4 分 44 秒缩短至 2 分 12 秒)

当你需要尽可能快地启动容器时,选择延迟加载模式;当你需要在工作负载开始前完整镜像可用时,选择并行拉取模式。

清理

如果你启动了 EC2 实例来测试 SOCI snapshotter,请终止这些实例,以避免产生持续费用。删除你在测试期间推送到 Amazon Elastic Container Registry(Amazon ECR)的所有容器镜像,并移除不再需要的任何 SOCI 索引。

SOCI 入门

DLAMI 和 Deep Learning Containers 现已公开提供 SOCI snapshotter 和 SOCI index。有关公开可用的 DLAMI 和 Deep Learning Containers 的更多信息,您可以查看 SOCI Index DLAMI 以选择支持 SOCI 的镜像,并查看 Deep Learning Container repository 以获取有关带有 SOCI index 的受支持镜像的更多信息。

有关详细的配置指南和最佳实践,请参阅 SOCI documentation 和 Deep Learning Container SOCI documentation。

关于作者

原文标题

Reducing container cold start times using SOCI index on DLAMI and DLC