跳到主要内容

Astra上的视觉语言模型

本教程将指导您如何在Synaptics Astra™ Machina™开发板上使用llama.cpp原生运行视觉语言模型(VLM)。VLM是能够理解和生成图像与文本信息的多模态AI模型。

信息
  • VLM将语言模型(LLM)、视觉编码器和多模态投影(mmproj)模型结合在一起。
  • 流行的开源VLM包括SmolVLM、MobileVLM、LLaVA、Qwen2-VL等。
备注

本教程兼容带有4GB内存的SL1680和SL1640开发板。虽然推理速度可能有所不同,但所有处理器的步骤均相同。

在本教程中,我们将指导您在Astra上运行SmolVLM-256M模型,这是一款专为边缘设备优化的轻量级视觉语言模型。您也可以使用llama.cpp在Astra SL系列上运行LFM2-VL-450M和MobileVLM-1.7B模型。

其他参数规模更大的视觉语言模型,如Qwen2-VL-2B、LLaVA-Phi-3、Llama 3.2 Vision等,在运行时需要比SL1680更多的内存。这些模型需要内存优化,我们正在探索在SL1680上支持它们的方法。

更多llama.cpp详情请见官方GitHub仓库

前置条件

您可以在Machina开发板上原生编译二进制文件,因为我们的OOBE(开箱即用体验)镜像v1.2.0及以上版本已支持所需的软件包和编译器。

如果您希望交叉编译(在主机上构建自定义二进制文件),请参考交叉编译llama.cpp教程,并生成llama-mtmd-cli二进制文件。

步骤1:生成llama.cpp二进制文件

您可以在Machina上原生生成llama.cpp二进制文件,只需在Machina终端或通过SSH连接,克隆llama.cpp仓库并构建用于多模型的llama-mtmd-cli二进制文件:

llama-mtmd-cli是一个命令行工具,旨在使用基于LLaMA的后端运行多模型。更多信息请见llama.cpp mtmd示例

如果尚未创建llama-mtmd-cli二进制文件,请执行:

cmake --build build --target llama-mtmd-cli -j$(nproc)

llama-mtmd-cli二进制文件将在~/build/bin/目录下生成。该二进制文件可用于运行支持的模型。

步骤2:下载支持的VLM模型

您可以运行llama.cpp GitHub仓库“支持的模型”部分中提到的任何模型。

SmolVLM是由Hugging Face 🤗团队构建的适用于边缘设备的紧凑型、快速VLM。因此本教程将使用SmolVLM-256M-Instruct-GGUF模型,这是世界上最小的多模态模型之一。

对于视觉语言模型,我们需要两种模型:

1. 语言模型(LLM)——这是负责生成文本响应的核心大语言模型,能够理解和处理自然语言。在llama-mtmd-cli等工具中,通过-m参数指定。

SmolVLM-256M-Instruct-Q8_0.gguf是SmolVLM 256M参数语言模型的量化版本(Q8_0),专为边缘设备上的快速推理而设计。

2. 多模态投影(mmproj)——多模态投影模型将图像编码器的嵌入映射到与语言模型相同的嵌入空间。通过--mmproj参数指定。

mmproj-SmolVLM-256M-Instruct-Q8_0.gguf是SmolVLM的GGUF格式mmproj模型。

这两种模型协同工作,使系统能够理解图像并基于视觉和文本输入生成有意义的文本。典型流程如下:

图像 → 视觉编码器 → mmproj → 语言模型 → 文本输出

下载量化模型和mmproj:

wget https://huggingface.co/ggml-org/SmolVLM-256M-Instruct-GGUF/resolve/main/SmolVLM-256M-Instruct-Q8_0.gguf
wget https://huggingface.co/ggml-org/SmolVLM-256M-Instruct-GGUF/resolve/main/mmproj-SmolVLM-256M-Instruct-Q8_0.gguf

步骤3:在Machina开发板上运行llama.cpp

下载好模型和二进制文件后,下载一张您希望视觉模型描述的图片(如catdog.jpg)。

catdog

现在,您可以在llama.cpp文件夹中运行SmolVLM-256M模型:

./build/bin/llama-mtmd-cli \
-m models/SmolVLM-256M-Instruct-Q8_0.gguf \
--mmproj models/mmproj-SmolVLM-256M-Instruct-Q8_0.gguf \
--image catdog1.jpg \
-p "请礼貌地回答用户的问题。USER: <image>\n 这张图片里有什么?ASSISTANT:"

您的Synaptics Astra开发板输出如下:

.. main: loading model: models/SmolVLM-256M-Instruct-Q8_0.gguf encoding image slice... image slice encoded in 14593 ms decoding image batch 1/1, n_tokens_batch = 64 image decoded (batch 1/1) in 643 ms

一只金毛猎犬躺在地板上,旁边有一只灰白色的猫。

llama_perf_context_print: load time = 413.81 ms llama_perf_context_print: prompt eval time = 15596.12 ms / 101 tokens ( 154.42 ms per token, 6.48 tokens per second) llama_perf_context_print: eval time = 374.54 ms / 17 runs ( 22.03 ms per token, 45.39 tokens per second) llama_perf_context_print: total time = 16190.02 ms / 118 tokens llama_perf_context_print: graphs reused = 16

这里最耗时的步骤是图像编码(将图像转换为嵌入并进行特征提取),大约需要14秒。文本生成速度更快(超过40 tokens/sec)。

恭喜

您已成功在Astra Machina开发板上使用llama.cpp运行视觉语言模型。可以尝试不同模型以权衡速度和准确性,或将llama.cpp集成到您的项目中。

我们还有其他方法,如设备端AI助手,支持RAG响应。也可以添加NPU上的目标检测。

更多高级用法和选项,请参考llama.cpp多模型GitHub