Skip to content

Commit

Permalink
Merge pull request #2103 from alibaba/feature/sync_2_2_0
Browse files Browse the repository at this point in the history
[Sync] Sync Internal Gitlab 2.2.0
  • Loading branch information
jxt1234 authored Oct 31, 2022
2 parents 6027a44 + acb3bb6 commit 4634ed8
Show file tree
Hide file tree
Showing 101 changed files with 5,760 additions and 640 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -491,6 +491,7 @@ ENDIF()

# NNAPI
IF(MNN_NNAPI)
add_definitions(-DMNN_NNAPI_ENABLED=1)
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/source/backend/nnapi/)
list(APPEND MNN_DEPS MNN_NNAPI)
list(APPEND MNN_OBJECTS_TO_LINK $<TARGET_OBJECTS:MNN_NNAPI>)
Expand Down
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,13 +73,14 @@ The Architecture / Precision MNN supported is shown below:
| | x86/x64-AVX2 | S | B | B | A |
| | x86/x64-AVX512 | S | B | B | S |
| | ARMv7a | S | S (ARMv8.2) | S | S |
| | ARMv8 | S | S (ARMv8.2) | S | S |
| | ARMv8 | S | S (ARMv8.2) | S(ARMv8.6) | S |
| GPU | OpenCL | A | S | C | C |
| | Vulkan | A | A | C | C |
| | Metal | A | S | C | C |
| | CUDA | A | S | C | C |
| NPU | CoreML | B | C | C | C |
| NPU | CoreML | B | B | C | C |
| | HIAI | B | C | C | B |
| | NNAPI | B | B | C | C |



Expand Down
7 changes: 4 additions & 3 deletions README_CN.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ MNN文档:
- 支持 Tensorflow、Caffe、ONNX、Torchscripts 等主流模型文件格式,支持CNN / RNN / GAN / Transformer 等主流网络结构。
- 支持多输入多输出,支持任意维度的输入输出,支持动态输入(输入大小可变),支持带控制流的模型
- 算子丰富,支持 178 个Tensorflow Op、52个 Caffe Op、163个 Torchscipts Op、158 个 ONNX Op(ONNX 基本完整支持)
- 支持 服务器 / 个人电脑 / 手机 及具有POSIX接口的嵌入式设备,支持使用设备的 CPU / GPU 计算,支持部分设备的 NPU 计算(IOS 11 + CoreML / Huawei + HIAI)
- 支持 服务器 / 个人电脑 / 手机 及具有POSIX接口的嵌入式设备,支持使用设备的 CPU / GPU 计算,支持部分设备的 NPU 计算(IOS 11 + CoreML / Huawei + HIAI / Android + NNAPI
- 支持 Windows / iOS 8.0+ / Android 4.3+ / Linux  及具有POSIX接口的操作系统

### 高性能
Expand Down Expand Up @@ -77,13 +77,14 @@ MNN适配的硬件架构与精度详见下表:
| | x86/x64-AVX2 | S | B | B | A |
| | x86/x64-AVX512 | S | B | B | S |
| | ARMv7a | S | S (ARMv8.2) | S | S |
| | ARMv8 | S | S (ARMv8.2) | S | S |
| | ARMv8 | S | S (ARMv8.2) | S(ARMv8.6) | S |
| GPU | OpenCL | A | S | C | C |
| | Vulkan | A | A | C | C |
| | Metal | A | S | C | C |
| | CUDA | A | S | C | C |
| NPU | CoreML | B | C | C | C |
| NPU | CoreML | B | B | C | C |
| | HIAI | B | C | C | B |
| | NNAPI | B | B | C | C |


## 工具
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/_static/images/intro/releases/2_2_0_cuda.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
11 changes: 11 additions & 0 deletions docs/faq.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
- [模型转换时有Error信息](faq.html#reshape-error)
- [模型量化后为什么比浮点慢](faq.html#id14)
- [输入输出的elementSize与实际有区别](faq.html#tensor-elementsize)
- [MNN模型如何加密](faq.html#id18)

## 编译相关
### 环境需求
Expand Down Expand Up @@ -246,3 +247,13 @@ GPU 后端调用 copy 的时间包含两个部分
- x64 + vnni 指令,量化计算有 sdot 指令,明显快于 FP32 ,编译 MNN 时需要开启 MNN_AVX512 以支持这个指令,一般相比 AVX512 的浮点运算快 30%
- ARM v7a / ARMv8 :量化计算采用 int8 乘加到 int16,再双加到 int32 的方式,计算效率略快于浮点(一般 30% 左右提升)。
- ARMv8.2 + 量化计算有 sdot 指令,但同时 FP32 相对之前架构发射数也提升了一倍,编译 MNN 打开 MNN_ARM82 启用 sdot 指令则量化计算更快,否则 FP32 更快,理想情况比 FP32 快1倍以上,比 FP16 快 20%。
## 其他问题
### MNN模型如何加密
加密与破解是攻防的较量,端侧加密很难做到绝对安全。
可以通过构造独有的模型格式来增加反向的难度,按照以下步骤操作可以得到独特的模型格式:
1. 针对`schema/default/*.fbs`下的文件,对参数顺序,枚举类顺序进行重新排序;比如:可以重新调整`MNN.fbs`中`OpType`的顺序;重新调整`CaffeOp.fbs`中`Convolution2DCommon`成员变量的顺序;
2. 执行`schema/generate.sh`重新生成`flatbuffers`头文件;
3. 重新编译`MNN`库文件, `Convert`等所有工具;
4. 使用新的工具重新转换模型;
5. 在端侧使用新模型和新的`MNN`库文件进行部署;
6 changes: 4 additions & 2 deletions docs/inference/session.md
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,8 @@ struct BackendConfig {
enum PrecisionMode {
Precision_Normal = 0,
Precision_High,
Precision_Low
Precision_Low,
Precision_Low_BF16
};

PrecisionMode precision = Precision_Normal;
Expand All @@ -191,7 +192,8 @@ struct BackendConfig {
**precision 为 Low 时,使用 fp16 存储与计算**,计算结果与CPU计算结果有少量误差,实时性最好;precision 为 Normal 时,使用 fp16存储,计算时将fp16转为fp32计算,计算结果与CPU计算结果相近,实时性也较好;precision 为 High 时,使用 fp32 存储与计算,实时性下降,但与CPU计算结果保持一致。

后端 CPU
**precision 为 Low 时,根据设备情况开启 FP16 或 BF16 计算**
**precision 为 Low 时,根据设备情况开启 FP16 计算**
**precision 为 Low_BF16 时,根据设备情况开启 BF16 计算**

`sharedContext`用于自定义后端,用户可以根据自身需要赋值。

Expand Down
5 changes: 3 additions & 2 deletions docs/intro/about.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
- 支持 Tensorflow、Caffe、ONNX、Torchscripts 等主流模型文件格式,支持CNN / RNN / GAN / Transformer 等主流网络结构。
- 支持多输入多输出,支持任意维度的输入输出,支持动态输入(输入大小可变),支持带控制流的模型
- 算子丰富,支持 178 个Tensorflow Op、52个 Caffe Op、163个 Torchscipts Op、158 个 ONNX Op(ONNX 基本完整支持)
- 支持 服务器 / 个人电脑 / 手机 及具有POSIX接口的嵌入式设备,支持使用设备的 CPU / GPU 计算,支持部分设备的 NPU 计算(IOS 11 + CoreML / Huawei + HIAI)
- 支持 服务器 / 个人电脑 / 手机 及具有POSIX接口的嵌入式设备,支持使用设备的 CPU / GPU 计算,支持部分设备的 NPU 计算(IOS 11 + CoreML / Huawei + HIAI / Android + NNAPI
- 支持 Windows / iOS 8.0+ / Android 4.3+ / Linux  及具有POSIX接口的操作系统

### 高性能
Expand Down Expand Up @@ -72,13 +72,14 @@ MNN适配的硬件架构与精度详见下表:
| | x86/x64-AVX2 | S | B | B | A |
| | x86/x64-AVX512 | S | B | B | S |
| | ARMv7a | S | S (ARMv8.2) | S | S |
| | ARMv8 | S | S (ARMv8.2) | S | S |
| | ARMv8 | S | S (ARMv8.2) | S(ARMv8.6) | S |
| GPU | OpenCL | A | S | C | C |
| | Vulkan | A | A | C | C |
| | Metal | A | S | C | C |
| | CUDA | A | S | C | C |
| NPU | CoreML | B | C | C | C |
| | HIAI | B | C | C | B |
| | NNAPI | B | C | C | C |


## 工具
Expand Down
47 changes: 45 additions & 2 deletions docs/intro/releases.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,48 @@
# 发布版本
## 2.1.0 (`Latest`)
## 2.2.0 (`Latest`)
### 框架通用性
- MNN新增对`ARMv8.6-A`指令支持,支持了`smmla``bfmmla`指令
- MNN新增汇编预处理脚本,能够将汇编指令转换为`.inst`指令,降低新指令对编译器的依赖
- 新增A16和M2 CPU family支持
- 新增Interp3D支持
- MNN新增`NNAPI`后端,能够利用Android设备上的NPU/APU/DSP进行计算;支持`float32``float16`数据类型的模型推理。目前支持的算子如下:
- [x] Conv2d, DepthwiseConv2d
- [x] MaxPool2d, AvgPool2d
- [x] Binary/Elementwise: Add, Sub, Mul, Div
- [x] Unary: Abs, Exp, Sqrt, Rsqrt, Log, Sin, Tanh, Floor, Neg, Hardswish
- [x] Activation: Softmax, Relu, Relu6, Prelu, Sigmoid, Elu
- [x] Reduction: Sum, Mean, Max, Min, Prod, All, Any
- [x] Argmax, Argmin
- [x] Resize: Nearstneighbor, Bilinear
- [x] Reshape, Transpose, Tile, Pad, Slice, DepthToSpace, Concat, Gether
- [x] Scale/BatchNorm
### 性能优化
- 新增ARMv8.6指令支持后,GemmInt8, GemmBF16性能提升
- `smmla`实现的`GemmInt8`实测性能在矩阵规模为`[1024, 1024, 1024]`时,性能相比`sdot`提升为88.47%(s图中`33x33`项),接近理论性能(100%);模型性能提升20%左右。
![smmla1](../_static/images/intro/releases/2_2_0_smmla1.png)
![smmla2](../_static/images/intro/releases/2_2_0_smmla2.png)
- `bfmmla`实现的`GemmBF16`实测性能在规模为`[1024, 1024, 1024]`时,性能相比fp16`fmla`提升为91.53%(图中`1024,1024,1024`项),接近理论性能;模型性能相比原来的bf16提升一倍以上。
![bfmmla1](../_static/images/intro/releases/2_2_0_bfmmla1.png)
![bfmmla2](../_static/images/intro/releases/2_2_0_bfmmla2.png)
- 在执行Mobilenetv1时,NNAPI使用accelerator设备进行推理,在中端和高端设备上相比CPU单线程均有性能优势;在高端设备上相比CPU 4线程仍有性能优势;在其他类模型对比时,除卷积外其他算子较少的模型NNAPI均有优势,包含其他算子的模型会出现性能不如MNN-CPU的情况;在使用`float16`推理时,NNAPI平均性能相比MNN-CPU慢。
![nnapi](../_static/images/intro/releases/2_2_0_nnapi1.png)
![nnapi](../_static/images/intro/releases/2_2_0_nnapi2.png)
- CUDA性能优化,Depthwise卷积、Raster快速计算、Im2Col等优化,MobileNet/Squeezenet等模型性能提升
![cuda](../_static/images/intro/releases/2_2_0_cuda.png)
- 新增BinaryRelu-Fuse和对应的各后端实现,resnet模型性能提升
![bianryrelu](../_static/images/intro/releases/2_2_0_bianryrelu.png)
### 其他
- 进行了部分代码重构(包括但不限于)
- 对于包含多个SubModule的复杂模型, 复用子模型间共性tensor,重新构建计算图和指令队列,显著降低大内存操作的耗时
- 修复了如下 Bug(包括但不限于)
- Onnx Resize 在指定 scale 且输入输出无法整除时,计算错误
- 修复在不支持SSE 4.1的设备上打开SSE执行Crash的问题
- 修复多输入Conv转换错误
- 修复ARM82后端GridSampler在Linux上的编译错误
- 修复Conv1dSqueezeMove在Squeeze双输入时计算出错的问题
- 修复输入为NC4HW4时,stride计算错误的问题
- 修复HIAI后端编译错误,Binary BUG
## 2.1.0
### 框架通用性
- MNN-CV增加`solvepnp / svd`等函数实现
- MNN-Train补充`Unary/Binary/Reduction`的求导实现
Expand Down Expand Up @@ -87,7 +130,7 @@
- BF16 可以给中低端手机和高端机的小核带来性能收益,并且降低内存占用。经MNN团队内部测试,BF16相对于FP32在不同机型的中低端核心(A53 A55 A53kyro A55kyro)上,不同模型有 5%-30%的优化,性能如下:![bf16.png](../_static/images/intro/releases/1_2_0_bf16.png)
- BF16使用方法:
- 编译MNN时,指定`-DMNN_SUPPORT_BF16=ON`
- BackendConfig中指定`PrecisionMode=Precision_Low`
- BackendConfig中指定`PrecisionMode=Precision_Low_BF16`
- 新增CoreML后端
- 基于几何计算,MNN添加了CoreML的支持。在iPhone X之后,借助于Apple Neural Engine,相比于CPU,CoreML(ANE)在视觉模型中约有5-6倍的性能提升。
- 几何计算的演进
Expand Down
2 changes: 1 addition & 1 deletion docs/pymnn/Interpreter.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ Interpreter是MNN V2接口中模型数据的持有者。使用MNN推理时,有
| key | value | 说明 |
|:--------------|:--------|:-----------------|
| backend | `str` or `int` | 可选值:`"CPU"或0`(默认), `"OPENCL"或3`,`"OPENGL"或6`, `"VULKAN"或7`, `"METAL"或1`, `"TRT"或9`, `"CUDA"或2`, `"HIAI"或8` |
| precision | `str` | 可选值:`"normal"`(默认), `"low"`,`"high"` |
| precision | `str` | 可选值:`"normal"`(默认), `"low"`,`"high","lowBF"` |
| numThread | `int` or `long` | `value`为推理线程数,只在 CPU 后端下起作用 |
| saveTensors | `tuple` of `str` | `value`为想要保留成为输出层的`tensorName` |
| inputPaths | `tuple` of `str` | 推理路径的起点,输入`tensorName` |
Expand Down
13 changes: 7 additions & 6 deletions docs/tools/test.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ Model Version: < 2.0.0
- `forwardType:int` 执行推理的计算设备,有效值为:0(CPU)、1(Metal)、2(CUDA)、3(OpenCL)、6(OpenGL),7(Vulkan) ,9 (TensorRT),可选,默认为`0`
- `numberThread:int` 线程数仅对CPU有效,可选,默认为`4`
- `inputSize:str` 输入tensor的大小,输入格式为:`1x3x224x224`,可选,默认使用模型默认输入
- `precision:int` 测试精度,有效输入为:0(Normal), 1(High), 2(Low),可选,默认为`2`
- `precision:int` 测试精度,有效输入为:0(Normal), 1(High), 2(Low), 3(Low_BF16),可选,默认为`2`
### 默认输入与输出
只支持单一输入、单一输出。输入为运行目录下的input_0.txt;输出为推理完成后的第一个输出tensor,转换为文本后,输出到output.txt中。
### 示例
Expand Down Expand Up @@ -71,7 +71,7 @@ Avg= 5.570600 ms, OpSum = 7.059200 ms min= 3.863000 ms, max= 11.596001 ms
- `forwardType:int` 执行推理的计算设备,有效值为:0(CPU)、1(Metal)、2(CUDA)、3(OpenCL)、6(OpenGL),7(Vulkan) ,9 (TensorRT),可选,默认为`0`
- `runLoops:int` 性能测试的循环次数,可选,默认为`0`即不做性能测试
- `numberThread:int` GPU的线程数,可选,默认为`1`
- `precision:int` 测试精度,有效输入为:0(Normal), 1(High), 2(Low),可选,默认为`0`
- `precision:int` 测试精度,有效输入为:0(Normal), 1(High), 2(Low), 3(Low_BF16),可选,默认为`0`
### 默认输出
在当前目录 output 文件夹下,依次打印输出为 0.txt , 1.txt , 2.txt , etc
### 示例
Expand Down Expand Up @@ -172,12 +172,13 @@ Error for a.txt, 0, v1=0.111000
### 功能
模型总耗时,逐层耗时统计和模型运算量估计。**注意:不要用这个工具测非CPU后端的性能,需要的话请用MNNV2Basic工具**
### 参数
`./timeProfile.out model [runLoops forwardType inputSize numberThread]`
`./timeProfile.out model [runLoops forwardType inputSize numberThread precision]`
- `model:str` 模型文件路径
- `runLoops:int` 测试的循环次数,可选,默认为`100`
- `forwardType:int` 执行推理的计算设备,有效值为:0(CPU)、1(Metal)、2(CUDA)、3(OpenCL)、6(OpenGL),7(Vulkan) ,9 (TensorRT),可选,默认为`0`;(当执行推理的计算设备不为 CPU 时,Op平均耗时和耗时占比可能不准)
- `inputSize:str` 输入tensor的大小,输入格式为:`1x3x224x224`,可选,默认使用模型默认输入
- `numberThread:int` 线程数仅对CPU有效,可选,默认为`4`
- `precision:int` 精度仅对CPU有效,可选,默认为`0`
### 输出
- 第一列为 Op类型
- 第二列为 平均耗时
Expand Down Expand Up @@ -222,7 +223,7 @@ main, 138, cost time: 111.161003 ms
- `model:str` 模型文件路径
- `forwardType:int` 执行推理的计算设备,有效值为:0(CPU)、1(Metal)、2(CUDA)、3(OpenCL)、6(OpenGL),7(Vulkan) ,9 (TensorRT),可选,默认为`0`
- `tolerance:float` 误差的绝对阈值,误差大于阈值会认为不一致,可选,默认为`0.05`
- `precision:int` 测试精度,有效输入为:0(Normal), 1(High), 2(Low),可选,默认为`0`
- `precision:int` 测试精度,有效输入为:0(Normal), 1(High), 2(Low), 3(Low_BF16),可选,默认为`0`
- `modeNum:int` 设置GPU的执行模式,可选,默认为`1`
- `stopOp:str` 指定某一层的名称,当执行到该层时停止对比,可选,默认为空
### 示例
Expand Down Expand Up @@ -299,7 +300,7 @@ Correct !
- `model:str` 模型文件路径
- `image:str` 输入图片文件路径
- `forwardType:int` 执行推理的计算设备,有效值为:0(CPU)、1(Metal)、2(CUDA)、3(OpenCL)、6(OpenGL),7(Vulkan) ,9 (TensorRT),可选,默认为`0`
- `precision:int` 测试精度,有效输入为:0(Normal), 1(High), 2(Low),可选,默认为`1`
- `precision:int` 测试精度,有效输入为:0(Normal), 1(High), 2(Low), 3(Low_BF16),可选,默认为`1`
- `label:str` 种类标签文件,imagenet的1000中分类的标签,可选,默认不使用标签,直接输出种类的index
### 示例
```bash
Expand Down Expand Up @@ -345,7 +346,7 @@ Test mobilenet.mnn Correct!
- `output:str` 期望输出数据,`.mnn`格式文件,使用表达式接口存储的数据
- `forwardType:int` 执行推理的计算设备,有效值为:0(CPU)、1(Metal)、2(CUDA)、3(OpenCL)、6(OpenGL),7(Vulkan) ,9 (TensorRT),可选,默认为`0`
- `tolerance:float` 误差的绝对阈值,误差大于阈值会认为不一致,可选,默认为`0.1`
- `precision:int` 测试精度,有效输入为:0(Normal), 1(High), 2(Low),可选,默认为`1`
- `precision:int` 测试精度,有效输入为:0(Normal), 1(High), 2(Low), 3(Low_BF16),可选,默认为`1`
### 示例
```bash
$ ./testModel_expr.out mobilenet.mnn input_0.mnn output.mnn
Expand Down
4 changes: 2 additions & 2 deletions include/MNN/MNNDefine.h
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ MNN_ERROR("Check failed: %s ==> %s\n", #success, #log); \
#define STR_IMP(x) #x
#define STR(x) STR_IMP(x)
#define MNN_VERSION_MAJOR 2
#define MNN_VERSION_MINOR 1
#define MNN_VERSION_PATCH 2
#define MNN_VERSION_MINOR 2
#define MNN_VERSION_PATCH 0
#define MNN_VERSION STR(MNN_VERSION_MAJOR) "." STR(MNN_VERSION_MINOR) "." STR(MNN_VERSION_PATCH)
#endif /* MNNDefine_h */
2 changes: 1 addition & 1 deletion include/MNN/MNNForwardType.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ struct BackendConfig {

PowerMode power = Power_Normal;

enum PrecisionMode { Precision_Normal = 0, Precision_High, Precision_Low };
enum PrecisionMode { Precision_Normal = 0, Precision_High, Precision_Low, Precision_Low_BF16 };

PrecisionMode precision = Precision_Normal;

Expand Down
Loading

0 comments on commit 4634ed8

Please sign in to comment.