#使用官方的模型
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))
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
(773)(2502502) = 18375000 ~= 18.38 MMAdd
【MemRead】
网络运行时,从内存中读取的大小 = 输入的特征图大小 + 网络参数的大小
((5005003) + (7732))4 = 3001176.0
这里乘以4,是因为假设这里的数是float32的,一个float32=4byte
【MemWrite】
网络运行时,写入到内存中的大小 = 输出的特征图大小
25025024 = 500000
【MemR+W】
MemR+W = MemRead + MemWrite。在这里等于 3001176.0+500000 = 3501176.0
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功耗的情况下,处理器能进行多少万亿次操作。
可大致简化为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转换。
区别于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)次的浮点运算。
这个参数常用来评价深度学习的模型的运算量,如果已知模型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。
MADDs、MACCs同一个意思。
表示乘加运算:b乘c 加上a重新赋值于a 为一次MACC指令 两次OP 1MACC ≈ 2OP
乘加运算是模型运算里的基本单元,矩阵的运算基本都是乘加。
参考链接:https://blog.csdn.net/magic_ll/article/details/122133532