在 ARM 设备上的 Docker 容器中运行 AI 模型





5.00/5 (1投票)
在本文中,我们将为配备 ARM 处理器的树莓派适配我们的镜像。
引言
容器技术,例如 Docker,极大地简化了软件的依赖管理和可移植性。 在本系列文章中,我们将探讨 Docker 在机器学习 (ML) 场景中的应用。
本系列假设您熟悉机器学习、一般的容器化以及特别是 Docker。 欢迎下载项目代码。
在之前的文章中,我们创建了用于实验、训练和推理的基本容器,使用了常规的 Intel/AMD CPU。 在本文中,我们将创建一个容器来处理配备 Raspberry Pi 的 ARM 处理器的推理。
在 Raspberry Pi 上设置 Docker
由于官方支持 Raspberry Pi,Docker 的安装非常简单。
我们已经成功地在配备 4GB RAM 的 Raspberry Pi 4/400 上进行了测试,使用了 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 <your-user-name>
ARM 的 Dockerfile
尽管我们在之前的文章中使用的基本 Python 镜像可用于 ARM 处理器,但它们可能不是最佳选择。 对于 ARM 架构,与 Alpine OS 类似,许多 Python 库没有预编译并打包为轮子。 它们需要在安装期间进行编译,这可能需要很长时间。
或者,我们可以依赖操作系统中包含的 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 的轮子。 如果您更喜欢使用 32 位 Raspberry PI OS,则需要相应地更新 Dockerfile 中的 TensorFlow 链接。
构建镜像和运行容器
在下载项目代码(包含已训练的模型和样本数据)之后,我们可以构建我们的镜像
$ docker build --build-arg USERID=$(id -u) -t mld04_arm_predict .
此操作可能需要 30 多分钟才能完成(至少在 Raspberry Pi 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
与之前的文章类似,我们仅映射数据文件夹,因为应用程序和模型存储在容器中。
预期的结果如下
摘要
我们已成功在 Raspberry Pi 上构建并运行了 TensorFlow 预测。 我们通过依赖预编译的系统 Python 库牺牲了一些灵活性。 但是,缩短的镜像构建时间和最终大小非常值得。
在本系列的最后一篇文章中,我们将回到 Intel/AMD CPU。 这次,我们将使用 GPU 加速我们的计算。