Skip to content

Commit

Permalink
Add MACC utilization calculation formula
Browse files Browse the repository at this point in the history
  • Loading branch information
HarleysZhang committed Oct 26, 2020
1 parent 5d4d627 commit f5def78
Show file tree
Hide file tree
Showing 6 changed files with 72 additions and 43 deletions.
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
## 前言
本仓库的知识点和文章主要用于个人复习和作知识点总结使用,部分内容参考自`github项目/网络资料/书籍`[个人博客](https://www.armcv.cn/)等,由于时间和能力有限,有些知识点其实掌握得还不够深和全面, 我推荐额外阅读以下 `github` 仓库项目(有些已经停止更新, 当作参考)

+ [Algorithm_Interview_Notes-Chinese](https://github.com/imhuay/Algorithm_Interview_Notes-Chinese)
+ [关于Python的面试题](https://github.com/taizilongxu/interview_python)
+ [CS-Notes](https://github.com/CyC2018/CS-Notes)
+ [用动画的形式呈现解LeetCode题目的思路](https://github.com/MisterBooo/LeetCodeAnimation)


## 算法/图像/CS基础/编程语言(`RoadMap`)

+ [计算机基础](https://github.com/HarleysZhang/2019_algorithm_intern_information/tree/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80)
+ [数据结构与算法](https://github.com/HarleysZhang/2019_algorithm_intern_information/tree/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95)
+ [数字图像处理](https://github.com/HarleysZhang/2019_algorithm_intern_information/tree/master/%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86)
Expand All @@ -16,6 +17,7 @@
+ [计算机视觉](https://github.com/HarleysZhang/2019_algorithm_intern_information/tree/master/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89)

## 2020春招算法实习岗位表

2020 年春招近期实习岗位汇总,还有待完善,持续更新,也希望各位一起更新。
注意:大部分岗位都是面向 2021 年毕业的学生。

Expand Down Expand Up @@ -58,6 +60,7 @@
## [深度学习面试题](https://github.com/HarleysZhang/2019_algorithm_intern_information/blob/master/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E9%9D%A2%E8%AF%95%E9%A2%98.md)

## 2020年校招可投递公司-计算机视觉/机器学习算法工程师

侧重于于计算机视觉/图像/机器学习算法工程师岗位,公司排名几乎部分先后。

|神级公司|互联网公司|AI独角兽公司|其他大公司|是否投递|
Expand Down Expand Up @@ -97,4 +100,3 @@
||巨人网络/盛大游戏|酷家乐|华米/绿米||
||最右/快看漫画|码隆科技|||
||猫眼娱乐/多牛传媒||||

Binary file added images/C++ Primer学习笔记.png
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 images/算力利用率计算公式.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
53 changes: 40 additions & 13 deletions 深度学习/神经网络模型复杂度分析.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
## 目录结构
# 目录结构

## 一,模型计算量分析

> 终端设备上运行深度学习算法需要考虑内存和算力的需求,因此需要进行模型复杂度分析,涉及到模型计算量(时间复杂度)和模型参数量(空间复杂度)分析。模型理论计算量:指模型推断时需要多少计算次数。
+ `FLOPs`:floating point operations 指的是浮点运算次数,**理解为计算量**,可以用来衡量算法/模型时间的复杂度。
+ `FLOPS`:(全部大写),Floating-point Operations Per Second,每秒所执行的浮点运算次数,理解为计算速度,是一个衡量硬件性能/模型速度的指标。
+ `MACCs`:multiply-accumulate operations,乘-加操作次数,`MACCs` 大约是 FLOPs 的一半。将 $w[0]*x[0] + ...$ 视为一个乘法累加或 `1``MACC`

> 注意,网上很多文章将 MACCs 与 MACC 概念搞混,我猜测可能是机器翻译英文文章不准确的缘故,可以参考此[链接](http://machinethink.net/blog/how-fast-is-my-model/)了解更多。
### 卷积层FLOPs计算

> 卷积操作本质上是个线性运算
+ $FLOPs=(2\times C_i\times K^2-1)\times H\times W\times C_o$(不考虑bias)
Expand All @@ -28,42 +31,66 @@
所以卷积层的 $FLOPs=(2\times C_{i}\times K^2-1)\times H\times W\times C_o$ ($C_i$ 为输入特征图通道数,$K$ 为过滤器尺寸,$H, W, C_o$为输出特征图的高,宽和通道数)。

### 全连接层的 FLOPs 计算

全连接层的 $FLOPs = (2I − 1)O$,$I$ 是输入层的维度,$O$ 是输出层的维度。

## 二,模型参数量分析

> 模型参数数量(params):指模型含有多少参数,直接决定模型的大小,也影响推断时对内存的占用量。
模型参数量的分析是为了了解内存占用情况,内存带宽其实比 `FLOPs` 更重要。目前的计算机结构下,单次内存访问比单次运算慢得多的多。对每一层网络,端侧设备需要:

+ 从主内存中读取输入向量 / `feature map`
+ 从主内存中读取权重并计算点积;
+ 将输出向量或 `feature map` 写回主内存。

`MAes`:memory accesse,内存访问次数。

### 卷积层参数量

卷积层权重参数量 = $C_i\times K^2\times C_o + C_o$。$C_i$ 为输入特征图通道数,$K$ 为过滤器(卷积核)尺寸,$C_o$ 为输出的特征图的 `channel` 数(也是 `filter` 的数量),算式第二项是偏置项的参数量 。(一般不写偏置项,偏置项对总参数量的数量级的影响可以忽略不记,这里为了准确起见,把偏置项的参数量也考虑进来。)

假设输入层矩阵维度是 96×96×3,第一层卷积层使用尺寸为 5×5、深度为 16 的过滤器(卷积核尺寸为 5×5、卷积核数量为 16),那么这层卷积层的参数个数为 5×5×3×16+16=1216个。

### BN层参数量

`BN` 层参数量 = $2\times C_i$。其中 $C_i$ 为输入的 `channel` 数(BN层有两个需要学习的参数,平移因子和缩放因子)

### 全连接层参数量

全连接层参数量 = $T_i\times T_o + T_O$。$T_i$ 为输入向量的长度, $T_o$ 为输出向量的长度,公式的第二项为偏置项参数量。(目前全连接层已经逐渐被 `Global Average Pooling` 层取代了。) 注意,全连接层的权重参数量(内存占用)远远大于卷积层。
### 参考资料
+ [PRUNING CONVOLUTIONAL NEURAL NETWORKS
FOR RESOURCE EFFICIENT INFERENCE
](https://arxiv.org/pdf/1611.06440.pdf)
+ [神经网络参数量的计算:以UNet为例](https://zhuanlan.zhihu.com/p/57437131)
+ [How fast is my model?](http://machinethink.net/blog/how-fast-is-my-model/)
+ [MobileNetV1 & MobileNetV2 简介](https://blog.csdn.net/mzpmzk/article/details/82976871)
## 双精度、单精度和半精度

## 三,一些概念

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

`CPU/GPU` 的浮点计算能力得区分不同精度的浮点数,分为双精度 `FP64`、单精度 `FP32` 和半精度 `FP16`。因为采用不同位数的浮点数的表达精度不一样,所以造成的计算误差也不一样,对于需要处理的数字范围大而且需要精确计算的科学计算来说,就要求采用双精度浮点数,而对于常见的多媒体和图形处理计算,`32` 位的单精度浮点计算已经足够了,对于要求精度更低的机器学习等一些应用来说,半精度 `16` 位浮点数就可以甚至 `8` 位浮点数就已经够用了。
对于浮点计算来说, `CPU` 可以同时支持不同精度的浮点运算,但在 `GPU` 里针对单精度和双精度就需要各自独立的计算单元。
### 参考资料
[双精度,单精度和半精度](https://blog.csdn.net/sinat_24143931/article/details/78557852?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase)
## 浮点计算能力

### 浮点计算能力

`FLOPS`:每秒浮点运算次数,每秒所执行的浮点运算次数,浮点运算包括了所有涉及小数的运算,比整数运算更费时间。下面几个是表示浮点运算能力的单位。

+ `MFLOPS`(megaFLOPS):等于每秒一佰万(=10^6)次的浮点运算。
+ `GFLOPS`(gigaFLOPS):等于每秒拾亿(=10^9)次的浮点运算。
+ `TFLOPS`(teraFLOPS):等于每秒万亿(=10^12)次的浮点运算。
+ `PFLOPS`(petaFLOPS):等于每秒千万亿(=10^15)次的浮点运算。
+ `EFLOPS`(exaFLOPS):等于每秒百亿亿(=10^18)次的浮点运算。
+ `EFLOPS`(exaFLOPS):等于每秒百亿亿(=10^18)次的浮点运算。

### 利用率(Utilization matters)

在这种情况下,利用率(Utilization)是可以有效地用于实际工作负载的芯片的原始计算能力的百分比。深度学习和神经网络使用相对数量较少的计算原语(computational primitives),而这些数量很少的计算原语却占用了大部分计算时间。矩阵乘法(MM)和转置是基本操作。MM由乘法累加(MAC)操作组成。OPs/s(每秒完成操作的数量)指标通过每秒可以完成多少个MAC(每次乘法和累加各被认为是1个operation,因此MAC实际上是2个OP)得到。所以我们可以将利用率定义为实际使用的运算能力和原始运算能力的比值:

![算力利用率公式](../images/算力利用率计算公式.png)
$$ utilization = \frac {used Ops/s}{raw OPs/s}$$

## 四,参考资料

+ [PRUNING CONVOLUTIONAL NEURAL NETWORKS
FOR RESOURCE EFFICIENT INFERENCE
](https://arxiv.org/pdf/1611.06440.pdf)
+ [神经网络参数量的计算:以UNet为例](https://zhuanlan.zhihu.com/p/57437131)
+ [How fast is my model?](http://machinethink.net/blog/how-fast-is-my-model/)
+ [MobileNetV1 & MobileNetV2 简介](https://blog.csdn.net/mzpmzk/article/details/82976871)
+ [双精度,单精度和半精度](https://blog.csdn.net/sinat_24143931/article/details/78557852?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase)
+ [AI硬件的Computational Capacity详解](https://zhuanlan.zhihu.com/p/27836831)
29 changes: 5 additions & 24 deletions 编程语言/C++ Primer学习笔记.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,18 +33,13 @@

- 3.1 命名空间的using声明
- 3.2 标准库类型 string

- string表示可变长字符序列
- 定义和初始化string

- string s1 = "value":一般初始化方式
- string s2: 默认初始化
- string s3(n, 'c'):把 s3 初始化为连续 n 个字符 c 组成的串

- string的操作

- 输入输出字符串

- string s1 = "hello world"
cout << s1 << endl; //输出s1字符串(打印hello world)
- string s1, s2;
Expand Down Expand Up @@ -86,36 +81,24 @@ cin >> s1 >> s2; //把第一个输入读取到s1中,第二个读取到s2中

### 第9章 顺序容器

- 9.1 顺序容器概述

- 容器定义

[嵌入式视觉](https://www.armcv.cn)
- 9.1 顺序容器概述
- 容器定义
- 一个容器就是一些特定类型对象的集合,顺序容器为程序员提供控制元素存储和访问顺序的能力

- 顺序容器类型

- vector

- 可变大小数组

- deque

- 双端队列

- list

- 双向链表

- forward_list

- 单向链表

- array

- 固定大小数组

- string

- 与 vector 相似的容器,但专门用于保存字符。

- 如何选择顺序容器类型
Expand Down Expand Up @@ -179,10 +162,8 @@ cin >> s1 >> s2; //把第一个输入读取到s1中,第二个读取到s2中

- 面向对象程序设计(object-oriented programming)的核心思想是数据抽象、继承和动态绑定。
- 继承

- 通过继承联系在一起的类构成一种层次关系。
- 派生类定义实例:
class Bulk_quote: public Quote{...}
- 通过继承联系在一起的类构成一种层次关系。
- 派生类定义实例:class Bulk_quote: public Quote{...}
- 每个基类前都可以有访问说明符,其作用是控制派生类从基类继承而来的成员是否对派生类可见。

- 动态绑定:
Expand Down
Loading

0 comments on commit f5def78

Please sign in to comment.