目录
介绍
在Raspberry Pi上设置Docker
ARM的Dockerfile
构建镜像和运行容器
总结
- 下载项目文件 - 4.8 MB
Docker等容器技术显著简化了软件的依赖管理和可移植性。在本系列文章中,我们探讨了Docker在机器学习(ML)场景中的使用。
本系列假设您熟悉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
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"]
注意本节我们安装的是python3-opencv系统库,使用apt-get而不是使用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加速我们的计算。
https://www.codeproject.com/Articles/5300727/Running-AI-Models-in-Docker-Containers-on-ARM-Devi