Skip to content

Commit

Permalink
[Doc]: add mac compute way
Browse files Browse the repository at this point in the history
  • Loading branch information
HarleysZhang committed Nov 24, 2022
1 parent de23ea5 commit 575b1ac
Showing 1 changed file with 36 additions and 6 deletions.
42 changes: 36 additions & 6 deletions 9-model_deploy/B-神经网络模型复杂度分析.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,19 @@
# 目录结构
- [前言](#前言)
- [一,模型计算量分析](#一模型计算量分析)
- [卷积层FLOPs计算](#卷积层flops计算)
- [全连接层的 FLOPs 计算](#全连接层的-flops-计算)
- [二,模型参数量分析](#二模型参数量分析)
- [卷积层参数量](#卷积层参数量)
- [BN层参数量](#bn层参数量)
- [全连接层参数量](#全连接层参数量)
- [模型内存访问代价计算](#模型内存访问代价计算)
- [卷积层 MAC 计算](#卷积层-mac-计算)
- [四,一些概念](#四一些概念)
- [双精度、单精度和半精度](#双精度单精度和半精度)
- [浮点计算能力](#浮点计算能力)
- [硬件利用率(Utilization)](#硬件利用率utilization)
- [四,参考资料](#四参考资料)

* [一,模型计算量分析](#一,模型计算量分析)
* [二,模型参数量分析](#二,模型参数量分析)
* [三,一些概念](#三,一些概念)
* [四,参考资料](#四,参考资料)

## 前言

Expand Down Expand Up @@ -114,7 +124,27 @@ $C_i$ 为输入特征图通道数,$K$ 为过滤器(卷积核)尺寸,$C_o$

$T_i$ 为输入向量的长度, $T_o$ 为输出向量的长度,公式的第二项为偏置项参数量。(目前全连接层已经逐渐被 `Global Average Pooling` 层取代了。) 注意,全连接层的权重参数量(内存占用)远远大于卷积层。

## 三,一些概念
## 模型内存访问代价计算

`MAC`(`memory access cost`) 内存访问代价也叫内存使用量,指的是输入单个样本(一张图像),模型/卷积层完成一次前向传播所发生的内存交换总量,即模型的空间复杂度,单位是 `Byte`

`CNN` 网络中每个网络层 `MAC` 的计算分为读输入 `feature map` 大小(`DDR` 读)、权重大小(`DDR` 读)和写输出 `feature map` 大小(`DDR` 写)三部分。

### 卷积层 MAC 计算
以卷积层为例计算 `MAC`,可假设某个卷积层输入 `feature map` 大小是 (`Cin, Hin, Win`),输出 `feature map` 大小是 (`Hout, Wout, Cout`),卷积核是 (`Cout, Cin, K, K`),理论 MAC(理论 MAC 一般小于 实际 MAC)计算公式如下:

```python
# 端侧推理IN8量化后模型,单位一般为 1 byte
input = Hin x Win x Cin # 输入 feature map 大小
output = Hout x Wout x Cout # 输出 feature map 大小
weights = K x K x Cin x Cout + bias # bias 是卷积层偏置
ddr_read = input + weights
ddr_write = output
MAC = ddr_read + ddr_write
```
> `feature map` 大小一般表示为 (`N, C, H, W`),`MAC` 指标一般用在端侧模型推理中,端侧模型推理模式一般都是单帧图像进行推理,即 `N = 1(batch_size = 1)`,不同于模型训练时的 `batch_size` 大小一般大于 1。
## 四,一些概念

### 双精度、单精度和半精度

Expand Down

0 comments on commit 575b1ac

Please sign in to comment.