news 2026/9/28 3:41:58

手机本地跑多模态大模型:MNN Chat 从安装到源码的完整拆解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
手机本地跑多模态大模型:MNN Chat 从安装到源码的完整拆解

手机本地跑多模态大模型: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)。

方式二:源码构建。完整流程见编译手册一节。

装好之后的操作路径很短:

  1. 打开应用,进入模型市场,浏览或按标签、供应商筛选;
  2. 点击"下载",等待进度走完(支持按系统语言自动选择默认下载源);
  3. 按钮变为"对话"后,即可与模型交互,支持图片、音频附件输入;
  4. 侧边栏保存历史会话,可随时回看或继续。

设备要求要先看清楚。官方 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=trueCPU 反量化矩阵乘:低比特权重在 GEMM 时即时还原,不必常驻全精度副本
MNN_BUILD_LLM=true编入 LLM 推理模块,对应transformers/llm/engine
MNN_SUPPORT_TRANSFORMER_FUSE=trueTransformer 子图融合:把反复出现的结构合并,减少算子调度开销
MNN_ARM82=true打开 ARMv8.2 指令集,启用 fp16 半精度计算路径
MNN_USE_LOGCAT=true日志改道 Android logcat,方便真机调试
MNN_OPENCL=true编译 OpenCL GPU 后端
LLM_SUPPORT_VISION=trueLLM 引擎加载视觉编码器,图/视频问答由此开启
MNN_BUILD_OPENCV=true编入内置 OpenCV 图像处理
MNN_IMGCODECS=true图片编解码支持,读入各类格式素材
LLM_SUPPORT_AUDIO=trueLLM 引擎支持音频输入模型
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),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 3:40:47

【C++】 类与对象(二)(2.运算符重载)

目录 赋值运算符重载 1.运算符重载 2.赋值运算符重载 3.日期类实现 取地址运算符重载 1.const 成员 2.取地址运算符重载 运算符重构(operator) 运算符重构是对类这和算符的适配性进行一个适配的重构,就是对于平常的运算符无法进行加减…

作者头像 李华
网站建设 2026/9/28 3:38:35

TVA具身智能系统(6):作为能力构建基石的四维核心能力体系

前沿技术探索:TVA智能体(简称TVA)TVA智能体(亦称“AI智能体视觉”)是依托Transformer架构与“因式智能体”理论构建的新型工业视觉系统,也是当前最具代表性的具身视觉技术之一。它有机融合深度强化学习&…

作者头像 李华
网站建设 2026/9/28 3:38:02

自动购票脚本 5 分钟上手:大麦抢票完整教程

自动购票脚本 5 分钟上手:大麦抢票完整教程 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 本教程带你跑通 Automatic_ticket_purchase,一个大麦网的自…

作者头像 李华
网站建设 2026/9/28 3:37:24

用 Python 对比等额本金与等额本息:总利息差与月供递减节奏

用 Python 对比等额本金与等额本息:总利息差与月供递减节奏选按揭方式时,等额本金与等额本息的差别常被概括成"前者利息少、后者月供低",但差距具体有多少、月供曲线长什么样,多数介绍止步于一句定性描述。本文由深工优…

作者头像 李华
网站建设 2026/9/28 3:34:38

Accurate and Interpretable Postmenstrual Age Prediction via Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文旨在解决新生儿月经后年龄(PMA)预测中准确性与可解释性的双重挑战。研究基于多模态大型语言模型(MLLM)Qwen2.5-VL-7B,通过参数高效微调(PEFT)策略(结合指令微调与低秩适应LoRA),利用新生儿脑部MRI衍生的4种2D皮质表面投影图(皮…

作者头像 李华