模型性能参数

一、pytorch使用stat打印网络的参数量==在PC上

#使用官方的模型
import torch
import torchvision 

#或者测试自己搭建的模型
from model_v2 import MobileNetV2
from model_v3 import mobilenet_v3_small,mobilenet_v3_large
from ptflops import get_model_complexity_info
from model_v1 import MobileNet_V1

# 总的神经网络的参数数量 Params
# 理论上的乘加操作总量 (MAdd)3.5   乘加运算
# 理论上的浮点计算量 FLOPs  每秒所执行的浮点运算次数,表示运算速度。
# 内存的使用量 Memory
from torchstat import stat
#model = torchvision.models.mobilenet_v3_small(pretrained=False)
model = mobilenet_v3_large(num_classes=10)
device=torch.device("cpu")
model.to(device)
stat(model,(3,224,224))
  • 打印效果如下:
    模型性能参数_第1张图片

  • 现在取模型中的某一层卷积层来分析计算的道道。

 self.conv1 = nn.Conv2d(3, 2, kernel_size=7, stride=2, padding=3, bias=False)

【params】
网络主要的参数量
7732=294(WHC_inC_out),因为这里偏置设为False,所有不加上偏置的参数量
【memory】
节点推理时候所需的内存
【Flops】
网络完成的浮点运算。这里计算以输出的Feature map为视角,其中每个元素的计算需要经历
((773)+(773-1))(2502502) = 36625000 ~= 36.62 MFlops
((输出一个元素所经历的乘法次数)+(输出一个元素所经历的加法的个数))
(输出总共的元素的个数)
【MAdd】
网络完成的乘加操作的数量。一次乘加=一次乘法+一次加法,所以可以粗略的认为:Flops ~=2MAdd
(7
73)(2502502) = 18375000 ~= 18.38 MMAdd
【MemRead】
网络运行时,从内存中读取的大小 = 输入的特征图大小 + 网络参数的大小
((5005003) + (7732))4 = 3001176.0
这里乘以4,是因为假设这里的数是float32的,一个float32=4
byte
【MemWrite】
网络运行时,写入到内存中的大小 = 输出的特征图大小
250
25024 = 500000
【MemR+W】
MemR+W = MemRead + MemWrite。在这里等于 3001176.0+500000 = 3501176.0

二、芯片的模型推理衡量参数

1.TOPS(Tera Operations Per Second)每秒万亿次操作 处理器运算能力单位

TOPS是Tera Operations Per Second的缩写,1TOPS代表处理器每秒钟可进行一万亿次(10^12)操作。没有指定数据类型,具体评价算力需要结合数据精度。例如某块芯片算力在INT8的数据格式下1TOPS算力,另外芯片在实际跑模型时也无法达到百分之百 ,百分之五十左右较为正常。

与此对应的还有GOPS(Giga Operations Per Second),MOPS(Million Operation Per Second)算力单位。1GOPS代表处理器每秒钟可进行十亿次(109)操作,1MOPS代表处理器每秒钟可进行一百万次(106)操作。TOPS同GOPS与MOPS可以换算。

在某些情况下,还使用 TOPS/W 来作为评价处理器运算能力的一个性能指标,TOPS/W 用于度量在1W功耗的情况下,处理器能进行多少万亿次操作。

2 TOPS理论值取决于运算精度,MACC的数量和运行频率。

可大致简化为INT8位精度下的MACC(乘加运算 下面有解释)数量在FP16(半浮点数,也就是16位浮点数)精度下等于减少了一半。FP32(浮点数,也就是32位浮点数)再减少一半,依次类推。

假设有512MACC运算单元,运行频率为1GHz,INT8的数据结构和精度,算力为512 x 2(2理解为一个MACC为一次乘法和一次加法 为两次运算操作) x 1 GHz = 1000 Billion Operations/Second = 1 TOPS(Tera-Operations/second)。FP16精度那么就是0.5TOPS,FP32精度就是0.25TOPS。英伟达的Tesla V100有640个Tensor核,每核有64个MAC运算单元,运行频率大约1.480GHz,那么INT8下算力为640 * 64 * 2 * 1.480 GHz=121TOPS。

TOPS仅仅指处理器每秒万亿次操作,需要结合具体数据类型精度才可以于FLOPS转换。

3.FLOPS(floating-point operations per second)每秒所执行的浮点运算次数,表示运算速度。

区别于FLOPs
是“每秒所执行的浮点运算次数”(floating-point operations per second)的缩写。它常被用来估算电脑的执行效能,尤其是在使用到大量浮点运算的科学计算领域中。正因为FLOPS字尾的那个S,代表秒,而不是复数,所以不能省略掉。

在这里所谓的“浮点运算”,实际上包括了所有涉及小数的运算。这类运算在某类应用软件中常常出现,而它们也比整数运算更花时间。现今大部分的处理器中,都有一个专门用来处理浮点运算的“浮点运算器”(FPU)。也因此FLOPS所量测的,实际上就是FPU的执行速度。而最常用来测量FLOPS的基准程式(benchmark)之一,就是Linpack。

FLOPS换算
一个MFLOPS(megaFLOPS)等于每秒一百万(=10^6)次的浮点运算,

一个GFLOPS(gigaFLOPS)等于每秒十亿(=10^9)次的浮点运算,

一个TFLOPS(teraFLOPS)等于每秒一万亿(=10^12)次的浮点运算,

一个PFLOPS(petaFLOPS)等于每秒一千万亿(=10^15)次的浮点运算。

4.FLOPs(FLoating point OPerations(s表复数))浮点运算次数,表示运算量,区别于FLOPS。

这个参数常用来评价深度学习的模型的运算量,如果已知模型FLOPs可通过换算求的某个已知参数的芯片运行一遍模型的时间。

例如INT8 1TOPS算力的芯片 1TFLPs的模型 假设芯片效率百分之百 运行一遍 需要4秒 因为1TFLPs单位是FP32

意指浮点运算数,理解为计算量。可以用来衡量模型的复杂度。针对神经网络模型的复杂度评价,应指的是FLOPs,而非FLOPS。FLOPS意指每秒浮点运算次数,理解为计算速度。

FLOPs描述了数据过一遍这么复杂的网络需要多大的计算量,即使用该模型时所需的计算力总量。

MAC(Memory Access Cost)内存访问成本
MAC描述了这个复杂的网络到底需要多少参数才能定义它,即存储该模型所需的存储空间。

例如某个模型需要256000个浮点参数定义,转化为bit 乘以32得8192000bit,再除8转化为Byte,1024KB,也就是1M,那么这个模型大小约为1M。

5、MADDs、MACCs(multiply-accumulate operations(s表复数))

MADDs、MACCs同一个意思。

表示乘加运算:b乘c 加上a重新赋值于a 为一次MACC指令 两次OP 1MACC ≈ 2OP

乘加运算是模型运算里的基本单元,矩阵的运算基本都是乘加。

参考链接:https://blog.csdn.net/magic_ll/article/details/122133532

你可能感兴趣的:(深度学习笔记篇,深度学习,神经网络,pytorch)