将requirements.txt中的包添加到Docker映像中,以最大限度地减少EC2上的冷启动时间



当从Docker映像在EC2上部署机器学习模型时,冷启动时间很高,因为实例从requirements.txt下载包和文件,即使dockerfile包含pip install来安装所有这些包。

启动时的一些样本输出:

021-11-21 05:28:57.632740:cortex:pid-1:INFO:downloading the project code
2021-11-21 05:28:57.746448:cortex:pid-1:INFO:downloading the python serving image
Looking in links: https://download.pytorch.org/whl/torch_stable.html
Collecting imutils
Downloading imutils-0.5.4.tar.gz (17 kB)
Collecting tensorflow==2.4.1
Downloading tensorflow-2.4.1-cp36-cp36m-manylinux2010_x86_64.whl (394.3 MB)
Collecting opencv-python==4.1.2.30
Downloading opencv_python-4.1.2.30-cp36-cp36m-manylinux1_x86_64.whl (28.3 MB)
Collecting pillow==7.0.0
Downloading Pillow-7.0.0-cp36-cp36m-manylinux1_x86_64.whl (2.1 MB)
Collecting flask-cors==3.0.8
Downloading Flask_Cors-3.0.8-py2.py3-none-any.whl (14 kB)
Requirement already satisfied: boto3 in /opt/conda/envs/env/lib/python3.6/site-packages (from -r /mnt/project/requi
rements.txt (line 6)) (1.13.7)
Collecting torch==1.8.1+cu101
Downloading https://download.pytorch.org/whl/cu101/torch-1.8.1%2Bcu101-cp36-cp36m-linux_x86_64.whl (763.6 MB)
Collecting torchvision==0.9.1+cu101
Downloading https://download.pytorch.org/whl/cu101/torchvision-0.9.1%2Bcu101-cp36-cp36m-linux_x86_64.whl (17.3 MB)

与其为每个启动的EC2实例下载并安装这些文件,不如在Docker构建过程中一次性下载并将这些文件合并到Docker映像中?

Dockerfile

FROM nvidia/cuda:11.4.0-runtime-ubuntu18.04
WORKDIR /usr/src/app
RUN apt-get -y update && 
apt-get install -y --fix-missing 
build-essential 
cmake 
python3 
python3-pip 
ffmpeg 
libsm6 
libxext6 
&& apt-get clean && rm -rf /tmp/* /var/tmp/*
ADD ./requirements.txt ./
# install our dependencies
RUN python3 -m pip install --upgrade pip && python3 -m pip install -r requirements.txt && apt-get clean && rm -rf /tmp/* /var/tmp/*
ADD ./ ./
ENV LC_ALL=C.UTF-8 
ENV LANG=C.UTF-8
EXPOSE 8080
CMD ["uvicorn", "api:app", "--host", "0.0.0.0", "--port", "8080","--log-level", "debug"]

需求.txt

torch==1.9.0
ffmpeg_python==0.1.17
fastai==1.0.51
boto3==1.18.15
botocore==1.21.15
scikit_image==0.17.2
requests==2.26.0
torchvision==0.10.0
opencv_python==4.5.3.56
starlette==0.14.2
scipy==1.5.4
numpy==1.19.5
fastapi==0.68.0
ffmpeg==1.4
ipython==7.16.1
Pillow==8.3.1
tensorboardX==2.4
uvicorn
python-multipart
youtube_dl==2021.6.6
uvloop

我认为,

AS-IS:

(本地(

编写代码和Docker

=>推送远程git服务器

(EC2(

拉吉特回购

=>运行Dockerfile

未来:

(本地(

编写代码和Docker

=>推送远程git服务器

=>构建Docker镜像(通过github操作或手动(

=>将Docker镜像推送到容器注册表(通过github操作或手动(

(EC2(

提取Docker图像

=>运行Docker镜像

根据您提供的信息进行一些猜测,似乎您正在使用Cortex来部署您的工作负载。您尝试在容器中预安装python依赖项,这样您就不必每次启动容器时手动下载它们。日志文件来自容器中的应用程序。尽管您已经在容器操作系统中安装了它们,但Cortex很可能会使用虚拟环境来再次分离作业和下载需求。这就是虚拟环境的工作方式,实际上这是EC2映像支持不同作业的唯一方式,每个作业都有不同的要求。

提供更多详细信息以获得进一步帮助。

这不是一个正确的答案,但我希望它会有所帮助。

根据你在问题中提供的错误跟踪,以及其他答案中指出的,你似乎在使用Cortex。

请考虑审查这个Github问题。它描述了您所指示的行为。特别考虑一下David Eliahu的第一条评论:

"下载python服务图像";是指下载API的docker镜像。

默认情况下,映像托管在quay.io上,并且可能具有依赖项安装了您不需要的。所以,加快速度的最好方法是缩小图像,并在ECR上与您的集群(假设您在AWS上运行(。这是我们的文档对于这两种方法:https://docs.cortex.dev/workloads/managing-dependencies/images

提供的链接已断开,尽管在《产品生产指南》中,尤其是在本文中,仍然建议使用并置图像方法。

不幸的是,它只提供了如何最大限度地减少映像提取时间的建议,但没有说明如何加快实际的容器引导过程。

前面提到的问题讨论了优化图像使其更小,但文档中似乎不再对此进行描述。

相关内容

最新更新