Docker在机器学习中的应用

在本系列文章中,将探讨Docker在机器学习(ML)场景中的使用。假设已经熟悉机器学习、容器化技术以及Docker。可以通过下载项目代码来跟随步骤。

为什么需要单独的容器进行推理?

理论上,可以使用之前的实验容器进行生产推理。然而,推荐的做法是尽可能保持镜像的简单和小巧。这意味着需要移除推理过程中不需要的任何组件,比如多余的包、Jupyter Notebook或构建工具(如果之前包含了这些)。

依赖管理

numpy==1.19.5 opencv-python==4.5.1.48 tensorflow-cpu==2.4.0

这里添加NumPy是为了将其固定在一个特定版本(不同版本可能作为TensorFlow的依赖项被安装)。不幸的是,Python库的更新经常引入破坏性变更或错误。添加明确的固定版本要求——即使是间接依赖——有助于在重新创建环境时避免头痛问题。

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语句来安装系统组件。

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语句的命令中。这次只映射了包含数据的文件夹,依赖于嵌入在镜像中的应用程序代码(和训练好的模型)。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485