65.9K
CodeProject 正在变化。 阅读更多。
Home

在 Docker 容器中运行 AI 模型

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2021年4月27日

CPOL

3分钟阅读

viewsIcon

12785

downloadIcon

125

在本文中,我们将创建一个容器来对训练后的模型运行 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 调整此镜像。

© . All rights reserved.