端侧 AI 提速 80%?如何让 Qwen3-VL 在手机起飞

原创 王召德、潘逢治 2026-06-11 19:44 浙江

当我们谈论“把大模型跑在手机上”时,速度始终是绕不开的核心问题。模型越大、参数越多,推理时的矩阵乘法运算量就越大。

随着 Arm 第二代可伸缩矩阵扩展 (SME2) 技术的普及,以及 MNN 推理引擎的深度适配,我们找到了一把打开端侧性能天花板的钥匙。只需在编译时开启一个开关,就能让 Qwen3-VL-4B 这样强大的多模态模型,在支持 SME2 的旗舰手机(如 vivo X300 等)上实现实时流畅推理。

本文,我们直接从工程落地的角度,手把手带你完成从引擎编译、模型部署到 APP 构建的完整流程,并用实测数据告诉你:为什么这套组合拳能让 Qwen 在端侧起飞。

什么是 SME2?

SME2 是 Armv9 架构中的一组高级 CPU 指令,它基于 SME 升级,核心突破在于引入了 ZA 矩阵累加器寄存器和流式模式。传统 Neon 做矩阵乘需要手工将外积拆成向量乘再累加,而 SME2 中的 FMOPA 等指令可以一条指令完成一个矩阵 tile 的外积累加。

通过引入 SME2 指令集,Armv9 架构 CPU 能够在 AI 异构计算框架下,高效支持大语言模型推理、图像处理、自然语言处理、语音生成等实时移动端推理任务。

认识我们的工具箱

在开始实战前,我们先了解一下本次部署的核心组件:

MNN:阿里巴巴开源的端侧推理引擎,具备高性能、轻量级、高通用性的特点。支持 CNN、Transformer、LLM、扩散模型等多种架构。

GitHub:https://github.com/alibaba/MNN

MNN-LLM:MNN 中专为大语言模型设计的模块,提供了从模型转换、量化到推理部署的全链路工具。

GitHub:https://github.com/alibaba/MNN/tree/master/transformers

Qwen 模型:本文以 Qwen3-VL-4B-Instruct 为例——一个 4B 参数的视觉语言模型,支持图文理解和对话,体积适中,模型能力较强。

GitHub:https://modelscope.cn/organization/Qwen

MNN 模型仓库:MNN 官方已经为大家转换和量化了多款 Qwen 模型,可直接下载使用。

GitHub:https://modelscope.cn/organization/MNN

MNN 的 SME2 适配:MNN 对 SME2 的支持采用编译时内建 + 运行时自动检测的设计,用户无需手动配置:

  • 编译时:通过 MNN_SME2 开关(默认 ON)控制是否编译 SME2 优化内核

  • 运行时:启动时自动检测硬件是否支持 SME2,支持则走 SME2 加速路径,不支持则回退到 i8mm → Neon,不会崩溃

  • 三精度覆盖:FP32、FP16、INT8/INT4 量化均有手写 SME2 汇编内核

  • 大小核调度:感知 SoC 大小核拓扑,SME2 大核用大 tile 处理主体计算,Neon 小核处理剩余部分,并行工作

  • KleidiAI 集成:集成 Arm 官方 KleidiAI 加速库,提供更多 SME2 微内核

实战演练:从零构建 SME2 加速的端侧大模型

接下来我们从源码开始,手把手走一遍开启 SME2 加速的完整端侧大模型部署流程。

前置准备

请确保以下环境已就绪:

  • Android NDK:推荐 r27+,需设置 $ANDROID_NDK 环境变量

  • ADB:用于与手机通信,adb devices 可正常发现设备

  • JDK 17:Gradle 编译 APP 所需

  • 手机:开启开发者模式和 USB 调试,通过 USB 连接电脑

Step 1:编译推理引擎

🟣 为 Android 编译 MNN 引擎的动态库(.so 文件)和命令行推理工具。 

SME2 功能默认开启,可以通过 -DMNN_SME2=ON/OFF 显式控制开关。

# 1. 进入 MNN 的 Android 工程目录
cd MNN/project/android


# 2. 创建编译目录
mkdir build_64 && cd build_64


# 3. 执行编译(SME2 默认开启,可通过 -DMNN_SME2 控制)
../build_64.sh "-DMNN_SME2=ON -DMNN_KLEIDIAI=ON -DMNN_LOW_MEMORY=true -DMNN_CPU_WEIGHT_DEQUANT_GEMM=true -DMNN_BUILD_LLM=true -DMNN_SUPPORT_TRANSFORMER_FUSE=true -DMNN_ARM82=true -DMNN_USE_LOGCAT=true -DMNN_OPENCL=true -DLLM_SUPPORT_VISION=true -DMNN_BUILD_OPENCV=true -DMNN_IMGCODECS=true -DLLM_SUPPORT_AUDIO=true -DMNN_BUILD_AUDIO=true -DMNN_BUILD_DIFFUSION=ON -DMNN_SEP_BUILD=OFF -DCMAKE_SHARED_LINKER_FLAGS='-Wl,-z,max-page-size=16384' -DCMAKE_INSTALL_PREFIX=."


# 4. 整理编译产出
make install

💡 make install 是必要的——它会将 libMNN.so 拷贝到 build_64/lib/ 目录,后续 APP 编译时会从这个路径引用动态库。

编译完成后,build_64/ 目录下会生成以下关键文件:

  • libMNN.so:MNN 核心引擎库

  • llm_demo:命令行推理工具

  • llm_bench:性能基准测试工具

Step 2:准备模型

🟣 方案一:直接下载 MNN 格式的模型(推荐) 

MNN 官方已提供转换和量化好的模型,可一步到位:

cd MNN/transformers/llm/export
pip install modelscope
modelscope download --model MNN/Qwen3-VL-4B-Instruct-MNN --local_dir Qwen3-VL-4B-Instruct-MNN

🟣 方案二:使用 MNN 的模型转换工具自行转换 

如果需要自定义量化参数或使用其他模型,可以手动转换:

# 1. 进入 MNN-LLM 的 export 目录
cd MNN/transformers/llm/export


# 2. 安装 Python 依赖
pip install -r requirements.txt


# 3. 从 ModelScope 下载原始模型
modelscope download Qwen/Qwen3-VL-4B-Instruct --local_dir Qwen3-VL-4B-Instruct


# 4. 执行转换(HQQ 量化)
python llmexport.py --path Qwen3-VL-4B-Instruct --dst_path Qwen3-VL-4B-Instruct-MNN --export mnn --hqq

💡 提示:--export mnn 代表导出为 MNN 格式,--hqq 是推荐的量化选项,可以有效提升模型精度。

Step 3:推送到手机,命令行验证

🟣 将引擎和模型推送到手机,通过命令行快速验证推理是否正常。

# 1. 推送引擎文件到手机
adb push project/android/build_64/llm_demo /data/local/tmp/
adb push project/android/build_64/llm_bench /data/local/tmp/
adb push project/android/build_64/libMNN.so /data/local/tmp/


# 2. 推送模型到手机
adb shell mkdir -p /data/local/tmp/mnn_models
adb push Qwen3-VL-4B-Instruct-MNN /data/local/tmp/mnn_models/


# 3. 进入手机 shell
adb shell


# 4. 赋予执行权限
chmod +x /data/local/tmp/llm_demo /data/local/tmp/llm_bench


# 5. 创建 prompt 文件
echo "你好" > /data/local/tmp/prompt.txt


# 6. 设置动态库路径并运行推理
cd /data/local/tmp
export LD_LIBRARY_PATH=/data/local/tmp:$LD_LIBRARY_PATH
./llm_demo /data/local/tmp/mnn_models/Qwen3-VL-4B-Instruct-MNN/config.json /data/local/tmp/prompt.txt

💡 知识点:为什么要设置 LD_LIBRARY_PATH?llm_demo 动态链接了 libMNN.so,Android 系统默认只在 /system/lib64 等系统目录搜索动态库,不会搜索 /data/local/tmp/。设置此变量告诉链接器也去指定目录查找。

当你看到模型流畅地回复时,恭喜,推理引擎已经跑通了!

🟣 确认 SME2 硬件支持 

在电脑上另开一个终端窗口,运行:

adb logcat | grep "device supports"

会看到类似输出:

The device supports: i8sdot:1, fp16:1, i8mm: 1, sve2: 1, sme2: 1

其中 sme2: 1 表示手机的 CPU 硬件支持 SME2 指令集,MNN 引擎会自动使用 SME2 加速路径进行推理。

💡 这行日志反映的是硬件检测结果,与编译选项无关。-DMNN_SME2=ON/OFF 控制的是编译产物中是否包含 SME2 优化代码——即使硬件支持,如果编译时关闭了该选项,引擎也不会走 SME2 加速路径。

Step 4:构建端侧 AI 应用

🟣 命令行验证成功后,我们可以将推理能力集成到一个完整的 Android APP 中。本文以 MNN 自带的 MNN Chat 示例应用为例:

# 1. 进入示例应用目录
cd MNN/apps/Android/MnnLlmChat


# 2. 编译 APK
./gradlew assembleStandardDebug


# 3. 安装到手机
adb install app/build/outputs/apk/standard/debug/app-standard-debug.apk

💡 提示:APP 编译时会自动从 project/android/build_64/lib/ 引用 libMNN.so 并打包进 APK,所以不需要再手动推送 .so 文件到手机——安装 APK 即完成了引擎的部署。

安装完成后,如果之前 Step 3 已将模型推送到 /data/local/tmp/mnn_models/,打开 MNN Chat 即可在"我的模型"中找到 Qwen3-VL-4B-Instruct 模型。你也可以通过 APP 内的模型市场直接下载其他模型。

以下是 MNN Chat 在手机上进行多模态问答的实际演示——用户拍照后,模型即可理解图片内容并流畅回答:

性能测评:SME2 带来多大提升?

为了验证 SME2 带来的实际性能收益,我们分别编译了 SME2 开启 和 SME2 关闭 两个版本的引擎,在同一台设备上使用 llm_bench 进行对比测试。

测试环境

  • 设备:vivo X300

  • 模型:Qwen3-VL-4B-Instruct-MNN

  • 测试工具:llm_bench

Prefill 阶段提升最为显著(+81%):因为 Prefill 需要一次性处理整段输入 token,是计算密集型任务(大批量矩阵乘),能充分利用 SME2 的矩阵外积指令和大 tile(HP=128)内核。这直接意味着更短的首字等待时间。

Decode 阶段提升相对较小(+13%):因为 Decode 是逐 token 生成,矩阵乘退化为矩阵×向量运算(batch=1),瓶颈在内存带宽而非计算吞吐,SME2 的优势相对有限。

进阶调优

在完成基本部署后,你可以根据自己应用的需求,通过以下手段进一步提升性能和精度: 

🟣 模型导出参数调优 在执行 llmexport.py 时,可以附加不同参数:

🟣 运行时参数调优 模型导出后,可以通过修改 config.json 控制运行时行为:

通过本文,我们完成了一条完整的端侧大模型部署路径:编译 MNN 引擎 → 准备模型 → 命令行验证 → 构建 APP → 性能测评。

SME2 作为 Arm 最新的矩阵加速指令集,在 MNN 的深度适配下,为端侧大模型推理带来了实实在在的性能提升——Prefill 阶段提速超过 80%。而 MNN 的"编译时内建 + 运行时自动检测"设计,让开发者无需额外配置即可享受硬件加速红利。

随着SME2技术的进一步广泛采用,端侧 AI 的性能天花板正在被不断抬高。期待看到更多创新的端侧 AI 应用!

你在端侧部署中遇到的最大“坑”是什么?欢迎在评论区分享,我们将选取三位同学送出定制周边一份。

推荐阅读

Agent 辅助开发,一站式打通 Qwen3-VL Android 端侧推理

跳转微信打开