在 Docker 容器中运行 AI 模型





5.00/5 (2投票s)
在本文中,我们将创建一个容器来对训练后的模型运行 CPU 推理。
引言
容器技术,例如 Docker,大大简化了软件的依赖项管理和可移植性。在本系列文章中,我们将探讨 Docker 在机器学习 (ML) 场景中的应用。
本系列假设您熟悉机器学习、一般的容器化以及特别是 Docker。 欢迎下载项目代码。
在前一篇文章中,我们创建了一个用于实验和训练的基础容器。 在本文中,我们将创建一个容器来对训练后的模型运行预测。
为什么为推理使用单独的容器?
理论上,我们可以使用之前的实验容器进行生产推理。 但推荐的方法是使镜像尽可能简单和小型。 这意味着摆脱推理不需要的任何组件,例如冗余包、Jupyter Notebook 或构建工具(如果包含任何这些组件)。
依赖项
虽然我们在前一篇文章中的实验镜像包含多个 ML 库,但我们使用 TensorFlow 训练了我们的模型。 因此,我们可以按如下方式修剪我们的 requirements.txt
numpy==1.19.5
opencv-python==4.5.1.48
tensorflow-cpu==2.4.0
这里添加 NumPy 只是为了将其固定到特定版本(可能会安装其他版本作为 TensorFlow 依赖项)。 不幸的是,Python 库的更新经常会引入重大更改或错误。 添加具有固定版本的显式要求——即使是对于间接依赖项——有助于避免重新创建环境时出现问题。
Dockerfile
我们的大部分 Dockerfile 与前一篇文章中的相同
FROM python:3.8.8-slim-buster
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update \
&& apt-get -y install --no-install-recommends ffmpeg libsm6 libxext6 \
&& apt-get autoremove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/*
ARG USERNAME=mluser
ARG USERID=1000
RUN useradd --system --create-home --shell /bin/bash --uid $USERID $USERNAME
COPY requirements.txt /tmp/requirements.txt
RUN pip3 install --no-cache-dir -r /tmp/requirements.txt \
&& rm /tmp/requirements.txt
USER $USERNAME
WORKDIR /home/$USERNAME/app
因为我们仍然使用 opencv-python,所以我们需要保留 apt-get 语句来安装系统组件。
最后两行与之前的版本不同
COPY app /home/$USERNAME/app
ENTRYPOINT ["python", "predict.py"]
首先,我们将应用程序代码复制到镜像。 复制的app文件夹包含推理代码和我们在前一篇文章中训练的模型。 这样的COPY
语句通常是 Dockerfile 中的最后一条语句之一,这确保了当应用程序代码更改时,只有几个顶层需要重新创建。
接下来,我们为应用程序定义ENTRYPOINT
。 它可以看作是容器启动时将执行的任何命令的前缀。 使用 Dockerfile 或 docker run
命令添加的任何 CMD
语句都将作为参数添加到 ENTRYPOINT
语句。
构建和运行容器
下载我们的应用程序代码和数据后,您可以将镜像构建为 mld03_cpu_predict
(不要忘记末尾的点 (.))
$ docker build --build-arg USERID=$(id -u) -t mld03_cpu_predict .
在 Windows 上,您可以跳过 --build-arg USERID
部分
$ docker build -t mld03_cpu_predict .
构建镜像后,我们运行推理
docker run -v $(pwd)/data:/home/mluser/data --rm --user $(id -u):$(id -g) mld03_cpu_predict
--images_path /home/mluser/data/test_mnist_images/*.jpg
在 Windows 上
docker run -v $(pwd)/data:/home/mluser/data --rm mld03_cpu_predict
--images_path /home/mluser/data/test_mnist_images/*.jpg
请注意,上面的 --images_path
是容器中包含的应用程序的参数。 它附加到 Dockerfile 中 ENTRYPOINT
语句定义的命令。 这次我们只映射包含数据的文件夹,依赖于嵌入在镜像中的应用程序代码(和训练后的模型)。
预期结果如下
使用每个文件名中包含的预期值(“test_
”后面的数字),我们可以确认我们有限数据集的所有预测都是正确的。
摘要
在本文中,我们使用 Docker 容器运行 ML 推理。 在下一篇文章中,我们将针对带有 ARM 处理器的 Raspberry Pi 调整此镜像。