MNN 深度学习推理引擎全解析:从端侧轻量部署到本地 LLM 推理的完整技术指南
2026/9/14 8:56:30 网站建设 项目流程

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_OPMNN_SUPPORT_DEPRECATED_OPV2MNN_SUPPORT_QUANT_EXTEND与稀疏计算,从而实现体积裁剪。

通用性:多框架、多算子、多设备

MNN 对模型的兼容能力体现在三个层面:

  • 模型格式:支持TensorflowCaffeONNXTorchscripts,以及 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 / PrecisionNormalFP16BF16Int8
CPUNativeBCBB
x86/x64-SSE4.1ACCA
x86/x64-AVX2SCCA
x86/x64-AVX512SCCS
ARMv7aSS (ARMv8.2)SS
ARMv8SS (ARMv8.2)S (ARMv8.6)S
GPUOpenCLASCS
VulkanAACA
MetalASCS
CUDAASCA
NPUCoreMLACCC
HIAIACCC
NNAPIBBCB
QNNCBCC

从表格可以提炼出几条实用的选型结论:

  • 移动端 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 目录,可以看到上述评级对应的实际后端实现:cpuarm82openclvulkanmetalcudaopenglcoremlhiainnapiqnnmusatensorrthexagonrknnneuropilot。这些后端通过统一的 Backend.hpp 抽象接入 MNN 核心调度层(Schedule.cpp),这解释了为何 MNN 能够在不同硬件上实现"一套模型、多端运行"。

构建:从源码编译 MNN

MNN 使用 CMake 构建,核心编译选项定义在 CMakeLists.txt。与 README 中四大特性直接相关的选项包括:

CMake 选项默认值说明
MNN_BUILD_SHARED_LIBSON构建动态库或静态库
MNN_BUILD_MINIOFF迷你构建,强制打开MNN_SKIPBUILD_GEOMETRYMNN_REDUCE_SIZE,约减 25% 体积
MNN_BUILD_TRAINOFF构建 MNN 训练框架
MNN_BUILD_CONVERTEROFF构建模型转换工具 MNN-Converter
MNN_OPENCLOFF启用 OpenCL GPU 后端
MNN_VULKANOFF启用 Vulkan GPU 后端
MNN_METALOFF启用 Metal GPU 后端(Apple 平台)
MNN_CUDAOFF启用 CUDA GPU 后端
MNN_ARM82ON启用 ARMv8.2 FP16 计算
MNN_AVX512OFF启用 AVX512 指令集
MNN_BUILD_LLMOFF构建 LLM 库(基于 MNN)
MNN_LOW_MEMORYOFF支持权重量化模型的低内存推理
MNN_SUPPORT_TRANSFORMER_FUSEOFF使能 Transformer 算子融合(LLM 推理必需)
MNN_HEXAGONOFF启用高通 Hexagon DSP 后端
MNN_SUPPORT_BF16OFF启用 BF16 算子
MNN_BUILD_OPENCVOFF构建 MNN 的 OpenCV API
MNN_BUILD_AUDIOOFF构建 MNN 音频 API

需要特别注意的是选项间的级联关系(CMakeLists.txt):

  • 开启MNN_BUILD_LLM会自动强制打开MNN_LOW_MEMORYMNN_SUPPORT_TRANSFORMER_FUSE;若同时开启MNN_BUILD_LLM_OMNI(多模态),还会自动打开MNN_BUILD_OPENCVMNN_BUILD_AUDIOMNN_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 --saveExternalData

MNN-Compress:模型压缩

在允许一定精度误差的前提下对 MNN 模型进行压缩,减少模型体积并提升运行性能。相关工具脚本位于 tools/mnncompress(Python 实现),配套文档见 docs/tools/mnncompress.md。

MNN-Express:表达式计算

支持带控制流的模型运行,并支持调用 MNN 算子进行自定义计算,覆盖 numpy 常用功能。核心实现位于 express 目录(Expr.cpp、Executor.cpp 等),上层接口见 include/MNN/expr 下的Expr.hppModule.hppExecutor.hpp等头文件。

MNN-CV:轻量图像处理库

类似 OpenCV 但核心计算基于 MNN 实现,支持图像仿射变换与归一化等常用操作,体积远小于 OpenCV。实现位于 tools/cv 与 source/cv/ImageProcess.cpp,头文件为 include/MNN/ImageProcess.hpp。

MNN-Train:端侧训练

支持各平台上的模型训练,尤其是移动端训练。训练框架位于 tools/train,Python 侧可通过 pymnn/src 中的nnoptimlossdata等模块使用,训练教程见 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.binEmbedding 权重二进制文件,推理时使用
llm.mnnMNN 模型文件,推理时使用
llm.mnn.jsonMNN 模型对应的 JSON 文件,用于应用 LoRA 或 GPTQ 量化权重
llm.mnn.weightMNN 模型权重,推理时使用
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 -j16

x86 架构额外增加MNN_AVX512

cmake ../ -DMNN_LOW_MEMORY=true -DMNN_BUILD_LLM=true -DMNN_SUPPORT_TRANSFORMER_FUSE=true -DMNN_AVX512=true

Android(增加MNN_ARM82MNN_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.alibMNN_Express.alibllm.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_configconfig.jsonllm_config.json路径
llm_modelllm.mnnMNN 模型文件路径
llm_weightllm.mnn.weight模型权重路径
block_modelblock_{idx}.mnn分段模型的 block 文件
lm_modellm.mnn分段模型的 lm 文件
embedding_modelembedding.mnnEmbedding 使用模型时的路径
embedding_fileembeddings_bf16.binEmbedding 使用二进制文件时的路径
tokenizer_filetokenizer.txt分词器路径
visual_modelvisual.mnnVL 模型的视觉模型路径

推理配置

  • 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:采样器类型,支持greedytemperaturetopKtopPminPtfstypicalpenalty8 种基础类型及mixed(按序依次执行mixed_samplers中的采样器)。默认greedy;追求输出多样性建议mixed/temperature,避免重复建议penalty
  • mixed_samplerssampler_typemixed时生效,默认["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 mnn

LoRA 权重支持两种接入方式(详见 transformers/README.md):

  1. 合并 LoRA:导出时指定--lora_path PATH,权重直接合并进模型,使用方式与原模型完全相同,简单快速但不支持运行时切换;
  2. 分离 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 -j8

3. 设备端部署:将可执行文件与两个库推送到设备,配置环境变量:

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.soADSP_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 条目。

快速上手路径建议

针对不同的读者角色,建议的探索路径如下:

  1. 只想快速跑通推理:阅读 docs/start/quickstart_cpp.md(C++)或 docs/start/quickstart_python.md(Python),配合 demo/exec 中的示例程序;
  2. 需要将自有模型接入:先读 docs/tools/convert.md 掌握 MNN-Converter 参数,再按上文"LLM 导出"流程处理大模型;
  3. 需要端侧部署 LLM / 多模态模型:直接进入 transformers/README.md 与 apps/Android/MnnLlmChat/README.md,参考其中的编译宏与config.json配置;
  4. 需要性能调优或新增算子:阅读 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询