手机本地跑大模型: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 推理引擎官方维护的 Android 工程,把文本、图像理解、音频、文生图四类模型装进同一个 App,推理全部在手机上完成。底层的 MNN-LLM 引擎在 Android CPU 上 prefill 官方口径是 llama.cpp 的 8.6 倍,本文按"直装 APK → 源码构建 → 关键开关 → 配置与采样器 → PC 连通验证 → 源码深挖"的路径走一遍。
⚡ 硬指标:官方数据先砸实
官方给出的 Android CPU 基准(Qwen 7B 量级):prefill 是 llama.cpp 的 8.6 倍、fastllm 的 20.5 倍,解码分别是 2.3 倍与 8.9 倍。GPU 侧 prefill 最高是 llama.cpp 的 25.3 倍、解码 7.1 倍;对比 MLC-LLM 为 2.8 倍与 1.7 倍,Qwen2-7B 短提示词场景因对端用对称量化而略落后。这些数字来自低比特量化权重矩阵乘时即时反量化、mmap 让操作系统按需映射权重文件、Arm82 半精度计算路径三条机制的叠加,细节后文再拆。隐私层面,权重与聊天记录不离开设备。模型市场清单在app/src/main/assets/model_market.json(当前 version 22),覆盖 Qwen、DeepSeek、Gemma、Llama、InternLM 等家族,同一模型通常同时给 HuggingFace 与 ModelScope 两个源,中文系统默认走 ModelScope。
📦 装现成的还是自己编:两条能立刻跑的路
最省事的路:打开 apps/Android/MnnLlmChat/README.md 的 Releases 章节,最新版 0.8.3 对应包名mnn_chat_0_8_3.apk,下载即装。进入模型市场,按标签或供应商筛选,下载完直接对话,历史会话收在侧边栏。
源码构建路径分三段。先对齐环境:NDK 版本必须与app/build.gradle的 ndkVersion 一致(当前 27.2.12479018),然后导出根路径:
export ANDROID_NDK=${YOUR_NDK_ROOT} git clone https://gitcode.com/GitHub_Trending/mn/MNN再编译运行库:
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最后回应用工程装包,installDebug.sh只做两件事:./gradlew assembleStandardDebug再adb install对应产物:
cd ../../../apps/Android/MnnLlmChat ./installDebug.sh上面那行长命令里哪些开关最关键,下一节逐个拆。
能力开关表:6 个最值钱的 CMake 参数
| 参数 | 作用 |
|---|---|
-DMNN_BUILD_LLM=true | 编译 LLM 推理模块(对应transformers/llm/engine),缺了它 App 里没有大模型可跑 |
-DMNN_ARM82=true | 启用 ARMv8.2 扩展,打开 fp16 半精度计算路径 |
-DMNN_LOW_MEMORY=true | 低内存模式,优化权重存储布局,压低运行时内存 |
-DMNN_CPU_WEIGHT_DEQUANT_GEMM=true | 量化权重在矩阵乘时即时反量化,内存带宽双降 |
-DMNN_BUILD_DIFFUSION=ON | 编译扩散模型推理,承载文生图任务 |
-DCMAKE_SHARED_LINKER_FLAGS='-Wl,-z,max-page-size=16384' | 链接产物按 16KB 页对齐,适配 16KB 页新内核设备 |
其余参数分别负责 OpenCL GPU 后端(MNN_OPENCL)、视觉/音频模型(LLM_SUPPORT_VISION、MNN_BUILD_AUDIO)、Transformer 算子融合(MNN_SUPPORT_TRANSFORMER_FUSE)、图片编解码(MNN_IMGCODECS、MNN_BUILD_OPENCV)、logcat 日志(MNN_USE_LOGCAT)。build_64.sh本身固定 arm64-v8a、c++_staticSTL、android-21 最低 API、Release 构建;应用工程再锁定minSdk 26、targetSdk 35、仅arm64-v8a。32 位和老机型不用考虑——官方声明只在 OnePlus 13 与小米 14 Ultra 上测过。
llm_config.json 四组配置与采样器
运行时行为集中在 transformers/llm/engine/src/llmconfig.hpp 的LlmConfig里,既能加载llm_config.json,也兼容直接指向.mnn模型文件的旧用法。参数分四组:模型文件(llm_model、llm_weight、visual_model、audio_model)、后端(backend_type默认 cpu、thread_num默认 4、precision默认 low)、内存(use_mmap默认关、mmap_size默认 1024、kvcache_mmap),外加投机解码入口speculative_type,可选 lookahead、mtp、draftmodel、eagle 四种算法。
生成质量归transformers/llm/engine/src/sampler.hpp里的采样器管,最常动的是四项:temperature默认 0.8(越高越随机)、topP默认 0.9(只在累积概率 90% 前缀内挑词)、max_new_tokens默认 512(限制单次生成长度)、topK默认 40。默认混合流水线按topK → tfs → typical → topP → min_p → temperature顺序跑,混合模式下还可挂 penalty 惩罚。
回归验证:API 连通与模型下载怎么判定
App 在 8080 端口暴露 HTTP API,默认 token 是mnn-llm-chat,应用根目录的test_api.py可以一次打满 /v1/models、/v1/chat/completions、流式三类端点。连通方式二选一:
# 局域网直连:手机与电脑同网段,必须填手机局域网 IP,禁用 127.0.0.1 python3 test_api.py --host <PHONE_LAN_IP> --port 8080 --test all # 或者先建 adb 隧道,再打本机回环 adb forward tcp:8080 tcp:8080 python3 test_api.py --adb-forward --host 127.0.0.1 --port 8080 --test all判定标准是三类请求全部返回 200。模型下载链路则用adb logcat -d | grep "onDownloadProgress"过滤进度事件,完成看三点:按钮文案变「对话」、状态显示文件大小、不出现「(有更新可用)」。两种模式的完整说明与 Anthropic 兼容端点(把 Claude 客户端的 base URL 指向手机 IP 即可走/v1/messages)在 apps/Android/MnnLlmChat/docs/api_access_from_pc.md,下载回归全流程在 apps/Android/MnnLlmChat/docs/mobile_use.md。
顺着源码读:主流程与四种 JNI 会话
往下读,两个入口各回答一个问题。transformers/llm/engine是引擎本体,src/llm.cpp是主推理流程,配合前文的llmconfig.hpp与sampler.hpp,回答"为什么快";apps/Android/MnnLlmChat是完整应用工程,app/src/main/cpp/下每种模态一个 JNI 会话文件——llm_session.cpp管纯文本与多模态 LLM,diffusion_session.cpp管文生图,sana_session.cpp管 Sana 图像编辑,audio 目录管语音,与 Kotlin 层的LlmSession、DiffusionSession、SanaSession一一对应,回答"四类任务怎么串进同一个进程"。Kotlin 侧LlmSession.load()会先合并拆分的大权重文件、再合并默认与模型自定义配置,最后才把配置传给 C++ 建原生会话。整体架构可对照这张图:
【免费下载链接】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),仅供参考