用于 AI 对象检测的多阶段 Docker 构建





5.00/5 (3投票s)
在本文中,我们使用容器化的对象检测 API 环境,通过 TensorFlow 对示例图像进行推理。
引言
Docker 等容器技术简化了依赖管理并提高了软件的可移植性。在本系列文章中,我们将探讨 Docker 在机器学习 (ML) 场景中的应用。
本系列假定您熟悉 AI/ML、容器化(一般)以及 Docker(具体)。
在上一篇文章中,我们利用 Nvidia GPU 的强大功能来缩短简单 TensorFlow 模型的训练和推理时间。在本文中,我们将在此基础上进行扩展。我们将使用多阶段构建来创建一个用于推理的容器,其中包含TensorFlow 对象检测 API。欢迎下载本文使用的代码。
在本系列的后续文章中,我们将使用PyTorch和Transformers处理涉及自然语言处理 (NLP) 任务的大型模型。首先,我们将进行推理;然后,我们将通过 Rest API 提供推理模型。接下来,我们将调试在容器中运行的 Rest API 服务。最后,我们将使用Azure Container Instances将创建的容器发布到云端。
为什么使用多阶段构建?
在许多情况下,容器构建过程包含比简单的包安装或文件复制更复杂的步骤。它可能涉及代码编译,有时还包括从 GitHub 等外部存储库下载代码。
通常,您应该避免在创建的容器中包含构建工具,以减小容器镜像的大小并提高其安全性。如果您在使用后简单地删除了这些工具,它们可能仍然存在于容器的某个层中,因此最终大小不会减小。
在这种情况下,Docker 的最佳实践之一是使用多阶段构建。
对象检测 API
TensorFlow 对象检测 API位于TensorFlow Model Garden仓库的研究文件夹中。此文件夹包含用于在图像中检测对象的精选代码实现和预训练模型,例如DeepMAC和Context R-CNN。这些模型可能是最先进的,但它们还不是官方的 TensorFlow 模型。
对象检测 API 的安装涉及多个步骤,其中一些步骤很麻烦,因此使用 Docker 在这里非常有帮助。理论上,我们可以使用 TensorFlow 仓库中提供的 Dockerfile(例如,这个)。但是,我们将创建自己的 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/*
请注意 FROM
语句中的 AS buildimg_base
子句。它定义了内部镜像名称,我们将在后续步骤中使用该名称。
Dockerfile 第二阶段 (构建)
现在我们需要下载对象检测 API 仓库并进行构建。我们首先扩展先前创建的 Dockerfile,引用 buildimg_base
内部镜像。
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 代码。不幸的是,我们不能依赖标签,因为此仓库在标记(官方)版本中不包含 research 文件夹。
用于推理的 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。我们使用容器化的对象检测 API 环境,通过 TensorFlow 对示例图像进行了推理。在本系列的后续文章中,我们将继续处理大型模型。这些模型将使用PyTorch和Transformers处理自然语言处理 (NLP) 任务。敬请关注!