MNN Chat 实战Android 端侧多模态大模型的直装、编译与性能全链路【免费下载链接】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/MNNMNN Chat 是 MNN 仓库官方维护的 Android 工程把文本、图像、音频、文生图四类模型放进同一个 App推理全部在设备端完成由 MNN-LLM 推理引擎驱动。这篇文章给两条线一条线装好应用跑通首次对话另一条线从 CMake 参数一路读到引擎层的配置与采样器实现。端侧大模型的两个硬约束MNN 的应对方式端侧部署大语言模型的瓶颈只有两个内存占用与推理速度。7B 级权重动辄几个 GB普通手机连装载都困难推理更是无从谈起。MNN Chat 的应对分三层量化压缩权重、mmap 让操作系统按需映射权重文件、针对 ARM 手写计算路径。官方给出的数字Android CPU 上 prefill 阶段速度是 llama.cpp 的 8.6 倍。由于推理全部在本地执行模型权重与聊天记录不离开手机隐私由架构层面保证。两条路径装好 MNN Chat 并完成首次对话APK 直装版本入口与设备适配边界不编译代码的话apps/Android/MnnLlmChat/README.md 的 Releases 章节列有各版本 APK 的下载入口文件命名形如mnn_chat_0_8_3.apk当前版本为 0.8.3versionCode 830下载后直接安装。仓库里若看到旧路径project/android/apps/MnnLlmApp那只是一个迁移提示页——工程已更名 MNN Chat 并迁至 apps/Android/MnnLlmChat/后续版本与文档以新主页为准。安装后的路径很短打开应用进入模型市场按标签、供应商筛选受支持的模型下载完成后直接在应用内开始对话历史聊天记录收在侧边栏随时点开继续。设备边界需要先讲明。官方声明该版本只在 OnePlus 13 和小米 14 Ultra 上完成测试大模型对硬件要求高低配手机可能出现推理缓慢、不稳定甚至无法运行其他设备的稳定性不作保证。工程配置上app/build.gradle锁定minSdk 26Android 8.0、targetSdk 35仅打包arm64-v8a并通过 NDK r27 开启 16KB 页大小支持ANDROID_SUPPORT_FLEXIBLE_PAGE_SIZESON。32 位设备无法运行。版本能力的时间线如下排障时可用于判断功能基线版本能力增量0.1首个公开版模型搜索、下载、对话附带 stable-diffusion-v1-5 文生图0.4.xQwen3 深度思考开关、深色模式0.6.8模型热更新、ASRTTS 实时语音通话0.8.xCPU LinearAttention、Arm82 fp16 优化路径API 兼容 Anthropic 协议源码编译 build_64.sh一套命令产出全部运行库源码构建的前置条件是 Android Studio 与 NDKNDK 版本必须与app/build.gradle的ndkVersion一致当前为27.2.12479018。先把 NDK 根路径写入环境变量export ANDROID_NDK${YOUR_NDK_ROOT}克隆仓库git clone https://gitcode.com/GitHub_Trending/mn/MNNproject/android/build_64.sh是 MNN 的 Android 通用构建脚本它使用 NDK 的 cmake 工具链默认 arm64-v8a 架构、c_staticSTL、android-21 最低 API 级别做 Release 编译。建好构建目录后把全部参数一次传入cd project/android mkdir build_64 cd build_64 ../build_64.sh -DMNN_LOW_MEMORYtrue -DMNN_CPU_WEIGHT_DEQUANT_GEMMtrue -DMNN_BUILD_LLMtrue -DMNN_SUPPORT_TRANSFORMER_FUSEtrue -DMNN_ARM82true -DMNN_USE_LOGCATtrue -DMNN_OPENCLtrue -DLLM_SUPPORT_VISIONtrue -DMNN_BUILD_OPENCVtrue -DMNN_IMGCODECStrue -DLLM_SUPPORT_AUDIOtrue -DMNN_BUILD_AUDIOtrue -DMNN_BUILD_DIFFUSIONON -DMNN_SEP_BUILDOFF -DCMAKE_SHARED_LINKER_FLAGS-Wl,-z,max-page-size16384 -DCMAKE_INSTALL_PREFIX. make installmake install结束后MNN、MNN_LLM、MNN_Audio、MNN_Diffusion等运行库装进build_64目录供应用工程引用。参数中影响结果最大的五项参数作用-DMNN_BUILD_LLMtrue编译 LLM 推理模块对应transformers/llm/engine缺省则应用内无大模型可跑-DMNN_ARM82true启用 ARMv8.2 扩展打开 fp16 半精度计算路径-DMNN_BUILD_DIFFUSIONON编译扩散模型推理能力承载文生图任务-DMNN_LOW_MEMORYtrue低内存模式优化权重存储布局降低运行时内存占用-DCMAKE_SHARED_LINKER_FLAGS-Wl,-z,max-page-size16384链接产物按 16KB 页对齐适配启用 16KB 页的新内核设备其余参数分别覆盖 OpenCL GPU 后端、视觉与音频模型支持、Transformer 算子融合、图片编解码、logcat 日志与权重反量化 GEMM。运行库就绪后回到应用工程打包安装cd ../../../apps/Android/MnnLlmChat ./installDebug.shinstallDebug.sh只做两件事先./gradlew assembleStandardDebug打出 standard 渠道 Debug 包再adb install app/build/outputs/apk/standard/debug/app-standard-debug.apk装到连接的设备。应用的网络与 UI 依赖均为开源组件okhttp 4.12.0、retrofit 2.9.0、Android-SpinKit 1.4.0、expandable-fab 1.2.1版本记录在app/build.gradle的 dependencies 中。四类模型共存一个进程LlmSession 与 JNI 会话分工Kotlin 侧的会话入口是 app/src/main/java/com/alibaba/mnnllm/android/llm/LlmSession.kt。load()的执行顺序固定先checkAndMergeSplitFiles()合并拆分的大权重文件再经ModelConfig.loadMergedConfig将默认配置与getExtraConfigFile提供的模型自定义配置合并启用 mmap 时先取 mmap 缓存目录最后把合并后的配置传给 C 层创建原生会话。生成阶段 token 由GenerateProgressListener逐个回调 UI支持中途终止与切换思考模式多轮对话依赖历史消息回填提示词0.6.8 起聊天界面可直接切换模型。JNI 层按模态拆分每个模态一个独立会话文件app/src/main/cpp/与 Kotlin 层一一对应C 会话文件职责Kotlin 对应类llm_session.cpp纯文本与多模态 LLMLlmSessiondiffusion_session.cpp扩散模型文生图DiffusionSessionsana_session.cppSana 图像编辑SanaSessionaudio/目录语音处理audio 相关会话类文生文、图生文、音频转文本、文生图四类任务因此能共存于同一进程各自持有独立推理会话互不阻塞。模型市场双源下载清单与热更新机制应用内置模型市场清单由 app/src/main/assets/model_market.json 描述当前version为 22。Kotlin 侧由 modelmarket 包的ModelMarketViewModel、ModelMarketAdapter等类解析渲染。配置分四块配置块内容tagTranslations能力标签中文映射Vision→图像理解、ImageGen→文生图、AudioGen→音频生成quickFilterTags快捷筛选入口深度思考、NPU、图像理解、文生图、音频等vendorOrder供应商展示顺序Qwen、DeepSeek、Gemma、LFM、Llama、InternLM 等models模型条目数组每条含modelName、tags、categories、sources同一模型的sources字段同时给出 HuggingFace 与 ModelScope 两个下载源例如gemma-4-E2B-it-MNN在两边各挂一个仓库路径。中文系统环境下应用默认选用 ModelScope 源0.5.1 版本引入。0.6.8 起加入热更新远端模型内容变化时无需删除原模型增量更新即可不必整包重下。进度回调onDownloadProgress与更新标记onDownloadHasUpdate均由ModelDownloadManager管理。下载链路的验证方式adb -s YOUR_DEVICE_ID logcat -d | grep onDownloadProgress完成判定标准有两条按钮文案变为「对话」且状态文本显示模型文件大小如 626.72 MB同时状态里不得出现「(有更新可用)」。若该提示异常出现检查ModelDownloadManager.onDownloadFileFinished是否正确清除了hasUpdate标记。完整回归流程见 apps/Android/MnnLlmChat/docs/mobile_use.md。性能拆解8.6 倍 prefill 来自四条路径官方口径数据如下对比对象场景prefill解码llama.cppAndroid CPU8.6×2.3×fastllmAndroid CPU20.5×8.9×llama.cppAndroid GPU最高 25.3×7.1×MLC-LLMAndroid GPU2.8×1.7×一个例外要注明Qwen2-7B 配短提示词时由于 MLC-LLM 采用对称量化MNN-LLM 略处下风。方法学细节见论文MNN-LLM: A Generic Inference Engine for Fast Large Language Model Deployment on Mobile Devices。这组数字的支撑是四条优化路径低比特量化权重在矩阵乘时即时反量化内存与带宽同时下降mmap 混合存储权重文件由操作系统按需映射不必一次性全读进 RAM模型加载明显变快Armv8.2 fp16 路径支持 ARMv8.2 的设备走半精度计算CPU LinearAttention 专用路径0.8.2.2 引入。配置体系集中在 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提示词模板system / user / assistant 模板与prompt_template另外保留投机解码入口speculative_type可选 lookahead、mtp、draftmodel、eagle 四种算法。采样器最常改的三个参数生成质量由 transformers/llm/engine/src/sampler.hpp 的采样器控制。日常最常调整的是三个参数默认值含义temperature0.8越高输出越随机topP0.9只在累积概率 90% 的前缀内选词max_new_tokens512限制单次生成长度应用设置页的 sampler type 与最大生成 Token 对应的就是这几项。采样器默认按topK → tfs → typical → topP → min_p → temperature的多阶段流水线执行0.6.8 起混合模式内可挂 penalty 类惩罚机制。PC 直连手机上的 8080 API局域网直连与 adb forward手机侧的 HTTP API 默认监听 8080 端口应用根目录的 test_api.py 可跑通全量测试用例。两种连法取决于是否需要回环地址模式前置条件命令局域网直连手机与电脑同处一个局域网python3 test_api.py --host PHONE_LAN_IP --port 8080 --test alladb forward先建立端口隧道adb forward tcp:8080 tcp:8080后执行python3 test_api.py --adb-forward --host 127.0.0.1 --port 8080 --test all局域网直连禁止填 127.0.0.1必须用手机的局域网 IPadb forward 模式可回退到本机回环地址。8080 上还暴露了 Anthropic 兼容的/v1/messages端点把 Claude 客户端的ANTHROPIC_BASE_URL指向手机 IP即可把本地大模型当作远端服务调用。交付前自查清单与两个深挖目录按顺序执行以下检查项构建与功能链路即算闭环ls build_64 # 应含 MNN、MNN_LLM、MNN_Audio、MNN_Diffusion 运行库 adb install app/build/outputs/apk/standard/debug/app-standard-debug.apk adb -s YOUR_DEVICE_ID logcat -d | grep onDownloadProgress adb forward tcp:8080 tcp:8080 python3 test_api.py --adb-forward --host 127.0.0.1 --port 8080 --test all下载完成标准再核对一遍按钮显示「对话」、状态显示文件大小、无「(有更新可用)」提示。继续深入的入口只有两个。transformers/llm/engine 是 MNN-LLM 引擎本体src/llm.cpp为主推理流程app/mls.cpp与mls_server.cpp是模型服务与 API 服务端回答为什么快apps/Android/MnnLlmChat 是完整应用工程Kotlin UI、JNI 会话与 API 服务的串联都在里面回答怎么组织起来。前者性能优化后者工程集成两条线读完即可覆盖 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创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考