原创 上手测试 Hailo:在 Toradex 模块上加速边缘 AI

2025-3-6 15:17 20 0 分类: MCU/ 嵌入式

by Toradex Allan Kamimura

边缘计算机视觉

为何选择边缘计算?

嵌入式设备日益智能化,许多机器学习和计算机视觉任务正被推向边缘设备。在此类设备上运行 AI 模型虽具挑战性,却带来诸多优势:

  1. 降低延迟: 在设备端处理数据,避免了向云端或中央处理器传输数据的等待时间
  2. 增强隐私保护:敏感数据保留在设备内,确保符合严格的隐私法规要求。
  3. 节省带宽成本:边缘处理减少了对集中式服务器发送大量数据的需求。
  4. 提升可靠性:系统可在无网络连接的情况下独立运作。

为何需要外部 AI 加速器?

Toradex 提供多种计算机模块(SoM),其中一些集成了神经网络处理单元(NPU),能够应对不同的 AI 工作负载。例如,Verdin iMX8M Plus, Verdin iMX95和 Aquila AM69 均配备了专为边缘推理加速设计的 NPU,使其适用于众多计算机视觉和机器学习应用。

尽管这些模块提供了强大的 AI 解决方案,但诸如 Hailo-8、EdgeX、MemryX 及 Google Coral 等外部 AI 加速器通过提供模块化、解耦且可扩展的边缘 AI 推理方案来应对挑战。这带来了更高的灵活性和面向未来的 AI 能力。

1. 将 AI 处理与 SoC 供应商软件解耦
在边缘运行机器学习面临的一大挑战是将模型适配到特定硬件或运行库上。无论是 NXP 的 eiQ 平台、TI 的 Edge AI Studio 还是 ONNX 导出工具,每种都有其专属的 AI 工具包和优化策略。外部 AI 加速器将 AI 工作负载从其他硬件中分离出来,提供了一个统一的跨多硬件平台的运行环境。

示例: 一个基于 x86 设备并使用 Hailo-8 AI 加速器开发的计算机视觉解决方案,可以无缝迁移至搭载 Hailo-8 的 Aquila AM69 模块上而无需重构整个 AI 堆栈。这种解耦确保了仅需最小调整即可完成迁移,大大缩短了产品上市时间。

2. 模块化与可扩展性
AI 应用具有动态特性,随着工作负载复杂度的增加或新功能的创建,性能需求可能会发生变化。虽然内置的 NPU 能提供坚实的解决方案,但有时它们可能难以适应新的场景。

Hailo简介

Hailo是一家 AI 处理器制造商,其产品旨在边缘端上运行先进的机器学习应用,能够广泛应用于智慧城市、汽车、制造、农业、零售等多个行业和领域。

我们使用 Hailo-8 M.2 模块在多款 Toradex 模块上进行了测试。Hailo-8 M.2 模块是一款具备 26 TOPS 算力及 PCIe Gen-3.0 4通道 M-key 接口的 AI 加速器模块。该 M.2 模块可插入多种 Toradex 载板中,实现实时的深度神经网络推理。

如何 Hailo 充分利用 Toradex 生态系统?

释放预处理和后处理任务

来源: https://hailo.ai/blog/customer-case-study-developing-a-high-performance-application-on-an-embedded-edge-ai-device/

典型的计算机视觉流程遵循线性模式。从摄像头捕捉源开始,直到应用程序采取行动,图像必须经过每一个处理步骤。这意味着如果任何一个步骤比下一个耗时更长,那就是瓶颈所在。

通常,在比较机器学习模型或硬件时,我们会非常关注推理速度,但这只是问题的一部分。

完整的软件堆栈

Hailo 是一个完整的人工智能解决方案,支持常见机器学习工作流中的大部分步骤。

  1. 性能评估
    1. TAPPAS 是一个包含应用示例的代码库。
    2. Model Zoo 不仅提供了一些模型的基准测试结果,还包括预训练模型。
  2. 模型训练
    1. 部分预训练模型附带了再训练环境。
  3. 编译器和运行库
    1. Hailo Dataflow 编译器
    2. pyHailoRT 和 GStreamer 插件

从 Toradex 方面来看,这一工作流程可以通过使用 Torizon 云平台得到补充。

  1. 监控性能
    1. 提前识别任何问题,确保系统可靠性。
  2. OTA 更新
    1. 轻松更新量产设备。

支持 Toradex 模块硬件

硬件

支持的硬件配置

系列模块载板Hailo
AquilaTI AM69
(1+2 x PCIe 3.0)
Clover
(M.2 key B+M)
Hailo-8
Hailo-8L
AquilaNXP i.MX 95
(1 x PCIe 3.0)
Clover
(M.2 key B+M)
Hailo-8
Hailo-8L
VerdinNXP i.MX 95
(1 x PCIe 3.0)
Mallow
(M.2 key B)
Hailo-8
Hailo-8L
VerdinNXP i.MX 8M Plus
(1 x PCIe 3.0)
Mallow
(M.2 key B)
Hailo-8
Hailo-8L
VerdinNXP i.MX 8M Mini
(1 x PCIe 2.0)
Mallow
(M.2 key B)
Hailo-8
Hailo-8L
ApalisNXP i.MX8
(2 x PCIe 3.0)
Ixora
(Mini PCIe)
Hailo-8R mPCIe

软件

OS版本其他的资源
Torizon OSBSP 7meta-hailo layer (即将上线)
Torizon OSBSP 6runtime container (即将上线)
Torizon OS MinimalBSP 6meta-hailo kirkstone
OpenEmbedded layer for GStreamer 1.0
tdx-reference-multimediaBSP 6meta-hailo kirkstone

YOLOv5 示例

在本例中,我们将运行来自 Tappas 的演示应用程序:
完成此示例后,您应得到类似以下的输出。以 60+ FPS 的速度运行(取决于您的摄像头)。

我们将使用:

  • 摄像头
    • 如果使用 USB 摄像头,由于摄像头的捕捉速度,帧率可能会非常低。
  • 显示器
  • Verdin i.MX8MP + Mallow Carrier 载板
    • Verdin iMX8M Plus QuadLite 1GB IT (0065) 不兼容 Framos 摄像头。
  • Hailo AI Accelerator

步骤:

  1. 从源码构建 Torizon OS
    1. 构建基础 Torizon OS
    2. 添加依赖项
  2. 硬件设置
    1. 连接Hailo设备
    2. 连接摄像头
    3. 安装新镜像
  3. 检查所有配置
  4. 运行示例

从源代码构建 Torizon OS

完整指南

首先,您可能需要检查计算机的 RAM 和磁盘空间

  • 用于 Yocto 项目构建的计算机

构建 Torizon OS 基础镜像
我们将使用 CROPS 容器来构建以下镜像:

Torizon OS DistoMachineTorizon OS Image Target版本
torizonverdin-imx8mptorizon-minimal6.8.0

创建工作目录

cd ~
mkdir ~/yocto-workdir

运行容器(这将构建基础镜像)

这将占用大量内存,并需要几个小时才能完成。

命令的第二行将主机卷映射到容器的 workdir 目录。请注意,此文件夹 ~/yocto-workdir 是在上一步中创建的。

docker run --rm -it --name=crops \
  -v ~/yocto-workdir:/workdir \
  --workdir=/workdir \
  -e MACHINE="verdin-imx8mp" \
  -e IMAGE="torizon-minimal" \
  -e DISTRO="torizon" \
  -e BRANCH="refs/tags/6.8.0" \
  -e MANIFEST="torizoncore/default.xml" \
  -e ACCEPT_FSL_EULA="1" \
  -e BB_NUMBER_THREADS="2" \
  -e PARALLEL_MAKE="-j 2" \ # not sure if I can pass those like this
  torizon/crops:kirkstone-6.x.y startup-tdx.sh

将依赖项添加到镜像

要添加依赖项,首先进入 ~/yocto-workdir/layers 文件夹。

cd ./layers

我们将添加下面 layers:

  • meta-hailo
  • meta-gstreamer1.0
  • meta-toradex-framos

更多关于 meta layers 的内容,请参考 完整的文档。

在 torizon/crops:kirkstone-6.x.y 容器中, 运行 bitbake add layers 命令。

bitbake-layers add-layer meta-hailo/meta-hailo-accelerator
bitbake-layers add-layer meta-hailo/meta-hailo-libhailort
bitbake-layers add-layer meta-hailo/meta-hailo-tappas
bitbake-layers add-layer meta-hailo/meta-hailo-vpu
bitbake-layers add-layer meta-toradex-framos
bitbake-layers add-layer meta-gstreamer1.0

在 build-torizon/conf/local.conf 文件中添加 packages。在末尾添加下面内容。

IMAGE_INSTALL:append = " libhailort hailortcli pyhailort libgsthailo hailo-pci hailo-firmware"
IMAGE_INSTALL:append = " gstreamer1.0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad"
IMAGE_INSTALL:append = " v4l-utils"

使用新的 layers 编译镜像。

bitbake torizon-minimal

你可以在下面位置找到兼容 Toradex Easy Installer 的安装镜像  ~/yocto-workdir/build-torizon/deploy/images/verdin-imx8mp/torizon-minimal-verdin-imx8mp-Tezi_6.8.0-devel-<date>+build.0.tar.

硬件设置

连接Hailo设备

将 Hailo 设备插入 Mallow 载板的 M.2 插槽中。

连接摄像头

将摄像头连接到 Mallow 载板的 MIPI-CSI 接口上。

安装新的 Torizon OS 镜像

使用 Toradex Easy Installer (Tezi)  将新镜像刷入设备。

  1. 下载Tezi
  2. 将设备置于恢复模式
  3. 安装新编译的镜像

检查安装情况

Hailo 设备

sudo su
hailocli scan
hailocli device-info

这些命令的输出应能检测到设备已正确连接且驱动程序正常工作。

显示屏

gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink

您应该在屏幕上看到一些彩色图案。

Camera 设备

此步骤可能因使用的相机而异。

v4l2-ctl -d2 -D
v4l2-ctl --list-formats-ext -d /dev/video2

对于 Framos 相机,输出如下。

root@verdin-imx8mp-15445736:~# v4l2-ctl --list-formats-ext -d /dev/video2
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture

[0]: 'YUYV' (YUYV 4:2:2)
  Size: Stepwise 176x144 - 4096x3072 with step 16/8
[1]: 'NV12' (Y/CbCr 4:2:0)
  Size: Stepwise 176x144 - 4096x3072 with step 16/8
[2]: 'NV16' (Y/CbCr 4:2:2)
  Size: Stepwise 176x144 - 4096x3072 with step 16/8
[3]: 'RG12' (12-bit Bayer RGRG/GBGB)
  Size: Stepwise 176x144 - 4096x3072 with step 16/8

在演示中,我们将使用 YUYV 格式。因此请记住其中的数值。

gst-launch-1.0 -v v4l2src device=/dev/video2 ! video/x-raw ! videoconvert ! autovideosink

运行示例

某些摄像头会指定分辨率和帧数,因此需相应调整这些值。这可以通过修改 PIPELINE 变量的 framerate 值来实现。

sudo su
cd ~/apps/detection/
./detection.sh


PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
0
关闭 站长推荐上一条 /4 下一条