Skip to content

Commit b23b55b

Browse files
authored
Merge pull request #3170 from alibaba/feature/sync
MNN:Sync: Sync Internal 3.0.4
2 parents 9889cc1 + 7668152 commit b23b55b

File tree

248 files changed

+32828
-20039
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

248 files changed

+32828
-20039
lines changed

CMakeLists.txt

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ option(MNN_DEBUG_TENSOR_SIZE "Enable Tensor Size" OFF)
5353
option(MNN_GPU_TRACE "Enable MNN Gpu Debug" OFF)
5454
option(MNN_SUPPORT_RENDER "Enable MNN Render Ops" OFF)
5555
option(MNN_SUPPORT_TRANSFORMER_FUSE "Enable MNN transformer Fuse Ops" OFF)
56-
option(MNN_PORTABLE_BUILD "Link the static version of third party libraries where possible to improve the portability of built executables" OFF)
5756
option(MNN_SEP_BUILD "Build MNN Backends and expression separately. Only works with MNN_BUILD_SHARED_LIBS=ON" ON)
5857
option(NATIVE_LIBRARY_OUTPUT "Native Library Path" OFF)
5958
option(NATIVE_INCLUDE_OUTPUT "Native Include Path" OFF)
@@ -174,9 +173,6 @@ ENDIF()
174173
IF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT MNN_BUILD_SHARED_LIBS AND NOT (MSVC OR WIN32))
175174
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS}")
176175
SET(MNN_SEP_BUILD OFF CACHE BOOL "<docstring>" FORCE)
177-
IF(MNN_BUILD_CONVERTER)
178-
SET(MNN_PORTABLE_BUILD ON CACHE BOOL "<docstring>" FORCE)
179-
ENDIF()
180176
ENDIF()
181177

182178
if(MNN_FORBID_MULTI_THREAD)
@@ -515,6 +511,7 @@ endif()
515511
if ((NOT MSVC) AND MNN_HIDDEN)
516512
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility-inlines-hidden -fvisibility=hidden")
517513
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden")
514+
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -fvisibility=hidden")
518515
# Omit frame pointer may cause difficult debug
519516
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fomit-frame-pointer")
520517
endif()
@@ -701,6 +698,16 @@ IF(MNN_TENSORRT)
701698
list(APPEND MNN_EXTRA_DEPENDS ${MNN_TRT_LIBS})
702699
ENDIF()
703700

701+
IF(MNN_BUILD_OPENCV)
702+
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/tools/cv)
703+
IF(MNN_SEP_BUILD)
704+
list(APPEND MNN_DEPS MNNOpenCV)
705+
ELSE()
706+
list(APPEND MNN_TARGETS MNNOpenCV)
707+
list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNNOpenCV>)
708+
ENDIF()
709+
ENDIF()
710+
704711
IF(MNN_BUILD_LLM)
705712
# add_definitions(-DMNN_BUILD_LLM)
706713
include(${CMAKE_CURRENT_LIST_DIR}/transformers/llm/engine/CMakeLists.txt)
@@ -709,6 +716,13 @@ IF(MNN_BUILD_LLM)
709716
list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:llm>)
710717
ENDIF()
711718
ENDIF()
719+
IF(MNN_BUILD_DIFFUSION AND MNN_BUILD_OPENCV AND MNN_IMGCODECS)
720+
include(${CMAKE_CURRENT_LIST_DIR}/transformers/diffusion/engine/CMakeLists.txt)
721+
IF(NOT MNN_SEP_BUILD)
722+
list(APPEND MNN_TARGETS diffusion)
723+
list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:diffusion>)
724+
ENDIF()
725+
ENDIF()
712726

713727
IF(MNN_SEP_BUILD)
714728
add_library(MNN SHARED ${CMAKE_CURRENT_LIST_DIR}/cmake/dummy.cpp ${MNN_OBJECTS_TO_LINK} ${MNN_PUB_HDRS} ${MNN_EXPR_PUB_HDRS} ${MNN_EXTRA_HEADERS})
@@ -774,13 +788,7 @@ IF(WIN32 AND MNN_BUILD_CONVERTER AND MNN_BUILD_SHARED_LIBS)
774788
target_link_libraries(MNN PUBLIC ${Protobuf_LIBRARIES})
775789
ENDIF()
776790
# Merge MNN/MNNExpress/MNNOpenCV and other backends into one .lib/.dll on Windows
777-
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/tools/cv)
778-
IF(MNN_BUILD_OPENCV AND NOT MNN_SEP_BUILD)
779-
IF(MSVC)
780-
target_compile_definitions(MNNOpenCV PRIVATE "-DBUILDING_MNN_DLL" INTERFACE "-DUSING_MNN_DLL")
781-
ENDIF()
782-
target_sources(MNN PRIVATE $<TARGET_OBJECTS:MNNOpenCV>)
783-
ENDIF()
791+
784792
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/tools/audio)
785793
IF(MNN_BUILD_AUDIO AND NOT MNN_SEP_BUILD)
786794
IF(MSVC)
@@ -820,9 +828,7 @@ list(REMOVE_ITEM MNN_TARGETS MNN)
820828
IF(MNN_BUILD_DEMO)
821829
include(${CMAKE_CURRENT_LIST_DIR}/demo/exec/CMakeLists.txt)
822830
ENDIF()
823-
IF(MNN_BUILD_DIFFUSION AND MNN_BUILD_OPENCV AND MNN_IMGCODECS)
824-
include(${CMAKE_CURRENT_LIST_DIR}/transformers/diffusion/CMakeLists.txt)
825-
ENDIF()
831+
826832
IF(MNN_BUILD_TOOLS)
827833
include(${CMAKE_CURRENT_LIST_DIR}/tools/cpp/CMakeLists.txt)
828834
ENDIF()

docs/compile/cmake.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ MNN使用CMake构建项目,CMake中的宏定义列表如下:
2020
| MNN_DEBUG_MEMORY | 是否开启MNN内存调试,默认为`OFF` |
2121
| MNN_DEBUG_TENSOR_SIZE | 是否开启MNN tensor size调试,默认为`OFF` |
2222
| MNN_GPU_TRACE | 是否开启MNN GPU调试,默认为`OFF` |
23-
| MNN_PORTABLE_BUILD | 尽可能链接第三方库的静态版本,以提高构建的可执行文件的可移植性,默认为`OFF` |
2423
| MNN_SEP_BUILD | 是否构建MNN的后端和表达式分离版本,只在`MNN_BUILD_SHARED_LIBS=ON`时生效,默认为`ON` |
2524
| NATIVE_LIBRARY_OUTPUT | 如果构建为动态库,则指定动态库的输出路径,默认为`OFF` |
2625
| NATIVE_INCLUDE_OUTPUT | 如果构建为动态库,则指定动态库的头文件路径,默认为`OFF` |

docs/contribute/backend.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,23 @@ virtual void onExecuteEnd() const = 0;
179179
对于使用同一种后端,且存在先后顺序,不会同时运行的模型,MNN提供机制使其共享部分计算资源,比如线程池,内存池等等。
180180
这部分计算资源使用Runtime存储。而Backend则由Runtime创建
181181

182+
### CompileType
183+
184+
Runtime 可以通过指定 CompileType ,决定 MNN 是否跳过几何计算步骤:
185+
186+
```
187+
enum CompilerType {
188+
// 部分执行几何计算,分解形变算子,但不分解 BatchMatMul / Gather 等算子
189+
Compiler_Geometry = 0,
190+
191+
// 完全跳过几何计算步骤,直接使用原始算子
192+
Compiler_Origin = 1,
193+
194+
// 完全执行几何计算,仅此模式下,可以在算子不支持时自动回退到CPU计算
195+
Compiler_Loop = 2,
196+
};
197+
```
198+
182199
### 实现Runtime
183200
Runtime主要实现如下接口:
184201

docs/index.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
inference/session
4343
inference/module
4444
inference/python
45+
inference/npu
4546

4647
.. toctree::
4748
:maxdepth: 1
@@ -81,7 +82,6 @@
8182
tools/compress
8283
tools/visual
8384
tools/python
84-
tools/script
8585

8686
.. toctree::
8787
:maxdepth: 1

docs/inference/module.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,6 @@ rtmgr->setMode(Interpreter::Session_Debug);
9292
9393
- Interpreter::HintMode::WINOGRAD_MEMORY_LEVEL :使用 Winograd 算法优化卷积时,内存占用倾向,默认为 3 ,若希望降低内存占用可设为 0
9494
- Interpreter::HintMode::GEOMETRY_COMPUTE_MASK :几何计算相关优化开关,1为区域合并,2为复合区域合并,4为使用loop算子,8为支持几何计算重计算,需要多个功能开启时把对应值叠加。默认为功能全开。
95-
- Interpreter::HintMode::DYNAMIC_QUANT_OPTIONS :动态量化选项,1为 Per Batch,2为Per Tensor 。默认为2。
9695
- Interpreter::HintMode::CPU_LITTLECORE_DECREASE_RATE :对于 Android 设备存在大中小核的情况,大核算力到中核算力的衰减比例。默认为50(中核算力为大核的50%)
9796
9897

docs/inference/npu.md

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# NPU 及相应后端使用说明
2+
3+
目前 MNN 支持通过如下后端调用部分手机上的NPU能力:
4+
- CoreML
5+
- NNAPI
6+
- HIAI
7+
8+
目前NPU相关后端均不支持可变形状、控制流等动态模型,算子数相比CPU/GPU支持要少,建议根据NPU是否能跑通,反复调整模型结构。
9+
10+
## CoreML
11+
适用于 Mac / iOS / iPad
12+
13+
### CoreML 后端编译
14+
1. 编译 MNN 时打开编译宏 MNN_COREML :-DMNN_COREML=ON
15+
2. 编译App / 可执行程序时,增加链接 CoreML.framework
16+
17+
### CoreML 后端使用
18+
backend type设置成:MNN_FORWARD_NN
19+
20+
## NNAPI
21+
适用于 Android 系统,高通/联发科芯片
22+
23+
### NNAPI 后端编译
24+
打开编译宏 MNN_NNAPI 即可
25+
```
26+
cd ${MNN}
27+
cd project/android
28+
mkdir build && cd build
29+
../build_64.sh -DMNN_USE_LOGCAT=ON -DMNN_NNAPI=ON
30+
```
31+
32+
### NNAPI 后端使用
33+
backend type设置成:MNN_FORWARD_NN
34+
35+
36+
## 华为 HIAI
37+
适用于 Android 系统, Kirlin芯片
38+
39+
### HIAI 环境准备
40+
1. 从如下链接下载 DDK
41+
https://developer.huawei.com/consumer/cn/doc/hiai-Library/ddk-download-0000001053590180
42+
43+
44+
45+
2. 拷贝相对应的so和include文件到 hiai/3rdParty 目录下,如果没有3rdParty目录,新建一个:
46+
47+
```
48+
mkdir ${MNN}/source/backend/hiai/3rdParty
49+
cp -r ${DDK}/lib ${MNN}/source/backend/hiai/3rdParty/armeabi-v7a
50+
cp -r ${DDK}/lib64 ${MNN}/source/backend/hiai/3rdParty/arm64-v8a
51+
cp -r ${DDK}/include ${MNN}/source/backend/hiai/3rdParty/include
52+
```
53+
54+
### HIAI 编译执行
55+
1. cmake 参数打开npu开关: -DMNN_NPU=true
56+
2. backend type设置成:MNN_FORWARD_USER_0
57+
3. 执行可执行程序(需动态加载:libMNN_NPU.so, libhiai_ir_build.so, libhiai_ir.so, libhiai.so)

docs/inference/session.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ delete nhwcTensor;
302302
通过这类拷贝数据的方式,用户只需要关注自己创建的tensor的数据布局,`copyFromHostTensor`会负责处理数据布局上的转换(如需)和后端间的数据拷贝(如需)。
303303

304304

305-
### 不推荐】直接填充数据
305+
### 已废弃】直接填充数据
306306
```cpp
307307
auto inputTensor = interpreter->getSessionInput(session, NULL);
308308
inputTensor->host<float>()[0] = 1.f;
@@ -594,7 +594,7 @@ delete nhwcTensor;
594594
595595
596596
597-
### 【不推荐】直接读取数据
597+
### 【已废弃】直接读取数据
598598
**由于绝大多数用户都不熟悉MNN底层数据布局,所以不要使用这种方式!!!**
599599
```cpp
600600
auto outputTensor = interpreter->getSessionOutput(session, NULL);

docs/tools/compress.md

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ MNN模型压缩工具提供了包括低秩分解、剪枝、量化等模型压
6969
- 动态量化
7070
可以通过如下方式打开MNN运行时的动态量化支持,使权值量化后的模型中卷积等核心算子使用量化计算,降低内存并提升性能
7171

72-
1. 打开 MNN_LOW_MEMORY 编译宏编译 MNN (支持动态量化功能)
72+
1. 打开 `MNN_LOW_MEMORY` 编译宏编译 MNN (支持动态量化功能)
7373
```
7474
cmake .. -DMNN_LOW_MEMORY=ON
7575
```
@@ -99,6 +99,43 @@ backendConfig.precision = BackendConfig::Precision_Low;
9999
config.backendConfig = &backendConfig;
100100
```
101101

102+
### 自动压缩工具
103+
可使用脚本 `tools/converter/tools/auto_quant.py` 依据测试误差,自动确定量化方案。使用步骤如下:
104+
105+
1. 将模型转成MNN格式,示例:
106+
```
107+
./MNNConvert -f ONNX --modelFile src.onnx --MNNModel float.mnn
108+
```
109+
110+
2. 参考[正确性校验](convert.html#id3),构建测试文件夹 mnntest
111+
112+
3. 在编译好 MNNConvert 的目录下执行脚本
113+
```
114+
# 查看参数
115+
python ../tools/converter/tools/auto_quant.py -h
116+
# 压缩,产出文件 quant.mnn 及相关参数 quant.mnn.json
117+
python ../tools/converter/tools/auto_quant.py --model float.mnn --quant_model quant.mnn --test_dir mnntest --rate 0.05
118+
```
119+
120+
### 自行定制方案
121+
若默认压缩方案无法满足精度需求,可以按如下步骤定制压缩方案。一般来说跳过一些重要的算子压缩,可以缓解精度下降的问题。
122+
123+
1. 生成模型压缩信息文件: user.json
124+
```
125+
rm user.json
126+
./MNNConvert -f ONNX --modelFile src.onnx --MNNModel dst.mnn --weightQuantBits 8 --compressionParamsFile user.json
127+
```
128+
129+
2. 编辑 user.json ,把不需要量化的算子,bits数设为0 或者调高 bits数(不超过8)。也可以参考脚本 `tools/converter/tools/user_quant_modify_demo.py` ,批量处理压缩信息,然后执行脚本:
130+
131+
```
132+
python3 ../tools/converter/tools/user_quant_modify_demo.py user.json user.json
133+
```
134+
135+
3. 使用 user.json 重新转换模型
136+
```
137+
./MNNConvert -f ONNX --modelFile src.onnx --MNNModel dst.mnn --compressionParamsFile user.json
138+
```
102139

103140
## 离线量化工具
104141
### 离线量化工具安装

docs/tools/convert.md

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ Usage:
4747
--weightQuantAsymmetric 与weightQuantBits结合使用,决定是否用非对称量化,默认为`true`
4848

4949
--compressionParamsFile arg
50-
使用MNN模型压缩工具箱生成的模型压缩信息文件或根据用户提供的量化参数来生成对应的量化模型,量化参数文件可参考tools/converter/user_provide_quant_params.json
50+
使用MNN模型压缩工具箱生成的模型压缩信息文件或根据用户提供的量化参数来生成对应的量化模型,量化参数文件可参考tools/converter/user_provide_quant_params.json 。如果文件不存在,且开启了weightQuantBits等量化功能,会在相应路径生成模型压缩信息文件(json格式),可后续编辑
5151

5252
--saveStaticModel 固定输入形状,保存静态模型, default: false
5353

@@ -74,8 +74,7 @@ Usage:
7474
--alignDenormalizedValue arg
7575
可选值:{0, 1}, 默认为1, 当`float(|x| < 1.18e-38)`会被视为0
7676

77-
--detectSparseSpeedUp arg
78-
可选值:{0, 1}, 默认为1, 会检测权重是否使用稀疏化加速
77+
--detectSparseSpeedUp 检测权重是否使用稀疏化加速/压缩,有可能减少模型大小,但增大模型转换时间
7978

8079
--saveExternalData 将权重,常量等数据存储在额外文件中,默认为0,也就是`false`
8180

docs/tools/script.md

Lines changed: 0 additions & 70 deletions
This file was deleted.

0 commit comments

Comments
 (0)