在设备驱动之外,本项目主要考虑的 GPU 负载分为三部分:GPU 运行时、计算框架、AI 应用。
GPU 运行时(GPU Runtime)指的是为上层框架提供GPU交互功能的软件环境,包含一系列软件库、API等。典型的 GPU runtime 包括专门为 NVIDIA 显卡提供加速计算的 CUDA,及跨平台的 OpenCL、Vulkan 等。
Vulkan 是一套跨平台的标准 API,广泛应用于二维与三维图形渲染以及通用计算任务。
在当前主流的计算标准中,RPi 5 仅支持 Vulkan,而不支持 OpenCL 等其他标准。因此,本项目将专注于基于 Vulkan 的框架/应用。
Vulkan 本身并不包含标准的实现。对 RPi 5 而言,Vulkan 的支持主要依赖于开源的 Mesa 项目,其中包含了 V3DV 驱动,这是专门为 Broadcom V3D GPU 开发的 Vulkan 实现。
有关手动编译并安装 Mesa 最新版的教程:https://gist.github.com/Venemo/a9483106565df3a83fc67a411191edbd 。
https://www.reddit.com/r/linux_gaming/comments/1gu8l3k/how_do_i_install_the_latest_version_of_mesa/
计算框架指的是为上层应用提供模型推理能力的软件套件,涵盖模型加载、预处理、推理执行、结果后处理等模块。典型的框架包括 NCNN、Pytorch、ExecuTorch 等。其中,我们在 NCNN 与 Pytorch 测试了神经网络相关应用,在 ExecuTorch 测试了 LLM 应用。
NCNN 是专门为移动与嵌入式设备优化的高性能神经网络推理框架。它无第三方依赖,跨平台,可以基于 Vulkan 实现GPU加速计算,十分适合在 RPi 5 设备上部署AI推理任务。
本框架测试的上层 AI 应用为 SqueezeNet。
https://qengineering.eu/ncnn_rpi5.html
执行以下命令以构建并安装 Vulkan 后端的 NCNN 框架。
git submodule update --init --recursive
mkdir build && cd build
cmake .. \
-DNCNN_VULKAN=ON \
-DNCNN_SIMPLEOCV=ON \
-DNCNN_BUILD_EXAMPLES=ON \
-DNCNN_BUILD_TOOLS=ON \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_TOOLCHAIN_FILE=../toolchains/aarch64-linux-gnu.toolchain.cmake
make install
make -j$(nproc)
下载示例图片、ncnn-assets 等:
wget https://github.com/pytorch/hub/raw/master/images/dog.jpg -O dog.jpg
cp ~
git clone https://github.com/nihui/ncnn-assets.git
cd ~/ncnn/build/examples
cp ~/ncnn-assets/models/squeezenet_v1.1.bin .
cp ~/ncnn-assets/models/squeezenet_v1.1.param .
PyTorch 是一个开源深度学习框架,在学术界及工业界均有广泛应用。PyTorch 曾有实验性质的 Vulkan 后端实现,现在已转移到 ExecuTorch,其 PyTorch 部分不再被维护。
参考:https://docs.pytorch.org/tutorials/unstable/vulkan_workflow.html
ExecuTorch 是一个轻量级推理框架,主要面向边缘设备和移动端,用于高效运行由 PyTorch 导出的模型。ExecuTorch 有较为基础的 Vulkan 实现,可以在 GPU 部分地执行模型。
本框架测试的上层 AI 应用为 MobileNet 与 Llama-3.2-1B。
参考:https://docs.pytorch.org/executorch/stable/using-executorch-building-from-source.html#build-executorch-c-runtime-from-source https://docs.pytorch.org/executorch/stable/backends-vulkan.html
关于 SqueezeNet 和 MobileNet,可参考 https://medium.com/@vn2302/squeezenets-and-mobilenets-8bcfc75b841e
一种轻量级卷积神经网络,设计目标是在保持较高准确率的同时,显著减少模型参数量和大小。它通过 Fire Module,用1x1卷积替代部分3x3卷积,实现参数压缩,适合部署在资源受限设备上。
执行 make record V3D_APP=squeezenet 以进行记录。
目前,SqueezeNet 的 recording 经由 replay 后,已经能够输出分类结果。执行 make replay V3D_APP=squeezenet 以查看分类结果。可能需要手动修改分类所在内存的路径。
一种轻量级深度神经网络架构,专为移动和嵌入式设备设计。它采用深度可分离卷积,极大减少计算量和模型大小,同时保持较好的性能,是轻量级模型的代表。
执行 make record V3D_APP=mobilenet_ncnn 以进行记录。
执行 make record V3D_APP=NanoDet 以进行记录。
Meta 推出的 LLM(大规模语言模型),专注于自然语言处理任务。LLaMA通过高效的架构设计和大量训练数据,表现出强大的文本生成和理解能力,是现代大语言模型中的重要一员。
本项目所用到的 RPi 5 由于硬件资源较为有限,还不能让 Llama 有较完美的输出,但已经足够实现概念验证。
为构建 Vulkan 后端的 Llama runner 并获取适合 RPi 5 执行的 Llama 模型,请执行以下命令:
python -m examples.models.llama.export_llama \
--disable_dynamic_shape --vulkan -d fp32 \
-c ~/.llama/checkpoints/Llama3.2-1B/consolidated.00.pth \
-p ~/.llama/checkpoints/Llama3.2-1B/params.json \
--metadata '{"get_bos_id":128000, "get_eos_ids":[128009, 128001]}'
rm -rf cmake-rpi-out && \
cmake . -DCMAKE_INSTALL_PREFIX=cmake-rpi-out \
-DEXECUTORCH_BUILD_EXTENSION_DATA_LOADER=ON \
-DEXECUTORCH_BUILD_EXTENSION_MODULE=ON \
-DEXECUTORCH_BUILD_EXTENSION_TENSOR=ON \
-DEXECUTORCH_BUILD_EXTENSION_FLAT_TENSOR=ON \
-DEXECUTORCH_BUILD_VULKAN=ON \
-DEXECUTORCH_BUILD_XNNPACK=ON \
-DEXECUTORCH_BUILD_KERNELS_QUANTIZED=ON \
-DEXECUTORCH_BUILD_KERNELS_CUSTOM=ON \
-DEXECUTORCH_BUILD_KERNELS_OPTIMIZED=ON \
-DPYTHON_EXECUTABLE=python \
-Bcmake-rpi-out && \
cmake --build cmake-rpi-out -j4 --target install
rm -rf cmake-rpi-out/examples/models/llama && \
cmake examples/models/llama \
-DEXECUTORCH_BUILD_KERNELS_OPTIMIZED=ON \
-DEXECUTORCH_BUILD_KERNELS_CUSTOM=ON \
-DCMAKE_INSTALL_PREFIX=cmake-rpi-out \
-DPYTHON_EXECUTABLE=python \
-DBUILD_TESTING=OFF \
-Bcmake-rpi-out/examples/models/llama && \
cmake --build cmake-rpi-out/examples/models/llama -j4
执行 make record V3D_APP=llama 以进行记录。
ARM Compute Library 是 ARM 官方提供的 AI 推理基础库,重点支持 NEON 向量、OpenCL Kernel(部分平台)以及基本图像处理模块。它非常适合快速集成轻量级模型推理,尤其在运行 AlexNet、MobileNet 等常见卷积网络时表现优异。
在不支持 OpenCL 的设备上,也可以通过启用 NEON 即可运行,其性能优于传统实现方式,适用于轻量型模型和边缘设备。
scons arch=arm64-v8a Werror=1 debug=0 asserts=0 neon=1 opencl=1 build=native examples=1 -j$(nproc)
不可行。RPi 5 的 OpenCL 不好走gpu。
真不可行吗?需要再议。参考 https://forums.raspberrypi.com/viewtopic.php?t=194952。
https://github.com/kpet/clvk。遗憾的是并不支持 ARMCL。
py‑videocore6 是专为 Raspberry Pi 的 VideoCore GPU 提供的 Python 接口,适合调研 GPU 功能性,但该库不适用于深度学习模型加速,更多用于图形实验或 GPU 教学研究,目前不具备成熟的 LLM 推理能力。
不适用 RPi 5。
llama.cpp 支持基于 GGML 的 Vulkan 后端,但 RPi 5 由于 V3D GPU 的 shader 的共享内存过小,无法经由 GGML 运行 GPU 加速的 llama.cpp。
不适用 RPi 5。
支持基于 GGML 的 Vulkan 后端。
不适用 RPi 5。
支持基于 GGML 的 Vulkan 后端。
不适用 RPi 5。
未实验。