3.4 VLM

本节介绍如何在 CIX P1 平台上运行图文特征模型和生成式 VLM(Vision-Language Model,视觉语言模型),并说明 AI Model Hub 中不同多模态资源的边界。

需要注意,AI Model Hub 中的 Image_to_Text 目录名称不能简单理解为“输入图片后生成自然语言描述”。当前该目录主要包含 CLIP、Chinese CLIP、RemoteCLIP、LongCLIP 和 SigLIP 等图文编码模型,它们通常输出图像和文本特征向量,用于跨模态检索、相似度计算或零样本分类。

真正能够根据图片生成自然语言答案的模型,主要通过 models/MultiModal 中的部署文档,结合 llama.cpp、MNN 或其他对应 Runtime 运行。

3.4.1 模型类型区别

类型

输入

输出

典型任务

普通 CV

图像或视频帧

类别、框、Mask、关键点

分类、检测、OCR、分割

图文编码模型

图像和文本

特征向量、相似度

图文检索、零样本分类

生成式 VLM

图像和文本指令

自然语言文本

图片描述、视觉问答

Omni 模型

图像、文本、音频或视频

文本、音频等

多模态交互和智能体

普通 CV 模型通常可以整体编译为一个或多个 .cix 文件。生成式 VLM 通常包括视觉编码器、多模态投影模块、语言模型、Tokenizer 和采样模块,不能默认将完整模型编译成单个 .cix。

3.4.2 当前多模态资源

3.4.2.1 图文编码模型

当前目录:

models/Generative_AI/Image_to_Text

包含:

onnx-Chinese-clip-vit-base-patch16
onnx_Chinese_clip
onnx_RemoteCLIP
onnx_clip
onnx_long_clip
onnx_siglip-so400m-patch14-384

这些模型目录均包含:

  • 图像 Encoder .cix;

  • 文本 Encoder .cix;

  • CFG;

  • 校准数据;

  • inference_npu.py;

  • inference_onnx.py;

  • 测试数据。

例如:

onnx_Chinese_clip/
├── clip_cn_img.cix
├── clip_cn_txt.cix
├── cfg/
├── datasets/
├── model/
├── test_data/
├── inference_npu.py
└── inference_onnx.py

3.4.2.2 文本检索模型

当前目录:

models/Generative_AI/Text_Image_Search/onnx_bge_small_zh

包含:

bge-small-zh_256.cix
inference_npu.py
inference_onnx.py
cfg/
model/
scripts/

BGE 是文本向量模型,主要用于文本检索和向量化,不是完整的图片问答 VLM。

3.4.2.3 生成式多模态模型部署文档

当前 models/MultiModal 目录中的模型资源分为以下两种形式。

1. 完整模型目录

部分模型以完整目录形式提供,例如:

Qwen2.5-VL-3B-Instruct
Qwen3-VL-2B-Instruct
Qwen3-VL-4B-Instruct

此类目录通常包含模型配置、测试数据、推理脚本和已经编译好的 .cix 文件,部署时必须保留完整目录结构,并按照目录内的 ReadMe.md 执行。通常可使用 inference_npu.py 调用已提供的 .cix 模型,在 NPU 上完成视觉编码或相关推理。

2. Markdown 部署指导文档

部分模型仅提供独立的 Markdown 部署文档,例如:

gemma-3-4b-it.md
gemma-4-E2B-it.md
gemma-4-E4B-it.md
GLM-OCR.md
InternVL2_5-4B.md
PaddleOCR-VL-1.5.md
Qwen2-VL-2B-Instruct.md
Qwen2.5-Omni-3B.md
Qwen2.5-Omni-7B.md
Qwen2.5-VL-3B-Instruct.md
Qwen3-Omni-30B-A3B-Instruct.md
Qwen3-VL-2B-Instruct.md
Qwen3-VL-4B-Instruct.md
Qwen3.5-0.8B.md
Qwen3.5-2B.md
Qwen3.5-35B-A3B.md
Qwen3.5-4B.md
Qwen3.5-9B.md
Qwen3.6-35B-A3B.md

此类 .md 文件是模型部署说明,本身不包含完整模型文件、.cix 文件或 inference_npu.py。部署前必须打开对应文档,并按照其中指定的模型下载地址、模型格式、推理框架、运行程序及依赖要求完成部署。

同一模型可能同时提供完整目录和独立部署文档。此时应优先查看完整模型目录中的 ReadMe.md,并结合对应的独立 Markdown 文档确认模型版本、运行方式和依赖要求。

3.4.2.4 不属于 VLM 的目录

以下目录虽然属于 Generative AI,但不属于视觉语言问答模型:

Generative_AI/Text_to_Image

其中的 SDXL-Turbo 和 Stable Diffusion V1.4 用于文生图,不应写入 VLM 图片问答流程。

3.4.3 部署路径选择

路径

模型要求

适用场景

AI Model Hub 完整模型目录或图文编码示例

配套模型、.cix 文件、推理脚本及配置

快速验证图文编码或已有多模态模型

llama.cpp

主模型 GGUF、视觉模型或投影文件

图片描述和视觉问答

MNN

完整 MNN 多模态模型目录

CPU/OpenCL 多模态推理

NPU + CPU/GPU 混合

可拆分并适配的子模型

高级优化和定制部署

预构建多模态 Demo

对应 ARM64 DEB 和资源

快速展示和二次开发

推荐顺序:

  1. 检查对应模型提供的是完整目录还是独立 Markdown

  2. 按照目录内 ReadMe.md 或独立部署文档准备环境

  3. 使用指定模型和框架完成基础验证

  4. 确认图像输入真正生效

  5. 验证 Vulkan、OpenCL 或 NPU

  6. 最后考虑自定义 NPU 子模型拆分

不要在首次验证时同时修改模型版本、量化方式、推理框架和硬件后端。

3.4.4 运行 Chinese CLIP 图文匹配示例

进入目录:

cd "$AI_MODEL_HUB_DIR/models/Generative_AI/Image_to_Text/onnx_Chinese_clip”

检查模型:

ls -lh clip_cn_img.cix
ls -lh clip_cn_txt.cix
ls -lh inference_npu.py
ls -lh test_data

执行:

python3 inference_npu.py

脚本通常会完成:

  1. 读取图片和候选文本

  2. NPU 图像 Encoder

  3. NPU 文本 Encoder

  4. 特征归一化

  5. 计算相似度

  6. 输出匹配结果

正常输出可能是特征相似度、候选文本排序或分类结果,而不是一段自然语言图片描述。

其他图文模型也可以采用相同的验证方式:

cd "$AI_MODEL_HUB_DIR/models/Generative_AI/Image_to_Text/onnx_clip”
python3 inference_npu.py
cd "$AI_MODEL_HUB_DIR/models/Generative_AI/Image_to_Text/onnx_siglip-so400m-patch14-384”
python3 inference_npu.py

不同模型的文本 Tokenizer、图片尺寸和输出维度不同,图像 Encoder 与文本 Encoder 必须使用同一模型版本配套的文件。

3.4.5 运行生成式 VLM

首先检查目标模型在 models/MultiModal 目录中的资源形式。

部分模型提供完整模型目录,例如:

Qwen2.5-VL-3B-Instruct/
Qwen3-VL-2B-Instruct/
Qwen3-VL-4B-Instruct/

此类模型应保留完整目录结构,并优先按照目录内的 ReadMe.md、推理脚本和配置文件运行。

查看示例:

cd "$AI_MODEL_HUB_DIR/models/MultiModal/Qwen2.5-VL-3B-Instruct”
sed -n '1,260p' ReadMe.md
ls -lh

其他模型可能仅提供独立的 Markdown 部署文档,例如:

Qwen2-VL-2B-Instruct.md

查看对应文档:

cd "$AI_MODEL_HUB_DIR
sed -n '1,260p' \
models/MultiModal/Qwen2-VL-2B-Instruct.md

如果同一模型同时存在完整目录和同名 Markdown,应先阅读完整目录中的 ReadMe.md,再结合独立 Markdown 确认模型版本、依赖和运行方式。

部署文档中通常会明确:

  • 使用 llama.cpp、MNN 或其他框架;

  • 需要下载的原始模型;

  • 模型转换方式;

  • 量化格式;

  • 主模型文件;

  • 视觉模型或投影文件;

  • 图片和 Prompt 的传入方式;

  • 运行程序名称;

  • 推荐的线程和后端参数。

llama.cpp 通用形式

对于 llama.cpp 多模态路径,常见运行形式为:

<VLM_CLI> \
-m <MAIN_MODEL.gguf> \
--mmproj <VISION_MODEL.gguf> \
--image <IMAGE_PATH> \
-p "<PROMPT>"

其中:

参数

说明

<VLM_CLI>

当前 Release 提供的多模态程序

-m

语言模型主体

–mmproj

视觉编码器或多模态投影模型

–image

输入图片

-p

文本问题

实际程序名称和参数必须以对应 Markdown 和当前软件包的 –help 为准。

MNN 通用形式

对于 MNN 多模态路径,通常需要完整的 MNN 模型目录:

<llm_demo> \
<MODEL_DIR>/config.json \
<PROMPT_FILE>

图片路径可能写在 Prompt、配置文件或模型专用输入格式中,应以对应模型文档为准,不能直接套用普通文本 LLM 的运行方式。

3.4.6 验证图片输入是否生效

模型能够输出文字,不代表视觉输入已经生效。

至少进行以下验证:

  1. 对同一图片提出两个不同问题;

  2. 使用两张内容明显不同的图片;

  3. 有图和无图分别运行;

  4. 检查日志中是否加载视觉模型;

  5. 检查是否产生 Image Embedding 或 Image Token;

  6. 检查回答是否与图片内容相关。

如果模型只能普通聊天,应检查:

  • 是否误用了纯文本 LLM;

  • 视觉模型或 mmproj 是否加载;

  • 图片路径是否正确;

  • 主模型和视觉模型是否匹配;

  • Prompt 模板是否符合当前 VLM;

  • 当前 CLI 是否真正支持多模态。

3.4.7 NPU 混合部署说明

当前 NOE 编译器没有通用的:

model_domain=vlm
model_domain=image_to_text
model_domain=multimodal_chat

因此不能将任意完整 VLM 直接执行:

  1. 完整 VLM

  2. cixbuild

  3. 单个 vlm.cix

NOE 当前公开的 model_domain 仍为图像分类、目标检测、关键词识别、语音识别和图像分割。

VLM 混合部署通常采用:

组件

可选后端

图片解码和 Resize

CPU、CME、多媒体组件

Vision Encoder

NPU、GPU 或 CPU

多模态投影层

CPU、GPU 或 NPU

LLM Prefill/Decode

CPU、Vulkan、OpenCL

Tokenizer 和采样

CPU

如需将 Vision Encoder 单独部署至 NPU,应完成:

  1. 从完整 VLM 中拆分 Vision Encoder;

  2. 导出固定输入 Shape 的 ONNX;

  3. 准备校准数据;

  4. 使用经过验证的 CFG 编译;

  5. 对比原始模型和 NPU 输出;

  6. 检查特征维度、数据类型和布局;

  7. 将特征接入投影层和 LLM;

  8. 验证端到端图片问答结果。

该路径属于高级适配工作。赛事基础项目应优先使用已有 llama.cpp、MNN 或多模态 Demo。

3.4.8 多模态应用 Demo

当前 AI Model Hub 提供以下相关 Demo:

image-multichat-gradio
image-multichat-streamlit
picquery-cn-gradio
videoquery-streamlit
ai-album-streamlit

这些 Demo 可以作为参赛作品界面和 Pipeline 的参考,但最终作品仍需体现 Agent 的多步骤规划、工具调用和状态推进能力,不能仅提交模型展示页面。

3.4.9 性能和资源观察

VLM 端到端耗时通常包括:

阶段

说明

图片加载

文件读取和图片解码

图片预处理

Resize、裁剪、归一化

Vision Encoder

生成图像特征

多模态投影

转换为 LLM 可接收的特征

Prefill

处理图像 Token 和 Prompt

Decode

逐 Token 生成答案

输出处理

Tokenizer 解码和格式化

建议记录:

  • 模型名称和参数规模;

  • 主模型量化格式;

  • 视觉模型格式;

  • 图片分辨率;

  • 上下文长度;

  • CPU、Vulkan、OpenCL 或混合后端;

  • 视觉编码时间;

  • 首 Token 延迟;

  • Prefill 速度;

  • Decode 速度;

  • 峰值内存;

  • 是否发生后端回退。

不同模型、量化格式、图片分辨率和上下文长度的结果不能直接横向比较。

3.4.10 常见问题

问题现象

处理建议

MultiModal 目录只有 .md

当前目录主要提供部署指导,应按照 Markdown 准备模型

Chinese CLIP 不输出自然语言

该模型是图文编码模型,不是生成式 VLM

模型能聊天但看不懂图片

检查视觉模型、图片参数和 Prompt 模板

主模型和视觉模型加载失败

确保二者来自同一模型版本

图片问答结果与图片无关

检查图片是否成功读取并编码

MNN 只能文本推理

检查是否使用完整多模态模型目录

Vulkan/OpenCL 未生效

检查 Runtime、构建选项和运行日志

完整 VLM 无法直接 cixbuild

NOE 没有通用 VLM 模型领域,应拆分子模型

内存不足

使用更小模型、更低量化或降低图片和上下文规模

推理速度慢

分别统计 Vision Encoder、Prefill 和 Decode

多模态 Demo 无法启动

检查对应 Demo 目录中的 ARM64 DEB 软件包是否已正确安装,并核对模型资源和端口配置

模型产生错误描述

对关键操作增加规则校验、置信度判断或人工确认