Releases: alibaba/MNN
3.2.0 MoE 架构和Omni支持 / 投机解码实现 / 新增模板引擎 / KlediAI 功能更新 / 启动性能优化
3.2.0 版本更新说明
感谢社区和开发团队的努力,MNN 3.2 版本现已正式发布!本次版本在性能优化、功能扩展以及问题修复方面进行了多项改进,尤其针对大语言模型(LLM)的支持和推理加速进行了重点优化。以下是主要更新内容:
🚀 新特性支持
- LLM 相关
○ 支持 Qwen Omni 模型运行。
○ 支持 Qwen3 MoE 模型。
○ 支持 Gemma3 (4B/1B) 和 InternVL2.5-1B / deepseek vl 模型导出及 GGUF 转换。
○ 支持 FastVLM 和 SmolVLM 模型。
○ LLM Export 工具新增其他低比特量化(2, 3, 5, 6, 7 bit)支持。
○ 新增 jinja 模板引擎,方便 LLM 对话模板管理。
○ LLM Export 工具中默认量化的Block修改为64 (经测试体积和Q4_1一致,但精度更高)
○ 支持 GGUF 模型格式转换为 MNN。 - 集成 KlediAI 相关功能更新
○ 新增 Q4 非对称量化的 Kernel 实现
○ 新增 FP16 / FP32 的 SME Kernel 实现 - LLM 推理加速
○ 支持基于用户输入的投机解码 (lookahead算法),在典型场景如代码补全情况下,可提升2-3倍解码效率。 - 模型转换增强
○ 支持 ONNX 元数据(metadata)转换及读取,并保持输入顺序一致。 - 硬件加速支持
○ 新增高通 QNN 后端,目前仅支持 CV 模型运行。 - 库大小裁剪功能
○ 新增 MNN_REDUCE_SIZE宏,开启后可以关闭部分优化分支,减少库大小
⚙️ 性能优化及精度优化 - 启动优化
○ CPU 后端支持 mmap 生成缓存文件后删除原始 weight 文件,以便节省存储空间。
○ CPU Int8/Int4 模式下优化权重重排和加载时间,LLM加载耗时降低到原来的1/3,低于填充 200 token 的耗时。
○ OpenCL 后端通过内存免拷贝进一步优化加载时间,减少至原来的50%,同样低于填充 200 token 的耗时。
○ Metal 后端通过内存免拷贝及Kernel改写,降低Int8/Int4权重重排和加载时间,LLM模型加载耗时降低到原先的1/7 - CPU算子优化
○ 调整了 Weight Block-wise 量化场景的 Weight 内存布局,并对相关Kernel进行了重写,以减少多线程运行时 GEMV 的 Cache Miss,对应地在 PC CPU 上,LLM 多线程解码性能提升1倍以上。
○ 新增 input block-wise 量化支持,并且原有的 Weight Block-wise 量化新增对非 1x1 卷积的支持,可较大地提升相关CV模型量化后的精度。比如 Diffusion 场景,CPU生图的效果提升。 - GPU算子优化
○ Metal 后端针对 CV/Diffusion 模型使用 simdgroup 指令进行加速,提升1倍左右效率。
○ Metal 后端新增 ScatterND 算子实现(目前只支持无 overlap 的情况)
○ OpenCL 后端针对 GEMV 扩充场景([e,l,h]矩阵乘参数中,l, h 很大,但 e>1 且 e <16)进行了优化,提升性能1倍左右,以配合投机解码提速需求。
🐞 问题修复
包括但不限于:
- 修复 Windows 平台上部分情况下模型转换工具 crash 的问题。
- 修复 CUDA 后端运行 BatchMatMul 出错的问题。
- 修复 OpenCL 运行 LLM 时,多模态模型使用 CPU 导致出错的问题。
- 修复 Qwen2/Qwen2.5 的 M-RoPE 支持问题。
- 修复 Qwen2-7B-Audio 长语音处理出错的问题。
- 修复 Space2Depth 算子中断言 blockSize > 1 不正确的问题。
- 修复 Armv7a 架构上 LLM 运行出错的问题。
- 修复 ONNX 部分量化模型转换失败的问题。
- 修正 HIAI 部分算子实现错误的问题。
3.2.0 Release Note
Thanks to the community and development team's efforts, MNN 3.2 has been officially released! This version introduces significant improvements in performance optimization, feature expansion, and bug fixes, with particular emphasis on enhanced support for Large Language Models (LLM) and inference acceleration. Below are the key updates:
🚀 New Feature Support
- LLM-related Enhancements
a. Added support for running Qwen Omni models
b. Added support for Qwen3 MoE models
c. Add support for Gemma3 (4B/1B) and InternVL2.5-1B/deepseek vl models
d. Added support for FastVLM and SmolVLM models
e. LLM Export tool now supports additional low-bit quantization (2, 3, 5, 6, 7 bits)
f. Implemented jinja2 templating engine for LLM conversation template management
g. Default quantization block size in LLM Export tool changed to 64 (tested to maintain same size as Q4_1 with higher accuracy)
h. Added support for converting GGUF model format to MNN - KlediAI Integration Updates
a. Added asymmetric Q4 quantization kernel implementation
b. Added FP16/FP32 SME kernel implementation - LLM Inference Acceleration
a. Added speculative decoding (lookahead algorithm) based on user input, improving decoding efficiency by 2-3x in typical scenarios like code completion - Model Conversion Enhancements
a. Added ONNX metadata conversion and reading support while preserving input order consistency - Hardware Acceleration Support
a. Added Qualcomm QNN backend (currently supports CV models only) - Library Size Reduction Feature
a. Added the MNN_REDUCE_SIZE macro. When enabled, it can disable certain optimization branches to reduce the library size.
⚙️ Performance & Accuracy Optimization
- Startup Optimization
a. CPU backend supports mmap-based cache file generation with automatic deletion of original weight files to save storage space
b. Optimized weight rearrangement and loading time for CPU Int8/Int4 modes, reducing LLM loading time to 1/3 of original (faster than filling 200 tokens)
c. OpenCL backend further optimizes loading time via zero-copy memory, reducing to 50% of original (faster than filling 200 tokens)
d. Metal backend reduces Int8/Int4 weight rearrangement/loading time through zero-copy memory and kernel rewrites, achieving 1/7 of original LLM loading time - CPU Operator Optimization
a. Redesigned weight memory layout for block-wise quantization scenarios with rewritten kernels to reduce GEMV cache misses during multi-threading, achieving over 1x improvement in LLM multi-threaded decoding performance on PC CPUs
b. Added input block-wise quantization support; existing weight block-wise quantization now supports non-1x1 convolutions, significantly improving quantization accuracy for CV models (e.g., enhanced image generation quality in Diffusion scenarios) - GPU Operator Optimization
a. Metal backend accelerated CV/Diffusion models using simdgroup instructions, improving efficiency by ~1x
b. Added ScatterND operator implementation in Metal backend (supports non-overlapping cases only)
c. OpenCL backend optimized GEMV expansion scenarios ([e,l,h] matrix multiplication parameters with large l/h values but small e [1<e<16]), improving performance by ~1x to support speculative decoding acceleration
🐞 Bug FixesIncluding but not limited to: - Fixed model conversion tool crashes on Windows under certain scenarios
- Fixed BatchMatMul execution errors in CUDA backend
- Fixed CPU-related errors in multimodal models during LLM execution on OpenCL backend
- Fixed M-RoPE support issues for Qwen2/Qwen2.5
- Fixed long audio processing errors in Qwen2-7B-Audio
- Fixed incorrect assertion in Space2Depth operator requiring blockSize > 1
- Fixed LLM execution errors on Armv7a architecture
- Fixed ONNX quantized model conversion failures
- Corrected HIAI operator implementation errors
3.1.0 新增LLM移动端应用
LLM 相关更新
App 发布
- Android
- 新增Android的大模型应用(LLM / Diffusion),详见 apps/Android/MnnLlmChat/README.md
- iOS
- 新增 iOS 的大模型应用,详见 apps/iOS/MNNLLMChat/README.md
新特性
- 模型支持
- 支持 Qwen2-VL / Qwen2-Audio / Qwen2.5-VL 等多模态大模型的导出和运行。
- 支持 DeepSeek-R1-1.5B-Qwen 和 DeepSeek-R1-7B-Qwen
- LLM 单步执行支持
- 新增了对 LLM 单步执行的支持,便于调试和优化模型推理过程。
- LLM 扩展采样算法支持
- 扩展了采样算法的支持,提升了模型推理的灵活性和多样性。
- LLM 导出模型时支持输出历史 Token 的概率值
- 在导出 LLM 模型时,新增了输出历史 Token 概率值的功能,便于后续分析和优化。
- LLM-CPU 支持 mmap 文件缓存
- 新增了对 mmap 文件缓存的支持,使二次加载模型时避免内存重排,提升了加载效率。
性能优化
- CPU 多线程性能进一步提升
- 对 LLM 多线程性能进行了优化,进一步提升了整体推理速度。
- CPU prefill 性能优化
- 优化了 CPU 上 prefill 性能,使 1024 token 输入和 512 token 输入的 prefill 性能持平。
- GPU 优化 OpenCL AutoTuning 耗时
- 优化了 OpenCL AutoTuning 的耗时,避免了首次推理耗时过长的问题。
- GPU 优化:Metal / OpenCL 支持 fp16 的 scale/bias,支持对称量化优化
- Metal / OpenCL 后端支持 fp16 的 scale/bias 和对称量化优化的支持,提升了推理效率。
- LLM 加速:Metal / OpenCL 后端支持 scale/bias 使用 fp16
- Metal / OpenCL 支持 scale/bias 使用 fp16(设置 precision = low 时启用),进一步优化了 GPU 推理性能。
- 3.1.0 对比 3.0.0 在 小米14 设备上的性能对比,千问 2.5-7B-Int4-128 ,输入 512 token
Bug 修复
- LLM Lora 分离加载的模式存在误差
- 修复了 Lora 分离加载模式存在误差的问题
- 开源反馈 #3091: LLM Export 8Bit 量化出错
- 修复了 LLM Export 8Bit 量化出错的问题,确保了量化功能的稳定性。
重构与改进
- LLM 导出模型时支持输出历史 Token 的概率值
- 重构了 LLM 导出模型的功能,支持输出历史 Token 的概率值,便于模型分析和优化。
引擎其他更新
新特性
- Pymnn 支持无 numpy 环境安装
- 现在 Pymnn 可以在没有 numpy 的环境下安装,解决了之前必须依赖 numpy 的问题。
- 数字人支持 KV Cache 回溯
- 新增了对 KV Cache 回溯的支持,提升了数字人模型的推理效率。
- OpenCL 支持大模型分块计算
- 新增了对大模型分块计算的支持,避免了渲染卡顿问题。
性能优化
- Vulkan Image 分支性能优化
- 在 8Gen 系列芯片上,Vulkan 后端推理性能与 OpenCL 后端持平;在中低端设备上,整体性能提升了 30% 左右。
- Convolution3D 转换为 Convolution2D
- 将 Convolution3D 转换为 Convolution2D,降低了 Convolution3D 的耗时和内存占用。
- OpenCL 降低非对齐情况下申请的内存大小
- 优化了 OpenCL 在非对齐情况下申请的内存大小,减少了内存占用。
Bug 修复
- Arm v8 架构下 Debug 和 Release 模式 layernorm 计算有微小误差
- 修复了 Arm v8 架构下 Debug 和 Release 模式 layernorm 计算存在微小误差的问题。
- NNAPI 修正 Binary 不支持 relu fuse 的问题
- 修正了 NNAPI 中 Binary 不支持 relu fuse 的问题。
- MNN:GPU 模型串联运行时内存访问越界问题
- 修复了在模型串联运行时可能出现的内存访问越界问题,原因是 backend 没有调用 onExecuteBegin 和 onExecuteEnd。
- ConvTranspose3D 占用内存过大
- 通过把 **ConvTranspose3D 转换为 ConvTranspose2D ,**修复了 ConvTranspose3D 占用内存过大的问题。
- Onnx 的 Cast 算子输出 fp16 时报 not support type 错误
- 修复了 Onnx 的 Cast 算子输出 fp16 时报 not support type 错误的问题,提升了模型转换的兼容性。
开源反馈修复
- 开源反馈 #3061: ConvTranspose CPU 运行时占用内存大
- 修复了 ConvTranspose CPU 运行时占用内存过大的问题。
- 开源反馈 #3073: 离线量化工具出错
- 修复了离线量化工具出错的问题。
- 开源反馈 #3076: MNN CV 处理出错
- 修复了 MNN CV 处理出错的问题,并进行了相关沟通确认。
- 开源反馈 #3156: Metal 改变输入形状后仍需要 auto-tuning
- 修复了 Metal 改变输入形状后仍需要 auto-tuning 的问题。
重构与改进
- OpenCL 内存共享方案切换为 HardwareBuffer
- 将 OpenCL 内存共享方案切换为 HardwareBuffer,提升了内存管理效率。
- MNN:Geometry Conv3D 的 im2col 产出的 region 数量太多
- 优化了 Conv3D 的 im2col 实现,减少了产出的 region 数量。
本文由 DeepSeek 生成后修改而得
3.0.4: Merge pull request #3170 from alibaba/feature/sync
MNN:Sync: Sync Internal 3.0.4
3.0发布【多模态大模型支持、动态量化功能完善、Web SIMD支持及其他Bug修复】
大模型推理相关
- LLM支持
- 新增了多模态模型Qwen2VL的支持;
- 优化了LLM模型导出流程,现直接导出 MNN 相比先导出 onnx 再转 MNN 的流程快了十倍以上
- 重构了LoRA支持方案,现支持LoRA动态加载与多LoRA并存
- 新增GPTQ、AWQ量化支持;
- 支持tie_embedding参数加载;
- 多轮对话支持kv cache复用,多轮对话时相应延迟降低10倍;
- 支持python接口,支持ceval, ppl测试;
- 支持混合精度量化,支持指定block size量化;
- OpenCL与Metal后端支持,OpenCL性能优化;
- 增加了 Arm KleidiAI 库的集成,目前仅支持对称量化的LLM推理
- 废弃模型分段导出与推理;
- Stable Diffusion支持:实现了标准sd1.5模型的支持以及Attention算子插件。
- ModelZoo: ModelScope与Huggingface
新功能与改进
- 架构优化:现在支持多个模型串联运行时复用动态内存池。
- 动态量化:重构了动态量化相关的代码,以支持任意类型的卷积和模型。
- OpenCL 支持:增加了对五维 gridsampler 的支持,并提升了大尺寸1x1卷积、batchMatMul的计算性能。
- 加载时间优化:针对量化模型,对CPU和GPU的加载时间进行了优化。
- Softmax/LayerNorm/GRU算子优化:在fp16/x86模式下运行时优化了Softmax/LayerNorm/GRU内存占用与计算性能。
- 几何计算:增强了区域合并逻辑,支持裁剪和多对多处理。
- 多线程性能提升:添加了锁核支持,支持按CPU算力进行多核任务划分,对于大中小核架构的CPU,最高提升2线程性能30%。
- 内存管理:引入了Mmap模式,在内存不足时可以迁移到磁盘文件。
- 编译增强:提供了Windows-ARM设备的编译支持,基于 SSE4.1 支持编译 WebAssembly 开启 SIMD。
Bug修复
- 修复了部分模型量化后在ARM上运行出错的问题。
- 解决了某些机型如天矶9000上读取cachefile后再重新生成时cachefile大小变化的问题。
- 修正了ONNX ConvTranspose 带分组属性时(group)转换后的计算错误。
- 修正了Transpose + Slice操作可能越过原始大小时未正确分割region的问题。
- 修复了LaMa Inpainting Model在使用GPU(Metal)运行时输出为0的问题。
- 修正了Softmax在低版本onnx情况下转换后reshape error的问题。
关联 Issue 修正
包括但不限于
2.0-3.0更新说明
对比 2.0 版本,3.0版本更新主要包括如下内容
支持大模型推理
- 增加 mnn-ll 8000 m 模块,支持大语言模型的推理,详见https://mnn-docs.readthedocs.io/en/latest/transformers/llm.html
- 增加 mnn-diffusion 模块,支持文生图模型的推理,详见https://mnn-docs.readthedocs.io/en/latest/transformers/diffusion.html
量化算子补充及支持动态量化
- 增加了 ConvTranspose / Unary / Binary 等算子的量化计算实现
- 支持动态量化,对于仅权重量化模型,也可以对核心算子使用量化计算,以减少内存占用。CPU 后端会将浮点输入量化后使用量化指令计算,GPU后端则将权重在推理过程中反量化回浮点计算
内存优化及形变缓存机制
- 支持了MMAP机制,可以将MNN运行所用内存切换到磁盘,降低内存不足时的崩溃风险
- 支持了延迟内存分配机制,目前仅限CPU后端支持,内部模型测试平均降低内存占用 19.13%,详见 2.7.0 Release Note
- 支持预推理缓存机制,部分输入形状不定的模型(如翻译模型)性能提升10%左右,使用方法详见 2.9.0 Release Note
基于新硬件特性的优化
- 适配了 Arm v8.6 的新指令 smmla 和 bfmmla ,相比 sdot 和 fmla (fp16) ,提升 1倍性能,详见 2.2.0 Release Note ,此外,由于 BF16 计算精度较低,修改为仅对矩阵乘启用BF16 。
- 基于 Intel Subgroup 特性,重新实现了OpenCL 后端相关的算子的,使在支持相应特性的 Intel 显卡上性能提升 70%-100% ,详见 2.5.0 Release Note
- 适配 Adreno GPU 的 Recordable Queue 特性,降低了高通芯片上 OpenCL 后端运行结构复杂但计算量相对较小模型的耗时,最高可能降低40%,详见 2.6.0 Release Note
- 增加了 NNAPI 后端,并对原有的 CoreML 后端和 HIAI 进行了算子扩充
算子整体优化与补充,FP16计算性能提升
【LLM相关性能优化,形状缓存机制】2.9.0
MNN-LLM 正式合入
增加Transformer相关算子与对应图优化功能
- 编译 MNN 时打开宏 MNN_LOW_MEMORY 和 MNN_SUPPORT_TRANSFORMER_FUSE ,增加在线权重反量化、动态量化和Transformer相关算子支持
- -DMNN_SUPPORT_TRANSFORMER_FUSE=ON -DMNN_LOW_MEMORY=ON
- 转换模型时加上 --transformerFuse=1 开启Transformer模型相关图优化
新增 LLM 模块
使用方法
构建 LLM 文件包
- 下载模型,推荐使用魔搭
- pip install modelscope
- 执行脚本(以千问7b为例)
from modelscope import snapshot_download
from transformers import AutoModelForCausalLM, AutoTokenizer
# Downloading model checkpoint to a local dir model_dir
model_dir = snapshot_download('qwen/Qwen-7B-Chat')
#model_dir = snapshot_download("modelscope/Llama-2-7b-chat-ms", revision='v1.0.5',
ignore_file_pattern=[r'.+\.bin$'])
#model_dir = snapshot_download('qwen/Qwen-1_8B-Chat')
print(model_dir)
- 使用 MNN 目录下面的 transformers/llm/export/llm_export.py 进行模型导出,把 torch 模型转换成 onnx
- 示例
- python3 llm_export.py --embed_bin --embed_bf16 --onnx_path onnx --type Qwen-7B-Chat --path /Users/xtjiang/.cache/modelscope/hub/qwen/Qwen-7B-Chat --export_embed --export_token --mnn_path mnn --export
- 务必加 --embed_bin 参数,将 embeding 层导出成 bin 文件
- 完成后会产出两个文件夹
- onnx
- llm.onnx
- tokenizer.txt
- 其他外置权重数据,不用关注
- mnn
- embeddings_bf16.bin
- onnx
- 示例
- 使用 MNNConvert 转换 onnx 模型,并进行量化
- ./MNNConvert -f ONNX --modelFile onnx/llm.onnx llm.mnn --weightQuantBits=4 --transformerFuse=1 --saveExternalData
- 一般需要20-30 分钟,请耐心等待
- 产出 llm.mnn 与 llm.mnn.weight
- 建文件夹,组合上述步骤产出的文件,这里以千问7b为例
- 文件夹名:qwen-7b-int4
- 包含文件
- embeddings_bf16.bin
- llm.mnn
- llm.mnn.weight
- tokenizer.txt
编译LLM引擎并使用
-
编译MNN打开 MNN_BUILD_LLM 宏,编译 transformers/llm/engine 目录,产出 libllm 和 llm_demo
-
使用 llm_demo 运行 llm
- 参数:
- llm.mnn 文件路径
- forwardtype :0 为 CPU ,3 为 OpenCL
- Memory | Precision :Memory * 4 + Precision ,如果 memory 和 preicsion 都为 low ,即设为 10
- 示例:
- ./llm_demo ../../qwen-7b-int4/llm.mnn 0 10
- 【然后进行对话】
- ./llm_demo ../../qwen-7b-int4/llm.mnn 0 10 prompt.txt :使用预设的问题进行测试
- ./llm_demo ../../qwen-7b-int4/llm.mnn 0 10
- 参数:
-
CPU / GPU
性能测试
-
8Gen1
| model | CPU 4线程 | | OpenCL | |
| --- | --- | --- | --- | --- |
| | prefill | decode | prefill | decode |
| qwen-1.8b | 207.56 | 35.58 | 28.58 | 20.40 |
| qwen-7b | 25.86 | 7.5 | 7.95 | 7.70 |
| llama3-8b | 22.09 | 5.59 | 内存不足 | 内存不足 | -
8Gen3
| model | CPU 4线程 | | OpenCL | |
| --- | --- | --- | --- | --- |
| | prefill | decode | prefill | decode |
| qwen-1.8b | 205.70 | 47.07 | 61.25 | 21.56 |
| qwen-7b | 40.93 | 11.01 | 20.26 | 10.60 |
| llama3-8b | 36.44 | 7.83 | 19.10 | 2.14 | -
注:暂未对 llama3-8b 结构支持 Transformer 相关图优化,因此GPU性能较差
形变缓存机制
背景
对于语音/文本类的模型,往往涉及张量某个维度的逐步变化,这种情况下每次都会进行几何计算、申请内存等操作,导致不可忽略的性能损耗。考虑到输入单个维度变化的情况下,网络中会存在部分算子形状不变,这部分计算是可以去除的。
为了对这种情况进行优化,MNN新增了形变缓存机制,使模型输入形状变化时,形状不变的算子跳过形变相关操作,以提升性能。
原理
- MNN 通过两个状态去优化Resize过程,先在 Check 状态下寻找不变形状的算子,然后切换到 Fix 状态,分离易变形状与不变形状算子进行处理。对应于 Interpreter.hpp 里面增加两个 SessionMode
- Session_Resize_Check
- Session_Resize_Fix
- Check 状态
- 存储或检查输入的形状是否与上次一致,对应跳过几何计算阶段,但资源分配阶段不跳过
- Fix 状态
- 根据算子的形状不变标志,跳过几何计算与资源分配阶段
基于 Module API 使用
对应 API
- **Module::**traceOrOptimize
示例
- 网络输入为 speech ,输出为 out0 ,out1 ,输入大小为: 1,3,X
std::shared_ptr<MNN::Express::Module> net(MNN::Express::Module::load(fileName, {"speech"}, {"out0", "out1"}), MNN::Express::Module::destroy);
net->traceOrOptimize(MNN::Interpreter::Session_Resize_Check);
int validShape[] = {64, 112};
for (int i=0; i<2; ++i) {
auto varp = MNN::Express::_Input({1, 3, validShape[i]}, MNN::Express::NCHW);
varp->writeMap<float>();
auto outputs = net->onForward({varp});
}
net->traceOrOptimize(MNN::Interpreter::Session_Resize_Fix);
// Forward and use output
基于 Intrepreter - Session API使用
相关API
- Interpreter::setSessionMode
示例
- 网络输入为 speech ,输出为 out0 ,out1 ,输 8000 大小为: 1,3,X
std::shared_ptr<MNN::Interpreter> net(MNN::Interpreter::createFromFile(fileName), MNN::Interpreter::destroy);
MNN::ScheduleConfig config;
/*Set up config
......
*/
MNN::Session* session = net->createSession(config);
auto input = net->getSessionInput(session, "speech");
auto out0 = net->getSessionOutput(session, "out0");
auto out1 = net->getSessionOutput(session, "out1");
net->setSessionMode(Interpreter::Session_Resize_Check);
/*Resize Session for each valid size Begin*/
/*Demo: */
net->resizeTensor(input, {1, 3, 112});
net->resizeSession(session);
net->resizeTensor(input, {1, 3, 64});
net->resizeSession(session);
/*Resize Session for each valid size End*/
net->setSessionMode(Interpreter::Session_Resize_Fix);
/*Fill input and run session
......
*/
鸿蒙系统支持、功能完善与Github Issue 修正
功能完善
- 支持华为鸿蒙系统上的编译与运行
- 参考 MNN/project/harmony 下面的脚本进行编译
- 增加 WinogradLevel 配置,支持用户设定较低的Winograd 输出计算尺寸 ,以节省内存
- setSessionHint(WINOGRAD_MEMORY_LEVEL, 0) :使用最低计算尺寸
- setSessionHint(WINOGRAD_MEMORY_LEVEL, 3) :使用默认计算尺寸
- 修正 onnx onehot 算子在输入尺寸未知时转换出错问题
- 修正 Sigmoid / Tanh 等算子量化后出错的问题
- 优化 Tile 算子的几何计算分解,降低产出的Region数,以减少对应GPU后端的初始化耗时
- 支持 LayerNorm RMS 模式及相应的图优化
- 原生支持onnx-external data ,降低 Onnx 大模型转换所需要内存
- Metal 后端 NC4HW4 布局模式修改为C4NHW4,以优化 batch > 1 的卷积性能
- Metal 后端支持 BatchMatMul / Gather / GatherND 等对应生成的 Loop 算子
- Metal 后端支持 GridSampler3D
- Metal 后端支持可变精度设置
- precision 为 low / normal 时使用 fp16 存储
- precision 为 high 时使用 fp32 存储
- 计算一律使用 fp32
- CPU 后端修正权值在线反量化模式下,输入输出通道不对齐时出错的问题
- OpenCL 后端优化 Pooling 算子在 KernelSize 很大时的性能问题
- OpenCL 后端增加 Kernel 缓存机制,降低部分设备上 resize 耗时
- 其他Bugfix与优化
相应 Issue 修正
2.8.1
2.8.1
2.8.0
1. 新特性
- MNN支持以JSON文件格式导入量化参数 (issue-2587)
- 支持 MaxPooling with index (issue-2268)
- MNN支持NNAPI中Deconvolution算子
- MNNConvert支持 Onnx 中 dim < 2 的矩阵乘算子
- TestConvert 增加测试非 CPU 后端的能力
- Pymnn支持构建 MNN 训练模型,以支持离线训练模式
- 优化MNNConvert,大幅降低大模型转换时的内存占用
- OpenCL 支持 Loop 算子特殊形式,广播 Binary
- 支持 Unary, Prelu 算子量化
2. 性能优化
- ONNX ScatterND算子性能优化 (issue-2530)
- CPUTopKV2算子性能优化,将tflite的实现修改为stl的实现;
- ARM汇编实现
MNNTranspose16Bit8x8
, 提升fp16的转置性能; - ARM/X86使用动态量化方案优化权重量化的矩阵乘、卷积算子;llm模型推理性能大幅提升;
llm cpu性能测试
mnn-llm
在MNN 2.8.0版本的CPU性能如下,测试均使用4线程, 速度为prefill / decode
单位为tok/s
model | android(f16/32) | macos (f32) | linux (f32) | windows (f32) |
---|---|---|---|---|
qwen-1.8b-int4 | 100.21 / 22.22 | 84.85 / 19.93 | 151.00 / 35.89 | 117.30 / 33.40 |
qwen-1.8b-int8 | 99.95 / 16.94 | 67.70 / 13.45 | 118.51 / 24.90 | 97.19 / 22.76 |
chatglm-6b-int4 | 17.37 / 6.69 | 19.79 / 6.10 | 34.05 / 10.82 | 30.73 / 10.63 |
chatglm2-6b-int4 | 26.41 / 8.21 | 20.78 / 6.70 | 36.99 / 11.50 | 33.25 / 11.47 |
chatglm3-6b-int4 | 26.24 / 7.94 | 19.67 / 6.67 | 37.33 / 11.92 | 33.61 / 11.21 |
qwen-7b-int4 | 14.60 / 6.96 | 19.79 / 6.06 | 33.55 / 10.20 | 29.05 / 9.62 |
baichuan2-7b-int4 | 13.87 / 6.08 | 17.21 / 6.10 | 30.11 / 10.87 | 26.31 / 9.84 |
llama-2-7b-int4 | 17.98 / 5.17 | 19.72 / 5.06 | 34.47 / 9.29 | 28.66 / 8.90 |
测试的系统和设备信息如下,
os | device | CPU | Memory |
---|---|---|---|
android | XiaoMi12 | Snapdragon 8gen1 | 8 GB |
macos | MacBook Pro 2019 | Intel(R) Core(TM) i7-9750H CPU | 16 GB |
linux | PC | Intel(R) Core(TM) i7-13700K | 32GB |
windows | PC | Intel(R) Core(TM) i7-13700K | 32GB |
3. Bugfix
3.1 关联 Github Issue 解决
- 修复MNN2.5.3版本后量化模型不能得到正确结果 (issue-2614)
- 修复tflite模型转换到MNN时重复算子检测卡死的问题 (issue-2573)
- 支持Pytorch FX 量化而得的 ONNX 模型转换 (issue-2548)
3.2 其他 Bugfix 或优化
工具类:
- 修复Defer Allocator 实际分配内存后未做成功与否的检查
- 修复量化工具中由index=-1导致的crash问题
- 修复模型转换工具在转大模型时会crash的问题
- 修复模型转换工具在转换ONNX模型的Clip算子时不能正确处理 int32_t数据的问题
- 修复使用OpenCL训练时的内存泄露问题
- OpenCL单测错误问题修复
编译兼容性问题:
- 修复在X86_x64下SSE指令不兼容导致的编译错误
- 修复IOS 工程文件中由于局部变量在线程函数外导致的编译错误
- 修复一些ARM编译器无法识别 "vmov.f16 q0, #5.0"导致的编译错误
结果错误(crash)类问题:
- 修复C++版本下Binary函数中(<=,<,>=,>,==)的返回值类型导致的结果错误
- 修复 1x1 Strassen矩阵在Low Memory时crash问题
- 修复coreML在deconvolution算子padding!=0时crash问题
- 修复 ModuleAPI在运行时使用 Defer Allocator来申请内存的问题
2.7.2
Merge pull request #2618 from alibaba/feature/sync [MNN:Sync] Sync Internal 2.7.2
2.7.1
MNN 2.7.1
【内存分配优化、性能优化、Bugfix】2.7.0
1. 新特性
- 新增LayerNorm int8量化算子支持:
- CUDA 后端 新增 TopKV2 算子支持
- 新增 DeferAllocator ,支持延迟分配内存,默认在 CPU Backend 中启用,内部模型测试平均降低内存占用 19.13%
- OpenCL Buffer 模式新增Range/Select/Cast/ArgMax 等算子支持
- OpenCL支持用户设置platform_id/device_id/platform_num接口,以选择显卡核心,并支持默认优先选用独显(NVIDIA/AMD独显)
- 优化 OpenCL 后端内存分配逻辑,降低ChatGLM模型的内存占用
2. 性能优化
-
OpenCL优化Mali-GPU计算量大的卷积运算(image/buffer存储混用)。性能提升10%-20%。
-
CPU浮点模型优化Winograd卷积的准入条件、1x1Strassen算法。性能提高3%~18%。
-
CPU量化模型优化WinogradInt8、DepthwiseInt8。性能提高4%~22%。
-
CUDA优化广播Binary算子性能、Blit算子性能。
-
CUDA支持编译CodeGen功能,针对Unary/Raster/Binary算子进行算子在线融合,整体性能提升5%-10%。
3. Bugfix
3.1 关联 Github Issue 解决
- Tflite FC + Relu 情况下模型转换到 MNN 未正确解析 Relu #2332
- Onnx 模型中FP16 常量 转换到 MNN 时不支持#2477
- Onnx 新的 LayerNorm 算子不支持(目前采用效率较低的算子组合实现)#2509
- Vulkan Image 模式部分情形下计算错误#2433
- Yolov8 MNN CUDA 推理出错 #2428
- OpenCL Codegen 部分 case 下出现编译错误 #2523
3.2 其他 Bugfix 或优化
- 修正 Vulkan Buffer 模式单元测试 convolution3d 出错的问题
- 修正 ScatterND 算子在 update tensor 长度为空的计算错误问题
- 修正 Onnx EinSum 算子在部分情况下转换到 MNN 出错的问题
- 修正 Onnx Split 算子转换问题
- 支持 Onnx 的 GEMM + Relu 算子的合并