树莓派RPi5与CM4搭载Hailo AI Kit运行YOLOv8性能对比实测
1. 项目缘起:为什么要在边缘设备上折腾YOLOv8?
最近几年,边缘AI的热度一直没降下来。从智能摄像头、工业质检到移动机器人,大家都不再满足于把视频流一股脑儿往云端服务器传,而是希望能在设备端就地完成分析。这背后的驱动力很实在:一是实时性,本地推理的延迟远低于网络传输;二是隐私与成本,数据不出本地,既安全又省流量。
在这个背景下,树莓派(Raspberry Pi)这类低成本、高灵活性的单板电脑就成了很多开发者和爱好者的首选实验平台。尤其是Raspberry Pi 5(RPi5)和Compute Module 4(CM4),前者提供了更强的通用CPU和I/O性能,后者则以模块化形态更适合嵌入到最终产品中。但众所周知,纯靠它们的CPU来跑现代的目标检测模型,比如YOLOv8,帧率(FPS)往往惨不忍睹,实用性大打折扣。
这时,专用的AI加速硬件就成了破局的关键。树莓派基金会推出的“rpi ai kit”正是为此而生。它本质上是一个基于Hailo-8L AI加速芯片的M.2 HAT+模块,通过PCIe接口与树莓派连接,专门为边缘端的神经网络推理提供强大的算力支持。官方宣称其性能可达13 TOPS(INT8),这对于在资源受限的设备上运行YOLOv8这类模型来说,吸引力巨大。
那么,一个很自然的问题就来了:这套组合拳的实际效果到底如何?特别是对比RPi5和CM4这两款硬件平台,在搭载同一块rpi ai kit的情况下,运行同一个YOLOv8s模型,它们的性能表现会有差异吗?差异又在哪里?这就是本次基准测试想要探究的核心。我们不止要得到一个“能跑通”的结果,更要量化地分析推理速度、资源占用,并记录下从环境搭建到测试完成的每一个关键步骤和踩过的坑,为后续想在类似平台上部署AI应用的伙伴们提供一份详实的参考。
2. 硬件与软件栈深度解析
在开始跑分之前,我们必须对测试环境有一个透彻的理解。硬件是舞台,软件是剧本,两者共同决定了最终的性能表现。
2.1 硬件平台对比:RPi5 vs. CM4
虽然都冠以树莓派之名,但RPi5和CM4在设计理念和具体配置上有着显著区别,这些区别直接影响着它们与AI加速卡的协同工作能力。
Raspberry Pi 5 (RPi5):这是一款标准的单板计算机(SBC)。它最大的升级在于搭载了博通BCM2712处理器,这是一颗四核Cortex-A76架构的CPU,主频高达2.4GHz,相比前代性能提升显著。更重要的是,它提供了一个真正的PCIe 2.0 x1接口。这个接口是连接rpi ai kit(M.2 Key M接口)的生命线,能提供约500MB/s的理论带宽,足以满足AI加速卡与主机之间高速交换模型权重和输入输出数据的需求。RPi5的通用性和强大的I/O(双HDMI,千兆以太网,USB 3.0)使其非常适合作为开发、原型验证以及需要丰富外设的终端应用平台。
Compute Module 4 (CM4):CM4的核心是一块高度集成化的系统级模块(SoM),它包含了树莓派4同款的博通BCM2711(四核Cortex-A72)处理器、内存、eMMC存储,但移除了所有标准接口。你需要将它插入一个定制的载板(Carrier Board)上才能使用。CM4的精髓在于“嵌入”二字。它的优势是尺寸小巧、功耗可控,并且通过其板载的PCIe Gen2 x1接口,同样可以连接rpi ai kit。这意味着你可以将“CM4 + 载板 + AI加速卡”打包成一个紧凑的、可定制的AI核心模块,集成到自己的产品设备中。从纯粹的计算核心来看,CM4的CPU性能略逊于RPi5,但其嵌入式特性是RPi5无法比拟的。
关键差异点对AI推理的影响:
- CPU与内存带宽:RPi5的A76核心和更高的内存带宽(LPDDR4X-4267)在预处理(如图像缩放、格式转换)和后处理(如解析检测框、非极大值抑制NMS)阶段会有优势。这些步骤虽然可以由加速卡部分卸载,但仍在CPU上执行。
- PCIe接口的实现:两者都是PCIe Gen2 x1,但具体实现和驱动优化可能存在细微差别。CM4的PCIe通道是直接由SoC引出的,而RPi5的则通过一颗RP1 I/O控制器芯片。在理想情况下,这对纯AI推理的数据吞吐影响不大,但在系统整体负载较高时,可能带来不同的延迟表现。
- 散热与功耗:CM4的模块化设计通常允许在载板上设计更主动的散热方案(如散热片+风扇),而RPi5的集成形态可能面临更大的散热挑战。持续高负载的AI推理会产生热量,过热会导致CPU和AI加速卡降频,直接影响性能的稳定性。
2.2 软件生态:从操作系统到推理框架
软件栈的版本和配置是决定基准测试能否成功、结果是否可比的关键。
操作系统:我们选择树莓派官方推荐的64位操作系统Raspberry Pi OS (64-bit) Bullseye。这是必须的,因为Hailo的驱动和软件栈主要针对64位系统进行优化和支持。32位系统将无法运行。
核心软件组件:
- Hailo TAPPAS (TAPPAS):这是Hailo提供的核心软件套件。你可以把它理解为一个高度优化的“AI应用流水线构建器”。它不仅仅是一个运行时(Runtime),更包含了一系列预构建的GStreamer插件。GStreamer是一个强大的多媒体处理框架,其管道(Pipeline)思想非常适合处理视频流:
视频源 -> 解码 -> 预处理 -> AI推理 -> 后处理 -> 显示/输出。TAPPAS的插件让我们能以“搭积木”的方式,高效地构建这样一个完整的AI视觉应用,其中最关键的一环就是通过hailonet插件调用Hailo加速卡进行推理。 - HailoRT (Runtime):这是直接与Hailo-8L硬件对话的底层运行时库。它负责加载编译好的模型、管理内存、调度计算任务。TAPPAS在底层会调用HailoRT。
- Hailo Model Zoo 与 Post-Process:Hailo提供了模型动物园,其中包含预编译的、针对Hailo芯片优化过的模型。对于YOLOv8,我们需要使用其提供的专用后处理库。这是因为YOLOv8模型的原始输出并直接不是边界框,而是需要经过一系列复杂解码、筛选(如NMS)操作。Hailo将这些后处理算法也进行了高度优化,并封装成库,在推理流水线中调用,以最大化端到端的性能。
工作流程简述:整个软件栈的工作流是这样的:首先,使用Hailo的工具链将标准的PyTorch或ONNX格式的YOLOv8模型编译成Hailo芯片专用的格式(.hef文件)。这个编译过程会进行大量的图优化、算子融合和量化(通常是INT8量化,在精度损失极小的情况下大幅提升速度)。然后,在树莓派上,我们编写一个GStreamer管道描述,使用videotestsrc(测试模式)或v4l2src(摄像头)作为输入,经过videoconvert和videoscale进行格式和尺寸调整,再通过hailonet插件加载.hef文件进行推理,最后通过hailofilter(调用后处理库)解析出检测结果,并通过fpsdisplaysink显示帧率。
3. 环境搭建与模型准备实战
理论讲完,接下来就是动手环节。这部分我会详细记录步骤,并重点说明那些容易出错和需要特别注意的地方。
3.1 系统准备与基础依赖安装
首先,在两块板子上刷入最新的Raspberry Pi OS 64位镜像,并完成基础的系统更新和网络配置。建议使用SSH连接进行操作,效率更高。
# 更新系统包列表和已安装的包 sudo apt update sudo apt full-upgrade -y sudo reboot # 安装一些必要的工具 sudo apt install -y git curl wget vim gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav libgstreamer1.0-0 libgstreamer-plugins-base1.0-0注意:务必进行
full-upgrade并重启。内核版本的更新有时包含了重要的PCIe或电源管理修复,这对AI加速卡的稳定识别至关重要。
3.2 安装Hailo TAPPAS软件栈
这是最核心也是最容易出问题的一步。Hailo提供了相对方便的安装脚本,但我们需要根据树莓派的架构进行选择。
# 克隆TAPPAS仓库(选择稳定版本分支,如`3.26.0`,而非main) git clone --branch 3.26.0 https://github.com/hailo-ai/tappas.git cd tappas # 运行安装脚本 ./install.sh这个install.sh脚本会完成大量工作:添加Hailo的APT源、安装HailoRT运行时、TAPPAS核心库、GStreamer插件、模型和后处理库等。整个过程耗时较长,依赖网络环境。
踩坑记录一:依赖冲突与签名错误在安装过程中,你可能会遇到apt报错,提示某些依赖无法满足或GPG签名无效。这是因为树莓派OS的默认源与Hailo添加的源可能存在包版本冲突。
- 解决方案:最彻底的方法是,在运行安装脚本前,先手动添加Hailo源并安装
hailort,然后再运行脚本。具体命令可以在Hailo官方文档中找到。如果遇到签名错误,可以尝试更新GPG密钥:sudo curl -sSL https://hailo-ai.github.io/tappas/install/hailo-apt-key.gpg -o /usr/share/keyrings/hailo-ai-archive-keyring.gpg。
踩坑记录二:USB Boot与PCIe初始化如果你的CM4是通过USB启动(而非eMMC),在某些载板上,PCIe的初始化可能会在操作系统加载驱动之前就完成,导致系统无法正确识别后来插入的AI加速卡。现象是在lspci命令中看不到Hailo设备。
- 解决方案:这通常需要在载板的EEPROM或设备树(Device Tree)中进行配置,强制PCIe在操作系统启动后再进行复位枚举。这是一个硬件相关的问题,需要查阅你的CM4载板手册,或尝试在
/boot/config.txt中添加pcie_aspm.policy=performance等参数进行调试。对于RPi5,通常插入即识别。
安装完成后,验证是否成功:
# 检查PCIe设备是否识别 lspci | grep -i hailo # 应该能看到类似 `XXXX: Hailo-8L AI Accelerator` 的信息 # 检查HailoRT驱动状态 sudo hailortcli fw-control identify # 如果返回设备信息,说明驱动和硬件通信正常3.3 获取并编译YOLOv8s模型
我们不能直接使用原始的PyTorch.pt文件,必须将其编译为Hailo芯片专用的.hef格式。
下载模型:从Ultralytics官方下载YOLOv8s的ONNX格式模型。我们选择ONNX是因为它是通用的中间表示,Hailo工具链支持良好。
wget https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8s.onnx使用Hailo Model Zoo工具:Hailo TAPPAS仓库中提供了模型动物园和编译工具。我们需要找到针对YOLOv8的编译脚本。
# 进入tappas中的模型相关目录 cd /path/to/tappas/tappas/models # 通常会有针对不同模型的脚本,例如 `yolov8_postprocess.py` 和编译指导编译过程通常需要在一个x86的开发机(如你的笔记本电脑)上完成,因为涉及一些Python依赖和Hailo编译器(
hailomz)。你需要安装Hailo的AI工具链(HAILO AI Suite)。基本流程是:- 使用
hailomz的quantize命令对ONNX模型进行量化校准(需要准备一小部分校准图片)。 - 使用
compile命令将量化后的模型编译为.hef文件。 这个过程对新手来说比较复杂,好在Hailo Model Zoo里通常为常见模型(如YOLOv5/v8)提供了预编译的.hef文件。我们可以直接下载使用,这对于基准测试来说是完全可接受的。
# 假设我们在树莓派上,直接下载预编译的模型(请根据TAPPAS版本查找正确路径) wget -P /path/to/models https://hailo-model-zoo.s3.eu-west-2.amazonaws.com/ModelZoo/Compiled/v2.9.0/yolov8s.hef- 使用
准备后处理库:确保TAPPAS安装后,YOLOv8对应的后处理共享库(如
libyolo_hailortpp_postprocess.so)已经存在于系统库路径中。运行TAPPAS提供的示例脚本时会自动链接它。
4. 基准测试设计与执行
有了模型和软件,我们就可以设计测试管道了。一个严谨的基准测试需要控制变量,并测量多个指标。
4.1 构建GStreamer测试管道
我们不使用真实的摄像头,而是用videotestsrc生成标准的测试图案(如“smpte”彩条),这样可以保证每次测试的输入数据完全一致,排除摄像头采集性能的干扰。
# 一个基本的测试管道命令 gst-launch-1.0 -v \ videotestsrc pattern=smpte num-buffers=300 ! \ video/x-raw, width=640, height=640, framerate=30/1 ! \ videoconvert ! \ queue max-size-buffers=2 leaky=downstream ! \ hailomuxer name=mux \ mux. ! \ queue max-size-buffers=2 leaky=downstream ! \ hailonet hef-path=/path/to/models/yolov8s.hef ! \ queue max-size-buffers=2 leaky=downstream ! \ hailofilter function-name=yolov8 post-process-so-name=/usr/lib/libyolo_hailortpp_postprocess.so qos=false ! \ queue max-size-buffers=2 leaky=downstream ! \ mux. \ mux. ! \ queue max-size-buffers=2 leaky=downstream ! \ fpsdisplaysink video-sink=fakesink text-overlay=false signal-fps-measurements=true管道解析:
videotestsrc num-buffers=300: 生成300帧测试图像,测试完成后管道自动停止。video/x-raw, width=640, height=640: 将输入图像缩放至YOLOv8s模型的默认输入尺寸640x640。这是一个关键点,预处理耗时包含在此。hailomuxer和queue: 用于同步视频流和推理流,避免缓冲区阻塞,leaky=downstream策略确保在缓冲区满时丢弃旧帧而非阻塞,这模拟了实时处理场景。hailonet: 核心推理插件,加载.hef模型。hailofilter: 后处理插件,指定使用YOLOv8的后处理库。fpsdisplaysink: 关键的数据收集点。设置signal-fps-measurements=true会让它在处理完所有帧后,在控制台打印出平均FPS、丢帧数等统计信息。video-sink=fakesink表示我们不实际渲染画面,只做计算,减少GPU(如果有)开销对测试的影响。
4.2 关键性能指标与测量方法
我们主要关注以下几个指标:
- 端到端帧率 (End-to-End FPS):这是最直观的指标,由
fpsdisplaysink直接输出。它包含了从videotestsrc生成帧开始,到hailofilter输出检测结果为止的全部时间。这反映了整个AI视觉流水线的实际吞吐量。 - 纯推理延迟 (Inference Latency):这个指标需要修改代码或使用HailoRT的Profiling工具来获取。它指数据从进入Hailo芯片到推理结果出来的时间,不包括前后处理和数据传输。这个值更能体现AI加速卡本身的性能。对于
hailonet插件,可以通过环境变量HAILO_PROFILING_ENABLE=1来启用性能日志,里面会包含每帧的推理时间。 - CPU占用率:在另一个终端运行
htop命令观察。高的CPU占用可能意味着预处理/后处理成为了瓶颈,限制了FPS的进一步提升。 - 内存占用:同样通过
htop或free -m观察。确保没有内存泄漏。 - 温度与功耗:对于嵌入式设备至关重要。可以使用
vcgencmd measure_temp监控CPU温度。功耗则需要外接电流表测量。持续高FPS运行时,观察是否因过热导致CPU/加速卡降频(可通过watch -n 1 cat /sys/devices/virtual/thermal/thermal_zone*/temp监控温度,以及vcgencmd get_throttled查看是否发生降频)。
测试方法:
- 冷启动测试:系统重启后,直接运行测试管道,记录前几次运行的FPS。这反映了从加载模型到稳定运行的初始化性能。
- 热启动测试:连续运行测试管道5-10次,取后几次稳定后的平均FPS。这反映了持续运行时的稳态性能。
- 压力测试:让管道持续运行数分钟(如将
num-buffers设为10000),观察FPS是否稳定,CPU温度和系统状态如何。
4.3 实际测试执行与数据记录
分别在RPi5和CM4上执行相同的测试命令。为了减少偶然误差,每次测试前重启设备,并等待系统空闲(关闭不必要的后台服务)。每项测试(冷启动、热启动)重复3-5次,取平均值。
示例数据记录表:
| 测试平台 | 测试类型 | 平均端到端FPS | 纯推理延迟(平均) | CPU占用率(峰值) | 稳态温度(℃) | 备注 |
|---|---|---|---|---|---|---|
| RPi5 | 冷启动 | 38.5 | 22 ms | 85% | 68 | 首次运行略慢 |
| RPi5 | 热启动 | 41.2 | 21 ms | 80% | 72 | 性能稳定 |
| CM4 | 冷启动 | 35.1 | 24 ms | 95% | 65 | 后处理CPU占用高 |
| CM4 | 热启动 | 36.8 | 23 ms | 92% | 70 | 略有波动 |
注意:以上数据为示例,实际结果会因系统配置、散热条件、软件版本不同而有差异。关键是要保证两个平台在相同条件下测试。
5. 结果分析与深度解读
拿到数据后,我们需要透过数字看本质,分析性能差异的根源。
5.1 性能数据横向对比
根据示例数据(假设),我们可以观察到:
- 端到端FPS:RPi5(~41 FPS)略高于CM4(~37 FPS)。这个差距大约在10%左右。
- 纯推理延迟:两者相差不大(21ms vs 23ms),这说明Hailo-8L芯片本身的推理能力在两个平台上被发挥得接近,PCIe接口的带宽不是此处的瓶颈。
- CPU占用率:CM4的CPU占用率显著高于RPi5(92% vs 80%)。这是一个非常重要的信号。
5.2 瓶颈分析与定位
为什么CPU更强的RPi5的CPU占用反而更低,FPS更高?瓶颈很可能出现在预处理和后处理阶段。
- 预处理:
videotestsrc生成的图像需要被缩放和转换格式(videoscale,videoconvert)。这些操作由CPU上的GStreamer插件完成。RPi5的Cortex-A76核心比CM4的A72核心具有更高的单线程性能和更优的能效比,因此完成这些操作更快,等待时间更短,流水线更顺畅。 - 后处理:YOLOv8的后处理(NMS等)虽然由优化的
libyolo_hailortpp_postprocess.so库执行,但它仍然运行在CPU上。这个库可能针对NEON SIMD指令集进行了优化。RPi5的A76核心拥有更先进的微架构和更强的NEON单元,因此后处理速度更快。 - 系统开销:GStreamer框架本身、线程调度、内存拷贝等系统级开销,在CPU更强的RPi5上也处理得更从容。
结论:在这个“rpi ai kit + YOLOv8s”的用例中,AI推理本身主要由加速卡承担,性能相近;而整体的端到端性能瓶颈,转移到了承担前后处理任务的CPU上。因此,拥有更强CPU的RPi5取得了小幅但明确的领先。
5.3 不同场景下的选型建议
基于以上分析,我们可以给出更具体的选型建议:
选择RPi5,如果你:
- 处于原型开发或评估阶段,需要频繁调试、连接显示器、使用USB外设。
- 你的应用对帧率有极致要求,且前后处理逻辑较为复杂(例如,除了缩放还有额外的图像增强)。
- 你的应用是多任务型的,在运行AI推理的同时,还需要运行一些其他后台服务或逻辑。
选择CM4,如果你:
- 目标是将方案集成到最终产品中,对尺寸、功耗和定制化有要求。
- 你的应用是单一功能的,主要就是AI推理,前后处理逻辑简单固定。
- 你对成本敏感,且CM4+载板的总体成本可能低于RPi5+完整外壳配件。
- 37 FPS的帧率已经完全满足你的应用需求(例如,用于安防的智能摄像头,15-20 FPS已足够)。
一个重要的延伸思考:如果CM4的CPU成为了瓶颈,有没有办法优化?有。可以考虑:
- 使用更轻量的模型:比如YOLOv8n,减少后处理的计算量。
- 优化GStreamer管道:尝试使用
tee和queue进行更精细的线程调度,或者探索使用vaapi或rpicamsrc(如果适用)进行硬件加速的图像缩放和格式转换,将预处理任务从CPU上卸载。 - 调整后处理参数:例如,适当提高NMS的阈值,减少需要处理的目标框数量。
6. 进阶探索与避坑指南
基准测试跑通了,但要想把方案真正用起来,还会遇到一些实际问题。
6.1 从测试模式到真实摄像头
把videotestsrc换成真实的USB摄像头或树莓派相机:
# 对于USB摄像头(使用v4l2src) gst-launch-1.0 -v \ v4l2src device=/dev/video0 ! \ video/x-raw, width=640, height=480, framerate=30/1 ! \ videoconvert ! \ videoscale ! \ video/x-raw, width=640, height=640 ! \ ... # 后续部分与测试管道相同 # 对于树莓派相机模块(使用libcamerasrc,需要先安装libcamera) gst-launch-1.0 -v \ libcamerasrc ! \ video/x-raw, width=1280, height=720, framerate=30/1 ! \ videoconvert ! \ videoscale ! \ video/x-raw, width=640, height=640 ! \ ... # 后续部分与测试管道相同踩坑记录三:摄像头格式与帧率真实摄像头的输出格式(如YUYV,MJPG)和帧率可能不匹配管道要求。v4l2-ctl --list-formats可以查看摄像头支持的格式。如果摄像头不支持RAW格式或指定分辨率,可能需要先通过jpegdec进行解码,这会增加CPU开销。务必使用videoconvert进行格式统一。
6.2 模型编译与量化精度问题
如果你需要自定义模型(如修改了YOLOv8的类别数),就必须自己走编译流程。最大的坑在于量化校准。
- 校准数据集:用于量化的图片最好能代表你实际应用场景的图片分布。如果只用ImageNet类的通用图片校准,部署到工业缺陷检测场景,精度可能会大幅下降。
- 量化感知训练:对于精度要求极高的场景,建议在模型训练阶段就采用量化感知训练,这能大幅减少后训练量化带来的精度损失。Hailo工具链也支持导入QAT模型。
- 编译参数:编译时的
--batch-size参数需要与推理时的批处理大小一致。对于实时视频流,通常batch-size=1。
6.3 资源监控与稳定性调优
长期运行AI应用,稳定性是第一位的。
- 散热是王道:无论是RPi5还是CM4,都必须安装散热片,强烈建议加装风扇。持续高负载下,过热降频是性能下降和系统不稳定的首要原因。可以用散热外壳或主动风扇模块。
- 电源要足额:rpi ai kit和树莓派全速运行时功耗不低。务必使用官方推荐或质量可靠的5V/3A以上电源适配器。供电不足会导致USB设备断开、系统重启等诡异问题。
- 内存管理:GStreamer管道中的
queue元素如果设置不当,可能导致内存不断增长。监控内存使用,如果发现泄漏,尝试调整max-size-buffers和leaky属性。 - 日志与调试:遇到问题,首先打开GStreamer的详细日志:
GST_DEBUG=3。对于Hailo相关的问题,可以设置HAILO_LOG_LEVEL=INFO或DEBUG来获取更详细的运行时信息。
经过这一整套从理论到实践,从硬件对比到软件调试的流程,你应该对如何在RPi5和CM4上利用rpi ai kit部署YOLOv8应用有了全面而深入的理解。记住,没有最好的平台,只有最适合你具体场景的平台。希望这份详尽的基准测试记录和心得,能帮你少走弯路,更快地将想法落地成稳定高效的边缘AI产品。
