谢谢您的订阅!
当新的内容发布后您将开始接收邮件。您也可以点击邮件内的链接随时取消订阅。关闭Close

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 示例

Hailo 的软件堆栈布局(来源

Raspberry Pi 操作系统软件

Raspberry Pi 已将如何让 AI 套件工作以及如何在 Raspberry Pi 操作系统下运行示例整理成文档。对于 Raspberry Pi 操作系统,软件组件打包成 deb 文件,正确的兼容版本可从 Raspberry Pi Debian 存储库中获取。 

也可以从源代码编译这些软件组件,但由于存在依赖层级,这并非一项容易的任务。另外,您还需要确保使用所有不同组件的兼容版本。源代码目前比为 Raspberry Pi 打包的源代码略新一些。

撰写本文时,可用的版本有:

在 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 推出生产就绪程度更高的解决方案。

订阅博客文章

订阅您感兴趣的主题

在提交此表格的同时,我确认已阅读和同意的隐私声明隐私政策。

查看更多内容

MicroCloud 集群管理器

管理所有 MicroCloud 的统一入口 Canonical 推出 MicroCloud 集群管理器测试版,通过这一全新方式,您可在单一统一界面中发现、管理和运维您的所有 MicroCloud 环境。 MicroCloud 是一款开源云平台,可轻松在任意位置创建轻量、高可用的集群。随着团队从单个集群扩展至多个集群,资源可视性与协同管理迅速成为关键需求。集群管理器正是为解决这一问题而打造。 一个仪表板,管理所有 MicroCloud。 MicroCloud 集群管理器是您管理所有 MicroCloud 的统一入口。无论您管理的是数据中心、多个边缘集群,还是跨环境的数十个集群,集群管理器都能为您提供: 只需轻点几下,您即可注册首个集群,并立即查看其运行状态、资源使用情况与配 […]

Canonical 与 Microsoft 合作,加强企业级 Linux 防护

Canonical 正与 Microsoft Defender 合作,提升企业关键业务 Linux 工作负载的安全性  2026 年 3 月 18 日 Ubuntu 发行商 Canonical 宣布与 Microsoft Defender 推出全新安全合作项目,旨在结合 Canonical 安全维护服务 Ubuntu Pro,进一步强化安全防护能力。Microsoft Defender 客户现已可使用 Ubuntu Pro 安全维护服务,企业能够将高级威胁防护、检测与调查能力扩展至 Ubuntu Pro 环境,确保在所有主流 Linux 环境中实现统一、高效的安全防护。此次合作使安全与运维团队能够采用可靠工具实现标准化管理,简化管理工作,并提升安全基准。 Linux 是当 […]

主权云:通过机密计算增强数据安全

企业愈发希望提升对数据的掌控力、实现数字主权,乃至构建 “自主可控” 的主权云(sovereign cloud)。然而,这意味着不能只考虑数据存储位置,还要关注整个数据生命周期。  在这篇博客中,我们将探讨数据驻留与数据主权的区别、机密计算如何增强数据安全性,以及如何助力您实现数字主权。  数据驻留不等于数据主权 许多人将知晓数据存储位置(数据驻留)与实现数据主权混为一谈。然而,仅知晓数据存储位置且数据在存储时受到保护,并不代表您拥有数据主权。换言之,这并不意味着您对数据拥有完全的掌控权。 存储只是数据的一种状态。实现真正的系统主权,意味着要考虑明文存在的所有场景:计算时的内存中、执行时的寄存器中、推理时的 GPU 内存中,以及训练过程中的中间缓冲区。如果这些状态对主机( […]