手机本地跑多模态大模型:MNN Chat 从安装到源码的完整拆解
【免费下载链接】MNNMNN: A blazing-fast, lightweight inference engine battle-tested by Alibaba, powering high-performance on-device LLMs and Edge AI.项目地址: https://gitcode.com/GitHub_Trending/mn/MNN
在手机上装好 MNN Chat,再从内置市场挑一个模型,聊天、看图、听音、画图全部在设备内完成。这款端侧多模态大模型应用由 MNN-LLM 推理引擎驱动,权重与对话记录不离开设备,断网也能用。本文按"先跑起来、再看代码"的顺序展开:前半部分覆盖安装、使用与模型市场,后半部分逐层拆开编译参数、引擎配置、采样策略和 PC 侧 API 的验证方法。
30 秒看懂 MNN Chat
一句话定位:MNN-LLM 引擎 + Android 壳应用,四模态端侧推理。
| 维度 | 说明 |
|---|---|
| 项目定位 | 全功能多模态大模型 Android 应用 |
| 底层引擎 | MNN-LLM(仓库内 transformers/llm/engine) |
| 运行位置 | 全程设备本地,无云端推理 |
| 支持模态 | 文生文、图生文(含视频输入)、音转文、文生图(扩散模型) |
| 最低系统 | Android 8.0(minSdk 26),targetSdk 35,仅 arm64-v8a |
| 已验证设备 | OnePlus 13、小米 14 Ultra |
⚠️ 旧入口
project/android/apps/MnnLlmApp/下的 README.md 已变更为迁移提示页:应用更名为 MNN Chat,主页迁移到 apps/Android/MnnLlmChat/README.md,后续版本与文档一律以新主页为准。
从安装到第一次对话
两条获取路径:下官方 APK,或自己从源码编译。
方式一:官方 APK。README.md 的 Releases 章节按版本列出下载入口,文件命名形如mnn_chat_0_8_3.apk。当前版本为 0.8.3(versionCode 830)。
方式二:源码构建。完整流程见编译手册一节。
装好之后的操作路径很短:
- 打开应用,进入模型市场,浏览或按标签、供应商筛选;
- 点击"下载",等待进度走完(支持按系统语言自动选择默认下载源);
- 按钮变为"对话"后,即可与模型交互,支持图片、音频附件输入;
- 侧边栏保存历史会话,可随时回看或继续。
设备要求要先看清楚。官方 README 明确标注:当前版本仅在 OnePlus 13 和小米 14 Ultra 上完成测试。大模型对硬件要求高,低配设备可能出现推理缓慢、卡顿甚至无法运行,官方不承诺其他机型的稳定性。工程配置也印证了这一取向:app/build.gradle 中abiFilters只保留arm64-v8a,CMake 参数开启了-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON(NDK r27 的 16KB 页大小支持),minSdk 26、compileSdk 35。遇到问题建议直接提 issue。
能力清单:能聊天、能看图、能听音、能画图
按"用户能做什么"逐条看,每条末尾给出源码落点。
文生文。通用对话、代码生成、数学推理。对话主流程由 C++ 会话层承载,JNI 入口与流式输出缓冲都在这里:app/src/main/cpp/llm_session.cpp。
图生文。视觉理解支持单图、多图,smolvlm-video 系列还支持视频输入。视频帧的解码与处理实现在 app/src/main/cpp/video/ 目录,视觉开关则由编译参数LLM_SUPPORT_VISION=true与模型配置is_visual共同决定。
音转文。语音识别与实时语音通话(ASR + TTS,0.6.8 版本引入)。音频理解依赖编译参数LLM_SUPPORT_AUDIO=true、MNN_BUILD_AUDIO=true,合成侧由独立模块 apps/frameworks/mnn_tts 提供。
文生图。基于扩散模型,另有 Sana 图像编辑模型(0.7.7 引入)。两个会话文件分别是 diffusion_session.cpp 与 sana_session.cpp,对应 Kotlin 层的DiffusionSession、SanaSession类。
速度表现(官方 README 声明)。CPU 基准上,MNN-LLM 预填充速度相比 llama.cpp 提升 8.6 倍、相比 fastllm 提升 20.5 倍;解码速度分别快 2.3 倍与 8.9 倍。GPU 侧结论更复杂:Qwen2-7B 短提示词场景因 MLC-LLM 的对称量化优势略有落后;其余对比中预填充最快可比 llama.cpp 快 25.3 倍、解码快 7.1 倍,相对 MLC-LLM 提升 2.8 倍与 1.7 倍。以下动图为 Android 上 qwen-7b 的推理速度直观对比:
隐私。全部推理在设备内完成,模型权重与聊天记录不上行任何外部服务器,这是架构层面的设计,不是可选项。
选模型:市场配置、双下载源与热更新
模型市场的行为由一个 JSON 驱动:model_market.json(当前version为 22),Kotlin 侧的ModelMarketViewModel、ModelMarketAdapter、FilterDialogFragment负责解析与渲染。配置分四块:
- tagTranslations:能力标签的中文映射,如
Vision→图像理解、Audio→音频理解、ImageGen→文生图、Think→深度思考、Chat→对话; - quickFilterTags:顶部快捷筛选,共 8 项:Think、NPU、Vision、ImageGen、Audio、AudioGen、Code、Video;
- vendorOrder:供应商展示顺序,20 家:Qwen、DeepSeek、Gemma、LFM、Smol、stability.ai、Llama、FastVLM、MiMo、ERNIE、Baichuan、Phi、MobileLLM、TinyLlama、THUDM、InternLM、01.AI、Hunyuan、MiniCPM、Lingshu;
- models:模型条目数组,每条含
modelName、tags、categories、sources、min_app_version、size_gb、file_size等字段。
双下载源。同一模型通常同时给出 HuggingFace 与 ModelScope 两个仓库地址(sources字段),例如gemma-4-E2B-it-MNN对应taobao-mnn/...(HuggingFace)与MNN/...(ModelScope)。除这两个源外,0.3.0 起还支持 modelers.cn。首次安装若系统语言为中文,默认走 ModelScope(0.5.1 修复/明确的行为)。
热更新。0.6.8 起,远程模型内容变化时无需删除旧模型即可增量更新。下载进度回调onDownloadProgress、更新标记onDownloadHasUpdate统一由ModelDownloadManager管理,回归验证方法见验证与排障一节。
编译手册:环境准备、CMake 参数逐个讲、一键安装
先备环境,再按顺序执行三段命令:克隆仓库、编译 MNN 运行库、构建并安装应用。
环境。Android Studio;NDK 版本须与 app/build.gradle 的ndkVersion一致,当前为27.2.12479018;另需导出 NDK 根路径环境变量。
克隆仓库:
git clone https://gitcode.com/GitHub_Trending/mn/MNN编译 MNN 运行库。build_64.sh 是 Android 通用构建脚本:基于$ANDROID_NDK的 cmake 工具链,默认 arm64-v8a、c++_staticSTL、最低 API 21、Release 编译,最后执行make -j4。README 给出的完整调用如下(命令行追加的参数会覆盖脚本默认值,例如把默认的MNN_USE_LOGCAT=false打开):
cd project/android mkdir build_64 cd build_64 ../build_64.sh "-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=." make install各参数含义(参数名照抄,作用重写):
| CMake 参数 | 作用 |
|---|---|
MNN_LOW_MEMORY=true | 低内存模式:重排权重存储布局,压低推理时的内存峰值 |
MNN_CPU_WEIGHT_DEQUANT_GEMM=true | CPU 反量化矩阵乘:低比特权重在 GEMM 时即时还原,不必常驻全精度副本 |
MNN_BUILD_LLM=true | 编入 LLM 推理模块,对应transformers/llm/engine |
MNN_SUPPORT_TRANSFORMER_FUSE=true | Transformer 子图融合:把反复出现的结构合并,减少算子调度开销 |
MNN_ARM82=true | 打开 ARMv8.2 指令集,启用 fp16 半精度计算路径 |
MNN_USE_LOGCAT=true | 日志改道 Android logcat,方便真机调试 |
MNN_OPENCL=true | 编译 OpenCL GPU 后端 |
LLM_SUPPORT_VISION=true | LLM 引擎加载视觉编码器,图/视频问答由此开启 |
MNN_BUILD_OPENCV=true | 编入内置 OpenCV 图像处理 |
MNN_IMGCODECS=true | 图片编解码支持,读入各类格式素材 |
LLM_SUPPORT_AUDIO=true | LLM 引擎支持音频输入模型 |
MNN_BUILD_AUDIO=true | 编译音频处理相关能力 |
MNN_BUILD_DIFFUSION=ON | 扩散模型文生图推理 |
MNN_SEP_BUILD=OFF | 不做分离式构建,产物以整体库形态链接 |
CMAKE_SHARED_LINKER_FLAGS='-Wl,-z,max-page-size=16384' | 共享库按 16KB 页对齐,适配 16KB page 新内核设备 |
CMAKE_INSTALL_PREFIX=. | 产物装进当前构建目录,供应用工程引用 |
构建并安装应用。运行库装好后回到应用目录,执行 installDebug.sh:
cd ../../../apps/Android/MnnLlmChat ./installDebug.sh脚本内只有两条命令:
./gradlew assembleStandardDebug adb install app/build/outputs/apk/standard/debug/app-standard-debug.apk即打包standard渠道的 Debug 包,再推送到已连接设备。
build.gradle 里值得留意的配置:
- 标识:
applicationId com.alibaba.mnnllm.android,namespace相同,release 变体追加.release后缀,包名变为com.alibaba.mnnllm.android.release; - 渠道:
store维度分standard与googleplay两个 flavor,后者versionNameSuffix ".gp",签名依赖KEYSTORE_FILE、KEYSTORE_PASSWORD、KEY_ALIAS、KEY_PASSWORD环境变量; - 免压缩:
noCompress列出weight、part1~part10、mnn、bin、jar、mdl、msc、mv、txt、json、md,避免 APK 打包阶段压缩大体积模型文件; - 可选开关:
-PENABLE_FIREBASE=true且存在google-services.json时才启用 Firebase Crashlytics;-PADD_BUILTIN=true时预构建阶段下载内置模型并生成市场配置。
引擎内幕:配置层、策略层、应用层
三层结构自上而下拆开看:Kotlin 会话层管生命周期,C++ 配置层管"加载什么、怎么跑",采样层管"下一个 token 怎么选"。
配置层:llmconfig.hpp。LlmConfig既可解析llm_config.json,也兼容直接传.mnn路径的旧用法。关键字段分五组:
- 模型文件:
llm_model(默认llm.mnn)、llm_weight(默认llm.mnn.weight)、visual_model、audio_model、tokenizer_file(默认tokenizer.txt),以及 talker、code_predictor、speech_decoder 等语音合成子模型路径; - 生成参数:
max_all_tokens(默认 2048)、max_new_tokens(默认 512)、reuse_kv、prompt_cache、ignore_eos; - 后端参数:
backend_type(默认cpu)、thread_num(默认 4)、precision(默认low)、power、memory,多模态部分可通过mllm子配置单独覆盖; - 内存与模板:
use_mmap、use_cached_mmap、mmap_size(默认 1024)、kvcache_mmap——这就是 README 所说 mmap 加速加载的落点;提示词模板组如system_prompt_template,默认值为 Qwen3 风格的 `system\n%s
【免费下载链接】MNNMNN: A blazing-fast, lightweight inference engine battle-tested by Alibaba, powering high-performance on-device LLMs and Edge AI.项目地址: https://gitcode.com/GitHub_Trending/mn/MNN
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考