首次运行 nvidia-docker2 容器非常慢
Posted
技术标签:
【中文标题】首次运行 nvidia-docker2 容器非常慢【英文标题】:First run of a nvidia-docker2 container very slow 【发布时间】:2019-02-06 11:14:07 【问题描述】:在 EC2 p2.xlarge 实例上运行支持 GPU 的 docker 容器时,我在容器开始运行之前遇到了 30 到 90 秒的延迟。后续容器快速启动(延迟 1 秒)。
EC2 运行 ubuntu 18.04,NVIDIA 驱动程序版本 396.54 和 nvidia-docker2(按照官方安装指南:https://github.com/NVIDIA/nvidia-docker)
我正在使用最新的官方 CUDA 映像进行测试: docker run --rm nvidia/cuda nvidia-smi
我的机器上启用了持久模式。如https://github.com/NVIDIA/nvidia-docker/wiki/Frequently-Asked-Questions#how-do-i-install-the-nvidia-driver 中所述,“为什么我的容器从 2.0 开始很慢?”它应该是解决方案,但对我不起作用。
感谢任何可能导致延迟的想法以及如何解决它。
【问题讨论】:
也许问的很明显,但是您是否在第一次执行之前拉取了 nvidia/cudai 图像?如果不是,那是预期的行为,因为它必须首先拉取图像,它们至少有 0.5 GB。 是的,我确实先拉取了图像。 30到90秒的延迟不包括拉取镜像所需的时间 【参考方案1】:我在 cmets 中看到您已经从互联网上提取了 Docker 映像,但您确定该映像没有保存到 EBS 快照中吗?例如,在使用 NVIDIA Docker 创建 AMI 期间,您可能已拉取该映像并将其保存到根 AMI 卷。
如果是这种情况,那么由于 EBS 卷是如何从快照中恢复的,您会遇到这种延迟。
来自 AWS 文档 (Initializing Amazon EBS Volumes):
...从快照还原的卷上的存储块必须先初始化(从 Amazon S3 拉下并写入卷),然后您才能访问该块。此初步操作需要时间,并且会导致第一次访问每个块时 I/O 操作的延迟显着增加。
因此,当您第一次运行 Docker 容器时,AWS 会将数据从 S3 下载到您的 EBS 卷,这需要一些时间。第二次你的容器启动很快,因为数据已经在卷上。
【讨论】:
您的答案似乎指向了正确的方向 - 初始化 EBS 卷后,容器启动速度要快得多。但与您的假设相反,该映像是在 EC2 启动后下载的,并且不包含在 AMI 中。我还注意到,在容器运行后从 EC2 创建 AMI(新的 AMI 包含退出的容器)时,延迟要短得多。 您确定要下载图像的所有图层吗?也许您正在下载的图像基于已下载到该卷的另一个图像。在下载之前使用以下命令检查现有图像:$ docker images -a
。如果有,请尝试将其全部删除:$ docker rmi $(docker images -a -q)
,然后下载您的图像。
卷上没有图像。在实例启动后下载所有图像层。以上是关于首次运行 nvidia-docker2 容器非常慢的主要内容,如果未能解决你的问题,请参考以下文章
在 docker 中使用 OpenGL 和 nvidia-docker2
如何确保容器运行时是 kubernetes 节点的 nvidia-docker?
Ubuntu 18.04安装Docker CE + NVIDIA-Docker