在本系列文章中,将探讨Docker在机器学习(ML)场景中的使用。假设已经熟悉机器学习、容器化技术以及Docker。可以通过下载项目代码来跟随步骤。
理论上,可以使用之前的实验容器进行生产推理。然而,推荐的做法是尽可能保持镜像的简单和小巧。这意味着需要移除推理过程中不需要的任何组件,比如多余的包、Jupyter Notebook或构建工具(如果之前包含了这些)。
numpy==1.19.5
opencv-python==4.5.1.48
tensorflow-cpu==2.4.0
这里添加NumPy是为了将其固定在一个特定版本(不同版本可能作为TensorFlow的依赖项被安装)。不幸的是,Python库的更新经常引入破坏性变更或错误。添加明确的固定版本要求——即使是间接依赖——有助于在重新创建环境时避免头痛问题。
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语句来安装系统组件。
Dockerfile中的最后两行与之前的版本不同:
COPY app /home/$USERNAME/app
ENTRYPOINT ["python", "predict.py"]
接下来,为应用程序定义了ENTRYPOINT。它是一种前缀,用于容器启动时执行的任何命令。使用Dockerfile或docker run命令添加的任何CMD语句将作为参数添加到ENTRYPOINT语句中。
下载应用程序代码和数据后,可以构建镜像:
$ 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语句的命令中。这次只映射了包含数据的文件夹,依赖于嵌入在镜像中的应用程序代码(和训练好的模型)。