Docker在机器学习中的应用

在本系列文章中,将探讨在机器学习(ML)场景中使用Docker的情况。本系列假定已经熟悉ML、容器化以及Docker。可以随时下载项目代码进行实践。

树莓派上设置Docker

树莓派官方支持Docker,因此安装过程相当直接。在树莓派4/400上成功测试了Docker,该设备配备了4GB RAM,并且运行了Raspberry Pi OS (32位)和Ubuntu Server 20.04.2 LTS (64位)。可以在官方Docker网站上找到任何支持的操作系统的详细安装说明。

最简单的安装方法是使用便利脚本,尽管这不推荐用于生产环境。幸运的是,“手动”安装过程也不是特别复杂。对于64位Ubuntu服务器操作系统,安装过程如下:

$ sudo apt-get update $ sudo apt-get install apt-transport-https ca-certificates curl gnupg $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg $ echo "deb [arch=arm64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null $ sudo apt-get update $ sudo apt-get install docker-ce docker-ce-cli containerd.io

对于不同的操作系统版本,需要相应地更新加粗的ubuntu和arm64。为了以非root用户身份访问Docker命令,应该在执行后注销并重新登录:

$ sudo usermod -aG docker

ARM的Dockerfile

尽管在之前的文章中使用的Python基础镜像适用于ARM处理器,但它们可能不是最佳选择。对于ARM架构,类似于Alpine OS,许多Python库没有预编译且打包成wheel。它们需要在安装过程中编译,这可能需要很长时间。

作为替代方案,可以依赖操作系统中包含的Python。这不是通常会做的事情,但使用Docker并无大碍。只需要每个容器有一个Python环境。将失去一些Python版本的灵活性,但能够从许多编译的系统级Python库中选择将为节省大量时间并减少生成的镜像大小。

这就是为什么将使用debian:buster-slim镜像作为基础。它附带了Python 3.7,这对所有的用途来说应该足够了,因为它满足了将要运行的所有库和AI/ML代码的要求。

经过几次尝试并在过程中添加了缺失的系统库,得到了以下Dockerfile来处理推理:

FROM debian:buster-slim ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update \ && apt-get -y install --no-install-recommends build-essential libhdf5-dev pkg-config protobuf-compiler cython3 \ && apt-get -y install --no-install-recommends python3 python3-dev python3-pip python3-wheel python3-opencv \ && apt-get autoremove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/* RUN pip3 install --no-cache-dir setuptools==54.0.0 RUN pip3 install --no-cache-dir https://github.com/bitsy-ai/tensorflow-arm-bin/releases/download/v2.4.0/tensorflow-2.4.0-cp37-none-linux_aarch64.whl ARG USERNAME=mluser ARG USERID=1000 RUN useradd --system --create-home --shell /bin/bash --uid $USERID $USERNAME USER $USERNAME WORKDIR /home/$USERNAME/app COPY app /home/$USERNAME/app ENTRYPOINT ["python3", "predict.py"]

请注意,这次在apt-get部分安装了python3-opencv系统库,而不是使用pip。不能以相同的方式安装NumPy,因为操作系统版本与TensorFlow的要求不匹配。不幸的是,这意味着需要编译NumPy,以及一些其他TensorFlow依赖项。

尽管如此,主要的包不需要编译,因为使用了在GitHub上发布的适用于Raspberry Pi的wheel。如果更喜欢使用32位的Raspberry Pi OS,需要相应地更新Dockerfile中的TensorFlow链接。

构建镜像并运行容器

下载项目代码(包含训练好的模型和样本数据)后,可以构建镜像:

$ docker build --build-arg USERID=$(id -u) -t mld04_arm_predict .

此操作可能需要超过30分钟才能完成(至少在树莓派4/400上是这样)。虽然不是闪电般的速度,但如果需要编译许多库,它可能会花费更长的时间。

最后,可以在“边缘”上运行预测:

$ docker run -v $(pwd)/data:/home/mluser/data --rm --user $(id -u):$(id -g) mld04_arm_predict --images_path /home/mluser/data/test_mnist_images.jpg
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485