目录
介绍
为什么要多阶段构建?
对象检测API
Dockerfile第一个共享阶段
Dockerfile第二阶段(构建)
Dockerfile推理的第三阶段
构建镜像
运行对象检测推理
总结
- 下载项目文件 - 4.9 KB
Docker 等容器技术可简化依赖项管理并提高软件的可移植性。在本系列文章中,我们探讨了Docker在机器学习(ML)场景中的使用。
本系列假设您熟悉AI/ML、容器化,尤其是Docker。
在上一篇文章中,我们利用Nvidia GPU的强大功能来减少简单TensorFlow模型的训练和推理时间。在本文中,我们将建立在已实现的解决方案之上。我们将使用多阶段构建来创建一个容器,用于使用TensorFlow Object Detection API进行推理。欢迎您下载本文中使用的代码。
在本系列的后续文章中,我们将使用PyTorch和Transformers处理处理自然语言处理(NLP)任务的大型模型。首先,我们将运行推理,然后我们将通过Rest API提供推理模型。接下来,我们将调试在容器中运行的Rest API服务。最后,我们将使用Azure 容器实例在云中发布创建的容器。
为什么要多阶段构建?在许多情况下,容器构建过程包括比简单的包安装或文件复制更复杂的步骤。它可能涉及代码编译,有时先从外部存储库(例如GitHub)下载该代码。
作为一般规则,您应该避免在创建的容器中包含构建工具以减小容器镜像大小并提高其安全性。如果在使用完这些工具后简单地将它们移除,它们可能仍然存在于其中一个容器层中,因此最终尺寸不会减小。
在这种情况下,Docker的最佳实践之一是使用多阶段构建。
对象检测APITensorFlow对象检测API位于TensorFlow 模型花园存储库的研究文件夹中。此文件夹包含用于检测镜像中的对象的选定代码实现和预训练模型,例如DeepMAC和Context R-CNN。这些模型可能是最先进的,但它们还不是官方的TensorFlow模型。
对象检测API安装涉及多个步骤,其中一些步骤很麻烦,因此使用Docker可能真的有帮助。理论上,我们可以使用TensorFlow存储库中提供的Dockerfile(例如,这里)。不过,我们将创建自己的,因为TensorFlow提供的Dockerfile会创建一个大型Docker镜像,其中包含所有构建工具和资源。
Dockerfile第一个共享阶段第一阶段将安装构建和推理所需的所有共享依赖项:
FROM tensorflow/tensorflow:2.4.1-gpu AS buildimg_base
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get -y install --no-install-recommends \
python3-cairocffi \
python3-pil \
python3-lxml \
python3-tk \
&& apt-get autoremove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/*
注意AS buildimg_base语句中的子句FROM。它定义了内部镜像名称,我们将在以下步骤中使用它。
Dockerfile第二阶段(构建)现在我们需要下载对象检测API存储库并构建它。我们首先扩展之前创建的引用buildimg_base内部镜像的Dockerfile :
FROM buildimg_base AS buildimg
ARG DEBIAN_FRONTEND=noninteractive
接下来,我们指示Docker安装构建工具、下载存储库并构建库:
RUN apt-get update && apt-get -y install --no-install-recommends \
protobuf-compiler \
git
WORKDIR /tmp/odsetup
RUN git clone https://github.com/tensorflow/models.git \
&& cd /tmp/odsetup/models \
&& git checkout fea1bf9d622f07638767deeb0acd742d3a5d8af7 \
&& (cd /tmp/odsetup/models/research/ && protoc object_detection/protos/*.proto --python_out=.)
WORKDIR /tmp/odsetup/models/research/
RUN cp object_detection/packages/tf2/setup.py ./ \
&& python -m pip install -U pip \
&& pip install .
请注意我们如何确保使用git checkout特定版本的对象检测API代码。不幸的是,我们不能在此处依赖标签,因为此存储库在已标记的(官方)版本中不包含研究文件夹。
Dockerfile推理的第三阶段现在,我们指示Docker从相同的共享buildimg_base镜像开始,然后复制上一阶段安装的Python库:
FROM buildimg_base
COPY --from=buildimg /usr/local/lib/python3.6 /usr/local/lib/python3.6
为简单起见,我们复制所有库,包括新库object_detection以及100多个其他依赖项。
最后,我们添加一个用户,以确保容器不会以root身份执行:
ARG USERNAME=mluser
ARG USERID=1000
RUN useradd --system --create-home --shell /bin/bash --uid $USERID $USERNAME
USER $USERNAME
WORKDIR /home/$USERNAME
使用Dockerfile中的所有代码,我们可以构建镜像:
$ docker build --build-arg USERID=$(id -u) -t mld06_gpu_tfodapi .
在Windows主机上运行时可以跳过该--build-arg USERID属性。实际上,您不希望在没有GPU支持的机器上运行对象检测API。由于GPU支持仅在Linux主机上可用,因此我们将在本文中重点介绍Linux命令。
准备好镜像后,我们可以使用容器对示例镜像运行预测。
描述如何使用对象检测API进行推理超出了本文的范围——下载我们的代码以继续。
除了我们讨论过的内容之外,我们的Dockerfile还包含一个Python脚本:app/prediction_tutorial.py。该脚本处理示例镜像和对象检测模型的下载,然后对这些示例镜像运行预测。该代码改编自对象检测API教程。
所有部分都准备就绪后,我们可以使用我们的容器运行此代码。为了更容易测试,我们将本地文件夹映射为容器卷。
在支持GPU的Linux Docker上,执行:
$ docker run -v $(pwd)/.keras:/home/mluser/.keras -v $(pwd)/app:/home/mluser/app \
--rm --user $(id -u):$(id -g) --gpus "device=0" \
mld06_gpu_tfodapi python app/prediction_tutorial.py
要在没有GPU的机器上运行相同的容器,请删除该--gpus "device=0"属性。
如果一切顺利,您应该会看到类似于以下内容的日志:
因为我们已经将容器文件夹/home/mluser/.keras映射到我们的本地路径,所以我们还可以检查保存在.keras/predictions文件夹中的预测的镜像。
总结在本文中,我们在一个中等复杂的案例中使用了Docker。我们已经使用TensorFlow使用容器化的ObjectDetection API环境对示例镜像进行了推理。在本系列的后续文章中,我们将继续处理大型模型。这些模型将使用PyTorch和Transformers处理自然语言处理(NLP)任务。敬请关注!
https://www.codeproject.com/Articles/5302892/Multi-Stage-Docker-Builds-for-AI-Object-Detection