中文内容
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 的各种机制:

深度学习容器拉取机制
解决方案架构
下图展示了将 SOCI 与 DLAMI 和 Deep Learning Containers 结合使用的架构。

使用 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。
关于作者



