谢谢您的订阅!
当新的内容发布后您将开始接收邮件。您也可以点击邮件内的链接随时取消订阅。关闭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 推出生产就绪程度更高的解决方案。

订阅博客文章

订阅您感兴趣的主题

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

查看更多内容

Canonical 通过 NVIDIA 企业级 AI 工厂认证

Canonical 通过 NVIDIA 企业级 AI 工厂认证设计交付 Kubernetes 平台与开源安全解决方案 参考架构加速智能代理 AI 项目上市进程 为简化企业 AI 应用路径,加速 AI 洞察向商业价值的转化,NVIDIA 近日发布 NVIDIA 企业 AI 工厂验证设计,该方案作为集成式解决方案生态,可实现与企业系统、数据源及安全基础设施的无缝连接。NVIDIA 软硬件设计模板专为现代 AI 项目定制,涵盖物理 AI 与 HPC,重点关注智能代理 AI 工作负载。  Canonical 荣膺 NVIDIA 企业级 AI 工厂验证设计生态伙伴Canonical Kubernetes 容器编排方案,支持在高性能基础设施上高效构建、部署及管理多样化且持续演进的 A […]

《网络弹性法案》CRA 合规全指南:禁行与应行

Canonical 博客多次撰文探讨欧盟 CRA,而现在正是讨论这项新法规的影响以及它对物联网(IoT)和设备制造商在如何设计和构建具有数字元素的产品(PDE)的实际层面上的意义的最佳时机。 本文将深入剖析 IoT 制造商及 PDE 开发者亟待整改的常见实践,并给出合规改造方案,助您的工作成果和 PDE 在符合 CRA 的前提下持续立足欧盟市场。 《网络弹性法案》(CRA)下的禁行之举及应行之事 根据 CRA 规定,企业可执行与禁止的行为范畴根本上取决于其自身及所涉 PDE 在该新颁布法案中的分级或归类。若您尚未掌握 CRA 的法定措辞、分级机制及合规要求,可通过研读笔者往期专题文章系统掌握细则解读: 然而,CRA 在特定类别和分类要求之外,引入了极其广泛的变革,这些变革 […]

NVIDIA Jetson Thor 将支持运行 Ubuntu

Ubuntu 系统即将对 NVIDIA 的 Jetson Thor 系列产品提供官方支持,将与 NVIDIA 继续展开战略合作,共同推动边缘 AI 创新。Canonical 的官方支持将提供优化的 Ubuntu 镜像以及企业级的稳定性与安全性保障。该长期支持及安全更新承诺,可以确保 Ubuntu 系统与 NVIDIA Jetson 系统级模块的组合具备企业级的稳定性与可靠性。 NVIDIA Jetson Thor:一款适用于物理 AI 和机器人技术的强大边缘平台 NVIDIA 近期宣布推出 Jetson AGX Thor 开发人员套件及 Jetson Thor™ 系列模块。NVIDIA Jetson AGX Thor 开发人员套件是一款面向人形机器人技术与物理 AI 应用 […]