MNN 深度学习推理引擎全解析:从端侧轻量部署到本地 LLM 推理的完整技术指南
【免费下载链接】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(Mobile Neural Network)是阿里巴巴开源的高效轻量级深度学习推理引擎,同时支持模型推理与训练,已深度集成于手机淘宝、天猫、优酷、钉钉、闲鱼等 30+ 应用,覆盖直播、短视频、搜索推荐、商品图像搜索、互动营销、安全风控等 70+ 场景,并可用于 IoT 等嵌入式设备。本文以 README.md 为骨架,结合仓库源码与配套文档,系统讲解 MNN 的轻量性、通用性、高性能、易用性四大特性,硬件架构与精度支持矩阵,模型转换(MNN-Converter)、压缩、表达式计算、CV、训练五大工具链,以及基于 MNN 的本地大语言模型(MNN-LLM)与多模态应用的部署方案,帮助你掌握从模型转换到端侧部署的完整闭环。
MNN 是什么:定位与核心能力
MNN 是一个高度高效且轻量级的深度学习框架,支持深度学习模型的推理与训练,在端侧设备的推理与训练性能上处于行业领先水平。它不是一个只能运行固定模型的引擎,而是一个覆盖"转换 → 优化 → 推理 → 训练"全流程的张量计算平台。
在阿里巴巴内部,MNN 还作为 Walle 目录。
MNN 生态中另有两套基于引擎之上的高层运行方案:
- MNN-LLM:基于 MNN 引擎开发的大语言模型运行方案,目标是在手机 / PC / IoT 等本地平台上高效部署 LLM,支持千问(Qwen)、百川(Baichuan)、智谱(Zhipu)、LLAMA 等主流开源大模型;
- MNN-Diffusion:基于 MNN 引擎开发的 Stable Diffusion 文生图模型运行方案,解决扩散模型在本地设备的高效部署问题,仓库实现位于 transformers/diffusion。
以下架构图展示了 MNN 的总体分层结构(图片来源:仓库 doc/architecture.png):
四大核心特性
轻量性:面向设备的零依赖设计
MNN 主体功能(模型推理 CPU+GPU)无任何依赖,代码精简,可以方便地部署到移动设备和各种嵌入式设备中。README 给出的关键体积数据如下:
- iOS 平台:功能全开的静态库(armv7+arm64)约 12MB,链接生成可执行文件的体积增量约 2MB;可裁剪主体功能后静态库约 6.1MB,链接增量约 600KB;
- Android 平台:主体功能 armv7a(c++_shared)动态库约 800KB;
- 支持
MNN_BUILD_MINI迷你编译选项,可在此基础上进一步降低约 25% 的包体积(代价是限制为固定模型输入尺寸); - 支持 FP16 / Int8 量化,可减少模型体积 50%–70%。
从 CMakeLists.txt 源码可以看到MNN_BUILD_MINI的实现机制:开启该选项后,CMake 会强制打开MNN_SKIPBUILD_GEOMETRY(跳过 Geometry 计算图优化层,只支持固定形状模型)和MNN_REDUCE_SIZE(移除不常用算子并优化代码),后者又会进一步关闭MNN_SUPPORT_DEPRECATED_OP、MNN_SUPPORT_DEPRECATED_OPV2、MNN_SUPPORT_QUANT_EXTEND与稀疏计算,从而实现体积裁剪。
通用性:多框架、多算子、多设备
MNN 对模型的兼容能力体现在三个层面:
- 模型格式:支持
Tensorflow、Caffe、ONNX、Torchscripts,以及 CNN、RNN、GAN、Transformer 等主流网络结构; - 模型结构:支持多输入多输出、任意维度格式、动态输入(输入尺寸可变)以及带控制流的模型;
- 算子覆盖:转换器(Converter)支持 178 个 Tensorflow Op、52 个 Caffe Op、163 个 Torchscripts Op、158 个 ONNX Op(ONNX 基本完整支持);
- 运行设备:支持 iOS 8.0+、Android 4.3+ 以及具有 POSIX 接口的嵌入式设备;支持 CPU 与 GPU 混合计算,并可通过后端扩展支持 CoreML、HIAI、NNAPI、QNN 等 NPU。
高性能:汇编级优化与多后端加速
- 对 iOS / Android / PC / Server 的 CPU 架构进行适配,通过 SIMD 指令与手写汇编实现核心计算,充分发挥 ARM / x64 CPU 算力;
- 使用Metal / OpenCL / Vulkan在移动端 GPU 上推理,使用CUDA 与 TensorCore在 NVIDIA GPU 上推理;
- 卷积与转置卷积算法高效稳定,广泛运用Winograd 卷积算法加速 3x3、4x4、5x5、6x6、7x7 等对称卷积;
- 针对 ARMv8.2 新架构提供 FP16 半精度计算支持,推理速度翻倍;利用 ARMv8.2 与 VNNI 的
sdot指令可再提升约 2.5 倍。
易用性:从 C++ 到 Python 的全方位接口
- 支持使用 MNN 算子进行类似 numpy 的数值计算(MNN-Express);
- 提供轻量级图像处理模块 MNN-CV(类似 OpenCV,armv7a 架构下小于 100KB);
- 支持在 PC / 移动端构建模型并训练(MNN-Train);
- MNN Python API 让 ML 工程师无需接触 C++ 即可完成推理、训练与图像处理。
硬件架构与精度支持矩阵
README 定义了四级支持评级,作为选择后端与精度的依据:
- S:支持且工作良好,深度优化,推荐使用
- A:支持且工作良好,可以使用
- B:支持但有 bug 或未优化,不推荐使用
- C:不支持
各架构与精度组合的支持情况(摘自 README.md):
| Architecture / Precision | Normal | FP16 | BF16 | Int8 | |
|---|---|---|---|---|---|
| CPU | Native | B | C | B | B |
| x86/x64-SSE4.1 | A | C | C | A | |
| x86/x64-AVX2 | S | C | C | A | |
| x86/x64-AVX512 | S | C | C | S | |
| ARMv7a | S | S (ARMv8.2) | S | S | |
| ARMv8 | S | S (ARMv8.2) | S (ARMv8.6) | S | |
| GPU | OpenCL | A | S | C | S |
| Vulkan | A | A | C | A | |
| Metal | A | S | C | S | |
| CUDA | A | S | C | A | |
| NPU | CoreML | A | C | C | C |
| HIAI | A | C | C | C | |
| NNAPI | B | B | C | B | |
| QNN | C | B | C | C |
从表格可以提炼出几条实用的选型结论:
- 移动端 CPU 推理首选 ARMv7a / ARMv8,FP16 与 Int8 均已深度优化;BF16 需要 ARMv8.6;
- x86 平台推荐 AVX2 / AVX512,两者在 Normal 与 Int8 下均为 S 级;
- GPU 后端中 OpenCL 与 Metal 的 FP16、Int8 达到 S 级,是端侧 GPU 推理的主力;Vulkan 目前 FP16 为 A 级;
- NPU 后端(CoreML / HIAI / NNAPI / QNN)整体成熟度低于 CPU/GPU,使用时需结合具体硬件验证精度与性能。
对照 source/backend 目录,可以看到上述评级对应的实际后端实现:cpu、arm82、opencl、vulkan、metal、cuda、opengl、coreml、hiai、nnapi、qnn、musa、tensorrt、hexagon、rknn、neuropilot。这些后端通过统一的 Backend.hpp 抽象接入 MNN 核心调度层(Schedule.cpp),这解释了为何 MNN 能够在不同硬件上实现"一套模型、多端运行"。
构建:从源码编译 MNN
MNN 使用 CMake 构建,核心编译选项定义在 CMakeLists.txt。与 README 中四大特性直接相关的选项包括:
| CMake 选项 | 默认值 | 说明 |
|---|---|---|
MNN_BUILD_SHARED_LIBS | ON | 构建动态库或静态库 |
MNN_BUILD_MINI | OFF | 迷你构建,强制打开MNN_SKIPBUILD_GEOMETRY与MNN_REDUCE_SIZE,约减 25% 体积 |
MNN_BUILD_TRAIN | OFF | 构建 MNN 训练框架 |
MNN_BUILD_CONVERTER | OFF | 构建模型转换工具 MNN-Converter |
MNN_OPENCL | OFF | 启用 OpenCL GPU 后端 |
MNN_VULKAN | OFF | 启用 Vulkan GPU 后端 |
MNN_METAL | OFF | 启用 Metal GPU 后端(Apple 平台) |
MNN_CUDA | OFF | 启用 CUDA GPU 后端 |
MNN_ARM82 | ON | 启用 ARMv8.2 FP16 计算 |
MNN_AVX512 | OFF | 启用 AVX512 指令集 |
MNN_BUILD_LLM | OFF | 构建 LLM 库(基于 MNN) |
MNN_LOW_MEMORY | OFF | 支持权重量化模型的低内存推理 |
MNN_SUPPORT_TRANSFORMER_FUSE | OFF | 使能 Transformer 算子融合(LLM 推理必需) |
MNN_HEXAGON | OFF | 启用高通 Hexagon DSP 后端 |
MNN_SUPPORT_BF16 | OFF | 启用 BF16 算子 |
MNN_BUILD_OPENCV | OFF | 构建 MNN 的 OpenCV API |
MNN_BUILD_AUDIO | OFF | 构建 MNN 音频 API |
需要特别注意的是选项间的级联关系(CMakeLists.txt):
- 开启
MNN_BUILD_LLM会自动强制打开MNN_LOW_MEMORY与MNN_SUPPORT_TRANSFORMER_FUSE;若同时开启MNN_BUILD_LLM_OMNI(多模态),还会自动打开MNN_BUILD_OPENCV、MNN_BUILD_AUDIO与MNN_IMGCODECS; - 开启
MNN_BUILD_DIFFUSION同样会强制打开低内存、Transformer 融合与 OpenCV 支持。
因此,当 README 的 LLM 编译示例显式给出-DMNN_LOW_MEMORY=true -DMNN_BUILD_LLM=true -DMNN_SUPPORT_TRANSFORMER_FUSE=true时,其语义与源码中的强制级联是一致的,显式写出有助于阅读者理解。
仓库还提供了统一构建脚本 build_lib.sh,支持--android、--ios、--ios-simulator、--harmony、--python等构建目标,例如:
# 构建所有平台 ./build_lib.sh --android --ios --harmony --python --ndk ~/Library/Android/sdk/ndk/29.0.13599879 # 仅构建 Android ./build_lib.sh --android --ndk ~/Library/Android/sdk/ndk/29.0.13599879 # 构建 Python 版本(带 LLM 与 OpenCL 支持) ./build_lib.sh --python --python-deps llm,opencl针对 iOS 平台,还可使用 package_scripts/ios/buildiOS.sh 等脚本,并配合 MNN.podspec 以 CocoaPods 方式集成。各平台详细编译说明见 docs/compile/cmake.md 与 docs/compile/engine.md。
五大工具:围绕张量计算引擎的工具链
基于 MNN 张量计算引擎,仓库提供了推理、训练与通用计算的系列工具:
MNN-Converter:模型转换与图优化
将 Tensorflow(Lite)、Caffe、ONNX、Torchscripts 等模型转换为 MNN 模型,并执行图优化以减少计算量。转换器由 Frontends(负责不同训练框架的前端解析)与 Graph Optimize(通过算子融合、算子替代、布局调整等方式优化计算图,一般离线运行)两部分构成。
转换器主入口为 tools/converter/source/MNNConverter.cpp,命令行参数解析实现在 tools/converter/source/common/cli.cpp。核心参数包括:
| 参数 | 说明 |
|---|---|
-f, --framework | 模型类型,可选TF,CAFFE,ONNX,TFLITE,MNN,JSON(编译 Torch 支持后另有TORCH) |
--modelFile | 输入模型文件,如*.pb、*.caffemodel、*.onnx |
--MNNModel | 输出的 MNN 模型文件(*.mnn) |
--keepInputFormat | 是否保持输入维度格式,默认 true |
--optimizeLevel | 图优化级别:0 不优化(仅 MNN 源),1 常规优化,2 更激进但个别场景可能出错,默认 1 |
--optimizePrefer | 优化偏好:0 常规、1 最小体积、2 最快速度 |
--weightQuantBits | 将 Conv/MatMul/LSTM 浮点权重量化为 int8,2–8 bit,默认 0(不量化) |
--weightQuantBlock | 分块权重量化的块大小,默认 -1 即通道级量化 |
--weightQuantAsymmetric | 使用非对称量化提升精度(旧版 MNN 不兼容),默认 false |
--fp16 | 将 Conv 权重/偏置保存为 half 浮点 |
--transformerFuse | 融合注意力等关键 Transformer 算子,默认 false(LLM 模型必需) |
--allowCustomOp | 转换时允许自定义算子,默认 false |
--saveExternalData | 将权重保存到外部 bin 文件 |
--forTraining | 是否保留 BN、Dropout 等训练算子,默认 false |
--benchmarkModel | 不保存大尺寸权重数据,仅用于测速 |
--OP | 打印框架支持的算子列表 |
典型用法示例(将 ONNX 模型转为 4bit 量化的 MNN 模型,同时开启 Transformer 融合):
./MNNConvert --modelFile model.onnx --MNNModel model.mnn \ --keepInputFormat --weightQuantBits=4 --weightQuantBlock=128 \ -f ONNX --transformerFuse=1 --allowCustomOp --saveExternalDataMNN-Compress:模型压缩
在允许一定精度误差的前提下对 MNN 模型进行压缩,减少模型体积并提升运行性能。相关工具脚本位于 tools/mnncompress(Python 实现),配套文档见 docs/tools/mnncompress.md。
MNN-Express:表达式计算
支持带控制流的模型运行,并支持调用 MNN 算子进行自定义计算,覆盖 numpy 常用功能。核心实现位于 express 目录(Expr.cpp、Executor.cpp 等),上层接口见 include/MNN/expr 下的Expr.hpp、Module.hpp、Executor.hpp等头文件。
MNN-CV:轻量图像处理库
类似 OpenCV 但核心计算基于 MNN 实现,支持图像仿射变换与归一化等常用操作,体积远小于 OpenCV。实现位于 tools/cv 与 source/cv/ImageProcess.cpp,头文件为 include/MNN/ImageProcess.hpp。
MNN-Train:端侧训练
支持各平台上的模型训练,尤其是移动端训练。训练框架位于 tools/train,Python 侧可通过 pymnn/src 中的nn、optim、loss、data等模块使用,训练教程见 docs/train。
此外,MNN 还提供 Codegen 能力(codegen 目录),可针对 CPU / CUDA / Metal / OpenCL 生成算子源码,用于深度定制部署。
MNN-LLM:在本地设备部署大语言模型
README 明确指出 MNN-LLM 是当前生态的重点方向。完整使用指南位于 transformers/README.md,其功能分为模型导出与模型推理两部分。
模型导出:llmexport
llmexport是 LLM 模型导出工具,可将 LLM 导出为 ONNX 与 MNN 两种格式。脚本位于 transformers/llm/export/llmexport.py。
基本使用流程(以 Qwen2-0.5B-Instruct 为例):
# 1. 克隆待导出的 LLM 项目到本地 git clone https://www.modelscope.cn/qwen/Qwen2-0.5B-Instruct.git # 2. 导出模型、tokenizer、embedding 及对应的 MNN 模型 cd ./transformers/llm/export python llmexport.py \ --path /path/to/Qwen2-0.5B-Instruct \ --export mnn导出的产物及其用途如下(目录结构见 transformers/README.md):
| 文件 | 说明 |
|---|---|
config.json | 运行时配置文件,可手动修改 |
embeddings_bf16.bin | Embedding 权重二进制文件,推理时使用 |
llm.mnn | MNN 模型文件,推理时使用 |
llm.mnn.json | MNN 模型对应的 JSON 文件,用于应用 LoRA 或 GPTQ 量化权重 |
llm.mnn.weight | MNN 模型权重,推理时使用 |
llm.onnx/llm.onnx.data | 不带权重的 ONNX 模型文件(onnx/子目录),推理时不使用 |
llm_config.json | 模型配置(hidden_size、层数、KV 形状等),推理时使用 |
tokenizer.txt | 分词器文件 |
llmexport.py的全部参数(摘自 transformers/README.md):
usage: llmexport.py [-h] --path PATH [--type TYPE] [--lora_path LORA_PATH] [--dst_path DST_PATH] [--test TEST] [--export EXPORT] [--quant_bit QUANT_BIT] [--quant_block QUANT_BLOCK] [--lm_quant_bit LM_QUANT_BIT] [--mnnconvert MNNCONVERT]--path PATH:必填。可为本地的模型目录(如../chatglm-6b);--type TYPE:预训练 LLM 模型类型(可选);--lora_path LORA_PATH:LoRA 权重目录,默认None表示不应用 LoRA;--dst_path DST_PATH:导出目录,默认./model;--test TEST:以查询串TEST测试模型推理;--export EXPORT:导出为 onnx / mnn 模型;--quant_bit QUANT_BIT:MNN 量化位宽,4 或 8,默认 4;--quant_block QUANT_BLOCK:MNN 量化块大小,默认 0 表示通道级(channel-wise);--lm_quant_bit LM_QUANT_BIT:lm_head 层权重量化位宽,默认与quant_bit一致;--mnnconvert MNNCONVERT:本地 MNNConvert 工具路径,若无效则使用 pymnn。
导出方式的选择:
- 直接转 MNN(
--export mnn):需满足"安装了 pymnn"或"通过--mnnconvert指定 MNNConvert 路径"二者之一;若都不满足,脚本会在../../../build/目录下搜索 MNNConvert。该方式目前支持 4bit 与 8bit 量化导出; - 先转 ONNX 再转 MNN:若直接转换遇到问题,或需要 5bit / 6bit 等其他位宽,可先用
--export onnx导出 ONNX,再手动调用 MNNConvert:
./MNNConvert --modelFile ../transformers/llm/export/model/onnx/llm.onnx \ --MNNModel llm.mnn --keepInputFormat --weightQuantBits=4 --weightQuantBlock=128 \ -f ONNX --transformerFuse=1 --allowCustomOp --saveExternalData模型推理:编译 LLM 运行时
LLM 推理需要额外的编译宏(详细说明见 transformers/README.md)。基础宏:
-DMNN_LOW_MEMORY=true -DMNN_BUILD_LLM=true -DMNN_SUPPORT_TRANSFORMER_FUSE=true多模态扩展宏:
# 视觉(VL)能力 -DLLM_SUPPORT_VISION=true -DMNN_BUILD_OPENCV=true -DMNN_IMGCODECS=true # 音频能力 -DLLM_SUPPORT_AUDIO=true -DMNN_BUILD_AUDIO=true各平台编译示例:
macOS / Linux:
mkdir build && cd build cmake ../ -DMNN_LOW_MEMORY=true -DMNN_BUILD_LLM=true -DMNN_SUPPORT_TRANSFORMER_FUSE=true make -j16x86 架构额外增加MNN_AVX512:
cmake ../ -DMNN_LOW_MEMORY=true -DMNN_BUILD_LLM=true -DMNN_SUPPORT_TRANSFORMER_FUSE=true -DMNN_AVX512=trueAndroid(增加MNN_ARM82与MNN_OPENCL):
cd project/android mkdir build_64 ../build_64.sh "-DMNN_LOW_MEMORY=true -DMNN_BUILD_LLM=true -DMNN_SUPPORT_TRANSFORMER_FUSE=true -DMNN_ARM82=true -DMNN_OPENCL=true -DMNN_USE_LOGCAT=true"iOS:
sh package_scripts/ios/buildiOS.sh "-DMNN_ARM82=true -DMNN_LOW_MEMORY=true -DMNN_SUPPORT_TRANSFORMER_FUSE=true -DMNN_BUILD_LLM=true"Web(WASM):使用 emcmake 编译产生libMNN.a、libMNN_Express.a、libllm.a三个库,并通过emcc编译llm_demo.cpp生成llm_demo.js,随后可用node llm_demo.js config.json prompt.txt测试。构建细节参考 docs/compile/engine.md 的 Web 章节。
推理配置:config.json 全参数详解
将所有导出文件放入同一目录,并添加config.json描述模型名与推理参数。配置项分为四组(完整定义见 transformers/README.md):
模型文件信息(均为base_dir下的相对路径,base_dir默认取config.json所在目录):
| 配置项 | 默认值 | 说明 |
|---|---|---|
llm_config | config.json | llm_config.json路径 |
llm_model | llm.mnn | MNN 模型文件路径 |
llm_weight | llm.mnn.weight | 模型权重路径 |
block_model | block_{idx}.mnn | 分段模型的 block 文件 |
lm_model | lm.mnn | 分段模型的 lm 文件 |
embedding_model | embedding.mnn | Embedding 使用模型时的路径 |
embedding_file | embeddings_bf16.bin | Embedding 使用二进制文件时的路径 |
tokenizer_file | tokenizer.txt | 分词器路径 |
visual_model | visual.mnn | VL 模型的视觉模型路径 |
推理配置:
max_new_tokens:最大生成 token 数,默认512;reuse_kv:多轮对话是否复用 KV Cache,默认false;quant_qkv:已废弃,改用attention_mode;attention_mode:CPU 注意力算子中 Q/K/V 是否量化,可选 0、1、2、8、9、10,默认8:0:运行时不用 Flash Attention,Q/K/V 均不量化;1:不用 Flash Attention,Q/K 采用 8bit 非对称量化,V 不量化;2:不用 Flash Attention,Q/K/V 全部 8bit 非对称量化;8:使用 Flash Attention,Q/K/V 均不量化;9:使用 Flash Attention,Q/K 8bit 非对称量化,V 不量化;10:使用 Flash Attention,Q/K/V 全部 8bit 非对称量化;
use_mmap:内存不足时是否用mmap将权重写入磁盘以避免溢出,默认false,移动端建议设为true;kvcache_mmap:内存不足时是否对 KV Cache 使用mmap落盘,默认false;tmp_path:启用 mmap 相关特性时的磁盘缓存目录(iOS 上可设为NSTemporaryDirectory())。
硬件配置:
backend_type:推理后端,默认"cpu";Android GPU 支持"opencl",macOS/iOS GPU 支持"metal";thread_num:CPU 推理线程数,默认4;OpenCL 推理建议使用68;precision:推理精度策略,默认"low",优先使用 fp16;memory:内存策略,默认"low",启用运行时量化。
Sampler 采样配置:
sampler_type:采样器类型,支持greedy、temperature、topK、topP、minP、tfs、typical、penalty8 种基础类型及mixed(按序依次执行mixed_samplers中的采样器)。默认greedy;追求输出多样性建议mixed/temperature,避免重复建议penalty;mixed_samplers:sampler_type为mixed时生效,默认["topK", "tfs", "typical", "topP", "min_p", "temperature"];temperature:temperature / topP / minP / tfsZ / typical 策略的温度值,默认1.0;topK:topK 采样保留的 token 数,默认40;topP:topP 采样值,默认0.9;minP:minP 采样值,默认0.1;tfsZ:tfs 采样的 Z 值,默认1.0;typical:typical 采样的 p 值,默认1.0;penalty:重复 token 惩罚因子,默认0.0(不惩罚);n_gram:受惩罚的最大 n-gram,重复 token >= n_gram 时强制不生成,默认8;ngram_factor:n>1 时对重复 n-gram 的额外惩罚,默认1.0;penalty_sampler:惩罚后的采样策略,可为"greedy"或"temperature",默认"greedy"。
llm_config.json示例(摘自 transformers/README.md):
{ "hidden_size": 1536, "layer_nums": 28, "attention_mask": "float", "key_value_shape": [ 2, 1, 0, 2, 128 ], "prompt_template": "<|im_start|>user\n%s<|im_end|>\n<|im_start|>assistant\n", "is_visual": false, "is_single": true }推理运行:llm_demo 用法
transformers/llm/engine/demo/llm_demo.cpp 是标准推理示例,支持交互式对话与按行回复两种模式:
# 使用 config.json ./llm_demo model_dir/config.json # 交互式对话 ./llm_demo model_dir/config.json prompt.txt # 逐行回复 prompt 文件中的每一行 # 不使用 config.json,采用默认配置 ./llm_demo model_dir/llm.mnn # 交互式对话 ./llm_demo model_dir/llm.mnn prompt.txt # 逐行回复多模态提示词写法(在 prompt 中嵌入标签):
- 图像输入:
<img>https://.../demo.jpeg</img>Describe the content of the image.,可用<img><hw>280, 420</hw>...</img>指定输入尺寸; - 音频输入:
<audio>https://.../translate_to_chinese.wav</audio>Describe the content of the audio.
LoRA 与 GPTQ:参数高效微调与量化权重的接入
GPTQ 权重:导出时通过--gptq_path指定 GPTQ 量化模型目录:
python llmexport.py --path /path/to/Qwen2.5-0.5B-Instruct \ --gptq_path /path/to/Qwen2.5-0.5B-Instruct-GPTQ-Int4 --export mnnLoRA 权重支持两种接入方式(详见 transformers/README.md):
- 合并 LoRA:导出时指定
--lora_path PATH,权重直接合并进模型,使用方式与原模型完全相同,简单快速但不支持运行时切换; - 分离 LoRA:导出时同时指定
--lora_path与--lora_split,额外生成独立的lora.mnn文件,支持运行时切换,适合多 LoRA 场景。通过lora.json配置直接加载:
{ "llm_model": "lora.mnn", "llm_weight": "base.mnn.weight" }运行时切换示例(同一对象串行使用多个 LoRA,或创建多个对象并发使用):
// 创建并加载基础模型 std::unique_ptr<Llm> llm(Llm::createLLM(config_path)); llm->load(); // 在基础模型之上叠加 lora_1,其索引为 lora_1_idx size_t lora_1_idx = llm->apply_lora("lora_1.mnn"); llm->response("Hello lora1"); size_t lora_2_idx = llm->apply_lora("lora_2.mnn"); llm->response("Hello lora2"); // 按索引选择当前 LoRA llm->select_module(lora_1_idx); llm->response("Hello lora1"); // 释放已加载的 LoRA llm->release_module(lora_1_idx); llm->release_module(lora_2_idx); // 切回基础模型 llm->select_module(0); llm->response("Hello base");多模态与前沿后端:从 LLM Chat 到 Hexagon DSP
README 的 News 板块展示了 MNN 在 LLM 与多模态应用上的持续演进(完整历史见 README.md):
- MNN Chat App(apps/Android/MnnLlmChat):完整的端侧多模态 LLM 应用,支持文本生成、图像理解、语音理解与文生图;Android 端支持 Qwen3、Qwen2.5 Omni(3B/7B)、DeepSeek R1 1.5B 等模型及深色模式;
- MNN TaoAvatar(apps/Android/Mnn3dAvatar):离线 3D 数字人对话应用,LLM、ASR、TTS、A2BS、NNR 模型全部本地运行;
- iOS 多模态 LLM App(apps/iOS/MNNLLMChat);
- MNN-Sana-Edit-V2(apps/sana):基于 Sana 的卡通风格照片编辑,输出固定 512x512,推荐 10 步采样;
- Qwen3-VL / Qwen3.5 系列支持;
- MNN 3.6.1 新增 Hexagon 后端:可在高通 Hexagon DSP 上加速模型推理,实现细节见 source/backend/hexagon/README.md。
在端侧启用 Hexagon DSP 加速
以最新引入的 Hexagon 后端为例(source/backend/hexagon/README.md),部署流程分为三步:
1. 编译自定义 HTP 算子库(需先安装高通 Hexagon SDK 并设置HEXAGON_SDK_ROOT环境变量):
cd source/backend/hexagon/htp-ops-lib # 传入目标 DSP 架构版本(如 v73 / v75 / v79) bash build.sh v79该脚本在htp-ops-lib/outputs/下生成两个关键库:libMNN_htpops.so(运行于 CPU 的 Android AArch64 stub 库)与libMNN_htpops_skel.so(运行于 Hexagon NPU/DSP 的 skeleton 库)。
2. 编译开启 Hexagon 后端的 MNN(无需 Hexagon SDK):
mkdir build && cd build cmake .. -DMNN_HEXAGON=ON # 其余编译选项按需追加(如 Android 交叉编译) make -j83. 设备端部署:将可执行文件与两个库推送到设备,配置环境变量:
export ADSP_LIBRARY_PATH="/data/local/tmp/hexagon_libs;/vendor/lib/rfsa/adsp;/system/lib/rfsa/adsp" export LD_LIBRARY_PATH="/data/local/tmp/hexagon_libs:$LD_LIBRARY_PATH"LD_LIBRARY_PATH负责让 CPU 侧找到libMNN_htpops.so,ADSP_LIBRARY_PATH负责让 DSP 加载libMNN_htpops_skel.so。该后端的 CMake 入口同样定义在根 CMakeLists.txt 与后端目录的构建脚本中。
文档、社区与论文引用
- 官方文档:托管于 Read the Docs(
docs目录下的 Sphinx 工程),也可按 docs/README 在本地编译 HTML:pip install -r requirements.txt && make html,产物位于_build/html/; - MNN 工作台:MNN 官网提供 MNN Workbench,涵盖开箱即用模型、可视化训练工具与一键部署到多端设备的能力;
- 社区交流:钉钉讨论群(群 4 可加入:160170007549;群 1/2/3 已满),讨论以中文为主,也欢迎英文用户;
- License:Apache 2.0(见 LICENSE.txt);
- 论文引用:若 MNN 或 Walle 的设计对你的研究或生产有所助益,可按 README.md 中的 BibTeX 引用 OSDI'22 论文(Walle);MNN 作为移动端推理引擎的早期版本论文发表于 MLSys 2020(
MNN: A Universal and Efficient Inference Engine),同样提供了 BibTeX 条目。
快速上手路径建议
针对不同的读者角色,建议的探索路径如下:
- 只想快速跑通推理:阅读 docs/start/quickstart_cpp.md(C++)或 docs/start/quickstart_python.md(Python),配合 demo/exec 中的示例程序;
- 需要将自有模型接入:先读 docs/tools/convert.md 掌握 MNN-Converter 参数,再按上文"LLM 导出"流程处理大模型;
- 需要端侧部署 LLM / 多模态模型:直接进入 transformers/README.md 与 apps/Android/MnnLlmChat/README.md,参考其中的编译宏与
config.json配置; - 需要性能调优或新增算子:阅读 docs/perf 下的低比特 GEMM、Gemv 带宽等专项文档,以及 skills 目录中针对 OpenCL / Vulkan / Metal / Hexagon 等后端的工程实践指南。
通过以上内容,你可以从零开始完成"MNN 编译 → 模型转换 → 端侧推理 → LLM 本地部署"的完整技术闭环,并依据架构-精度支持矩阵为你的目标设备选择最优的后端与量化组合。
【免费下载链接】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),仅供参考