Raspberry Pi AI 套件在 Ubuntu 上的黑客指南
by Canonical on 20 November 2024
Raspberry Pi 最近发布了他们的 AI 套件,一个搭载 Hailo-8L AI 加速器的 PCIe M.2 HAT 套件。这款 AI 加速器的运算性能高达每秒 13 万亿次运算(TOPS)。相较之下,Coral Edge TPU 的运算性能为 4 TOPS,其拥有与 Raspberry Pi 5 CPU 相近的推理性能。AI 套件可以让标准平台上开发机器学习工作负载变得更加容易。它还允许在边缘部署强大的机器学习模型,而且成本低、功耗低。许多人对这款新工具包在其中可以发挥卓越性能的大量用例满怀期待,比如安全、制造或质量保证方面的摄像头视频对象实时检测。
在本篇博客中,我们将讨论我们尝试在 Ubuntu 24.04 LTS 上运行 Hailo-8L 加速器及其软件的经验。Hailo 的硬件和软件依然很新,所以说变化也在经常发生。我们为使加速器工作所采取的措施不推荐用于生产用途,而是用于探索生态系统并维持开发环境。
Hailo 的软件堆栈
Hailo 加速器不直接支持 TensorFlow 等标准 ML 框架。因此,您将需要使用 Hailo 的软件堆栈。其软件堆栈主要由四个部分组成:
- Hailo 驱动程序:用于 Hailo-8L 的 PCIe 驱动程序和固件
- HailoRT:Hailo 的运行时间
- TAPPAS:Hailo 的开发框架
- AI 工作负载:Raspberry Pi 5 示例
Raspberry Pi 操作系统软件
Raspberry Pi 已将如何让 AI 套件工作以及如何在 Raspberry Pi 操作系统下运行示例整理成文档。对于 Raspberry Pi 操作系统,软件组件打包成 deb 文件,正确的兼容版本可从 Raspberry Pi Debian 存储库中获取。
也可以从源代码编译这些软件组件,但由于存在依赖层级,这并非一项容易的任务。另外,您还需要确保使用所有不同组件的兼容版本。源代码目前比为 Raspberry Pi 打包的源代码略新一些。
撰写本文时,可用的版本有:
- 加速器固件:
- Deb 包:hailofw_4.17.0-2_all.deb
- 来源:下载 v4.18.0 的脚本
- PCIe 驱动程序:
- Hailo 运行时间:
- TAPPAS:
- 官方 Raspberry Pi 示例:
- Raspberry Pi 5 的 Hailo 示例:
在 Ubuntu 24.04 上安装软件
我们的第一种方法是在 Ubuntu 24.04 上安装 Raspberry Pi deb 包。
驱动程序和固件
Hailo PCIe 驱动程序没有对应的 Raspberry Pi debian 包。因此,我们通过源代码进行安装。
如要编译驱动程序,您需要在系统上安装内核头文件,并安装标准构建工具:
sudo apt install linux-headers-$(uname -r)
sudo apt install build-essential
使用 git 克隆 v4.17.0 版本的源代码。这是我们将要从 deb 包中安装的其余软件所需要的版本。
git clone https://github.com/hailo-ai/hailort-drivers.git --branch v4.17.0
cd hailort-drivers/
关于编译源代码以及后续安装驱动程序、udev 规则和固件所需的步骤,Hailo 均有详细文档。我们建议创建一个 Hailo 帐户并阅读他们的指南。
根据 Hailo 的指南,执行以下操作:
cd linux/pcie
make all
sudo make install
cd ../..
./download_firmware.sh
sudo mkdir -p /lib/firmware/hailo
sudo mv hailo8_fw.4.17.0.bin /lib/firmware/hailo/hailo8_fw.bin
sudo cp ./linux/pcie/51-hailo-udev.rules /etc/udev/rules.d/
安装驱动程序后重新启动,确保固件、udev 规则和内核模块均正确加载。如果安装成功,您应该在 /dev/hailo*
下看到一个设备,并在 dmesg 中看到一些关于它的条目。确保 dmesg 中显示的驱动程序版本确实是 v4.17.0。
$ ls /dev/hailo*
/dev/hailo0
$ sudo dmesg | grep hailo
[ 4.980184] hailo_pci: loading out-of-tree module taints kernel.
[ 4.980195] hailo_pci: module verification failed: signature and/or required key missing - tainting kernel
[ 4.981731] hailo: Init module. driver version 4.17.0
[ 4.981844] hailo 0000:01:00.0: Probing on: 1e60:2864...
[ 4.981849] hailo 0000:01:00.0: Probing: Allocate memory for device extension, 11600
[ 4.981859] hailo 0000:01:00.0: enabling device (0000 -> 0002)
[ 4.981865] hailo 0000:01:00.0: Probing: Device enabled
[ 4.981880] hailo 0000:01:00.0: Probing: mapped bar 0 - 00000000b70945f0 16384
[ 4.981884] hailo 0000:01:00.0: Probing: mapped bar 2 - 00000000d21184c7 4096
[ 4.981888] hailo 0000:01:00.0: Probing: mapped bar 4 - 00000000fde02b51 16384
[ 4.981893] hailo 0000:01:00.0: Probing: Setting max_desc_page_size to 4096, (page_size=4096)
[ 4.981901] hailo 0000:01:00.0: Probing: Enabled 64 bit dma
[ 4.981906] hailo 0000:01:00.0: Probing: Using userspace allocated vdma buffers
[ 4.981910] hailo 0000:01:00.0: Disabling ASPM L0s
[ 4.981914] hailo 0000:01:00.0: Successfully disabled ASPM L0s
[ 5.030118] UBSAN: array-index-out-of-bounds in /home/jpmeijers/hailort-drivers/linux/pcie/../../common/pcie_common.c:351:53
[ 5.030152] hailo_pcie_write_firmware+0x260/0x280 [hailo_pci]
[ 5.030169] hailo_pcie_probe+0x970/0xd98 [hailo_pci]
[ 5.030204] hailo_pcie_module_init+0x98/0xff8 [hailo_pci]
[ 5.161028] hailo 0000:01:00.0: Firmware was loaded successfully
[ 5.172591] hailo 0000:01:00.0: Probing: Added board 1e60-2864, /dev/hailo0
HialoRT
HailoRT – Hailo 运行时间可以从 Raspberry Pi 存储库中以 Debian 包的形式获取。下载 Debian 包,然后使用 apt 安装:
wget http://archive.raspberrypi.com/debian/pool/main/h/hailort/hailort_4.17.0_arm64.deb
sudo apt install ./hailort_4.17.0_arm64.deb
安装 HailoRT 之后,您应该能够与 Hailo 加速器硬件进行通信。通过确认连接的设备检查通信是否正常:
$ hailortcli fw-control identify
Executing on device: 0000:01:00.0
Identifying board
Control Protocol Version: 2
Firmware Version: 4.17.0 (release,app,extended context switch buffer)
Logger Version: 0
Board Name: Hailo-8
Device Architecture: HAILO8L
Serial Number: HLDDLBB241602838
Part Number: HM21LB1C2LAE
Product Name: HAILO-8L AI ACC M.2 B+M KEY MODULE EXT TMP
TAPPAS
TAPPAS 是用于创建在 Hailo 加速器上运行的模型的开发框架,也可以从 Raspberry Pi 存储库中以 Debian 包的形式获取。下载 Debian 包并安装:
wget http://archive.raspberrypi.com/debian/pool/main/h/hailo-tappas-core-3.28.2/hailo-tappas-core-3.28.2_3.28.2_arm64.deb
sudo apt install ./hailo-tappas-core-3.28.2_3.28.2_arm64.deb
这可能需要一段时间,因为 TAPPAS 有许多依赖项要通过 apt
下载和安装。
官方 Raspberry Pi 示例
下载地址:rpicam-apps-hailo-postprocess_1.5.0-2_arm64.deb
由于此包依赖于 rpicam-apps
,因此无法在 Ubuntu 上进行安装。
rpicam-apps-hailo-postprocess : Depends: rpicam-apps but it is not installable
E: Unable to correct problems, you have held broken packages.
Rpicam-apps
包也可以从 Raspberry Pi 存档中下载,但由于依赖关系存在冲突,所以无法尝试安装。
rpicam-apps : Depends: libavcodec59 (>= 7:5.0) but it is not installable
Depends: libavdevice59 (>= 7:5.0) but it is not installable
Depends: libavformat59 (>= 7:5.0) but it is not installable
Depends: libavutil57 (>= 7:5.1) but it is not installable
Depends: libcamera0.3 (>= 0.3.0+rpt20240617) but it is not installable
Depends: libjpeg62-turbo (>= 1.3.1) but it is not installable
Hailo’s Raspberry Pi examples
好在 Hailo 发布了 Raspberry Pi 5 的示例,其不依赖于 rpicam-apps
。Hailo 仅发布了适用于 Python 版本 3.8 – 3.11 的 hailo
Python 库 wheel 文件。Ubuntu 24.04 附带的是 Python 3.12。为了解决这个问题,我们要从 deadsnakes ppa 安装 Python 3.11。
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt install python3.11-full python3.11-dev
然后将系统默认 Python 更改为版本 3.11:
sudo update-alternatives --install /usr/local/bin/python3 python3 /usr/bin/python3.11 3
需要更改系统默认 Python 版本的原因是示例的安装脚本只是使用系统默认 Python 版本。使用 Python 3.11 手动创建一个虚拟环境,然后在其中运行安装脚本是行不通的,因为它产生的是 Python 3.12 而不是所需的 Python 3.11 所创建的环境。
继续操作之前,请确保通过 python3 命令得到的 Python 解释器的确是版本 3.11:
$ python3 --version
Python 3.11.9
示例编译需要使用 meson 和 ninja。安装 meson 时,它会自动添加 ninja 作为依赖项:
sudo apt install meson
然后按照此处文档所示克隆示例存储库,并进行构建和安装:
git clone https://github.com/hailo-ai/hailo-rpi5-examples.git
cd hailo-rpi5-examples
source setup_env.sh
pip install -r requirements.txt
./download_resources.sh
./compile_postprocess.sh
现在,我们可以运行其中一个示例:
(venv_hailo_rpi5_examples) jpmeijers@pi-2404-desktop:~/hailo-rpi5-examples$ python basic_pipelines/detection.py --input resources/detection0.mp4
Traceback (most recent call last):
File "/home/jpmeijers/hailo-rpi5-examples/basic_pipelines/detection.py", line 1, in <module>
import gi
File "/usr/lib/python3/dist-packages/gi/__init__.py", line 40, in <module>
from . import _gi
ImportError: cannot import name '_gi' from partially initialized module 'gi' (most likely due to a circular import) (/usr/lib/python3/dist-packages/gi/__init__.py)
为了修复这个错误,我们需要在虚拟环境中重新安装 PyGObject,以便获得 Python 3.11 对应的正确版本。该错误产生的原因是 Python 3.11 使用了系统上安装的 PyGObject 库,该库适用于 Python 3.12:
pip install --ignore-installed PyGObject
如果再次运行这个示例,我们将再次遇到一个错误,而这次的错误是关于 numpy 的。简单升级到最新的 numpy 版本应该可以修复这个错误:
pip install numpy --upgrade
现在,我们可以运行这些示例。
python basic_pipelines/detection.py --input resources/detection0.mp4
其他示例或使用相机的命令可以在示例文档中找到。我们用 USB 网络摄像头进行测试,因为 Raspberry Pi 摄像头在 Ubuntu 上尚未充分受到支持。如果同时连接了 Raspberry Pi 摄像头和 USB 网络摄像头,则可能需要指定正确的输入源。例如,我们的 USB 网络摄像头注册为 /dev/video8
:
python basic_pipelines/detection.py --input /dev/video8
如果您打开了一个新的终端并想要在其中运行示例,则需要再次激活虚拟环境。
cd hailo-rpi5-examples/
source setup_env.sh
从源代码编译
我们尝试从源代码编译软件组件。PCIe 驱动程序和 HailoRT 编译成功,我们得以与 Ubuntu 24.04 的 Hailo-8L 加速器进行通信。由于若干因素,我们无法编译 TAPPAS。这也意味着我们不能使用 Raspberry Pi 示例,因为它们依赖于 TAPPAS。
让它工作也不是不可能,只是需要手动更改源代码。Matt Davis 在其 GitHub 存储库中记录了其中的一些更改。
更好的方法
尽管我们从 Hailo 获得了要在 Ubuntu 24.04 上运行的 Raspberry Pi 5 示例,但需要替换默认的 Python 版本。不过,它可能在以后的某个时间点导致依赖项或运行时间失效,因此不建议采用这样的做法。最好将主机系统保持在一组稳定的软件包上,并将工作负载转移到隔离环境中。
我们决定模拟 Raspberry Pi 操作系统的操作,方法是在 Docker 容器中安装 Debian Bookworm,然后安装 Hailo 的 Raspberry Pi deb 包。使用这种方法,我们仍然可以通过主机操作系统 Ubuntu 24.04 来连接 Hailo-8L 硬件。幸运的是,PCIe 驱动程序在 Ubuntu 中运行很好,并且我们可以从 Docker 容器访问设备。
这样还有另一个好处,即未来任何的 Hailo Debian 包更新(针对 Raspberry Pi 操作系统)将有更高的几率在容器中运行。原因就在于容器中使用的基本操作系统与用于 Raspberry Pi 操作系统的相同。
我们有关此操作的示例 Dockerfile 可以在此处查看:
https://github.com/canonical/pi-ai-kit-ubuntu
如果按照该存储库自述文件中的指南操作,您将注意到过程中需要完成几步手动操作,且这些操作在 Docker 构建过程中无法执行。由于这些手动操作,使用 Docker 容器也不适合生产用例。
结论
在运行 Ubuntu 24.04 LTS 的 Raspberry Pi 5 上使用 Raspberry Pi AI 套件是可行的。让其工作的过程对用户不太友好,并且可能会破坏系统兼容性。另外,展示了使用 Docker 容器将 AI 工作负载与主机隔离的替代方法,并建议将之作为一种替代方法。不过该方法有其自身的缺陷,因此也不适合生产环境。
本篇博客提供了关于如何在 Ubuntu 24.04 中使用 Raspberry Pi AI 套件的示例。由于该领域软件发展迅速的这一特点,我们无法保证这种方法会持续奏效。不过,如果想要在 Ubuntu 上开发和测试您的 AI 应用程序,这是一个很好的起点。
随着 Hailo 软件堆栈逐渐成熟,其使用方法也会发生变化。我们希望很快就能看到 Hailo 推出生产就绪程度更高的解决方案。
订阅博客文章
查看更多内容
Canonical x Lenovo: 在边缘运行 AI workloads
携手 Canonical 和 Lenovo,在边缘运行 AI 工作负载 从制造业中的预测性维护,到医疗保健行业中的虚拟助手,再到最偏远地区的电信路由器优化,AI 正在各种边缘环境中掀起新浪潮,带来新机遇。但为了支持这些几乎随处运行的 AI 工作负载,公司需要具备快速、安全且高度可扩展的边缘基础架构。 开源工具 —— 例如用于轻量级 Kubernetes 编排的 MicroK8s 和用于 ML 机器学习工作流的 Charmed Kubeflow —— 可以为边缘 AI 部署提供更高的灵活性和安全性。如果配合加速计算堆栈使用,这些解决方案可以帮助专业人员更快地交付项目,降低运营成本,以及确保更可预测的结果。 今天这篇博客探讨为什么企业正逐渐在边缘 AI 领域转向开放式基础架构 […]
《网络弹性法案》对开源意味着什么
《网络弹性法案》(Cyber Resilience Act,CRA)即将生效。这项影响广泛的法规将引入针对开发商、零售商和设备制造商的新要求和制衡措施;而许多亟待满足的需求在开源社区并没有得到很好的解决。 在本篇博客中,笔者将探讨 CRA 对开源的影响,分享一些专家的见解,说明该法案在哪些方面有着积极的影响以及在哪些方面存在灰色地带,并向大家介绍在使用或创建开源的情况下应该为法案的推行做好哪些准备。 为何制定《网络弹性法案》? 首先大致介绍一下,CRA 是欧盟即将出台的一项法规,旨在通过对欧盟 IT 行业实施更严格的网络安全、文档和漏洞报告要求,提高设备安全性。这项法规将适用于硬件、设备、软件、应用程序和其他“带有数字连接元素的产品”的开发商、分销商、制造商和零售商。 […]
Ubuntu Linux 为什么成为金融服务领域取代 CentOS 的首选?
金融服务由技术驱动。而客户体验越来越多地由数据驱动,通过定制产品和服务可以体现出个人行为和偏好。所有这一切都建立在安全稳定的技术基础之上,只有这样的基础才可以提供敏捷性和灵活性,以适应客户需求的同时保持合规性。 使用 CentOS 作为创新基础的金融服务机构见证了 CentOS 8 于 2021 年退出,随后是 CentOS 7 于 2024 年 6 月退出。不过,最近的一项研究显示,各行业近四分之一的企业组织仍在使用 CentOS。 听起来是不是很耳熟?众所周知,金融机构在进行重大技术变革时是最谨慎的。考虑到金融业务的敏感性,这也就可以理解了。事实上,尽管过渡到云已成为一种成熟的方案,但仍有 60% 的金融机构表示,他们采用的传统技术堆栈成本过高且存在不足。与所有传 […]