端侧 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、扩散模型等多种架构。
MNN-LLM:MNN 中专为大语言模型设计的模块,提供了从模型转换、量化到推理部署的全链路工具。
Qwen 模型:本文以 Qwen3-VL-4B-Instruct 为例——一个 4B 参数的视觉语言模型,支持图文理解和对话,体积适中,模型能力较强。
MNN 模型仓库:MNN 官方已经为大家转换和量化了多款 Qwen 模型,可直接下载使用。
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/exportpip install modelscopemodelscope 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_modelsadb push Qwen3-VL-4B-Instruct-MNN /data/local/tmp/mnn_models/# 3. 进入手机 shelladb 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/tmpexport 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 端侧推理