赞
踩
计算量是模型所需的计算次数,反映了模型对硬件计算单元的需求。计算量一般用 OPs (Operations) ,即计算次数来表示。由于最常用的数据格式为 float32,因此也常常被写作 FLOPs (Floating Point Operations),即浮点计算次数。PyTorch 有不少工具可以模型计算量,但需要注意的是这些工具有可能会遗漏一些算子的计算量,将其计算量算成 0,从而导致统计的计算量跟实际计算量有轻微的偏差,不过大多数情况下这些偏差影响不大。
以下是我常用的一个Pytorch工具:
- from ptflops.flops_counter import get_model_complexity_info
-
- flops, params = get_model_complexity_info(model, (1, 32000), print_per_layer_stat=False)
- print("%s %s" % (flops, params))
参数量是模型中的参数的总和,跟模型在磁盘中所需的空间大小直接相关。对于 CNN 来说参数主要由 Conv/FC 层的 Weight 构成,当然其他的一些算子也有参数,不过一般忽略不计了。参数量往往是被算作访存量的一部分,因此参数量不直接影响模型推理性能。但是参数量一方面会影响内存占用,另一方面也会影响程序初始化的时间。
以下是我常用的计算模型参数量的代码(当然上述代码已经包含了计算模型参数量):
- def numParams(net):
- num = 0
- for param in net.parameters():
- if param.requires_grad:
- num += int(np.prod(param.size()))
- return num
- print(numParams(model))
访存量是指模型计算时所需访问存储单元的字节大小,反映了模型对存储单元带宽的需求。也可以说是输入单个样本,模型完成一次前向传播过程中所发生的内存交换总量,也即模型的空间复杂度。访存量一般用 Bytes(或者 KB/MB/GB)来表示,即模型计算到底需要存/取多少 Bytes 的数据。和计算量一样,模型整体访存量等于模型各个算子的访存量之和。访存量对模型的推理速度至关重要,设计模型时需要予以关注。
由计算量除以访存量就可以得到模型的计算强度,它表示此模型在计算过程中,每Byte内存交换到底用于进行多少次浮点运算。单位是FLOPs/Byte。可以看出,模计算强度越大,其内存使用效率越高。
计算量和实际的推理速度之间没有直接的因果关系。计算量仅能作为模型推理速度的一个参考依据。
我们跑模型最关心的指标,其实是模型在计算平台上(服务器上)所能达到的每秒浮点运算次数(理论值)。单位是 FLOPS or FLOP/s。
Roof-line Model说的是 :模型在一个计算平台的限制下,到底能达到多快的浮点计算速度。更具体的来说,Roof-line Model 解决的,是“计算量为A且访存量为B的模型在算力为C且带宽为D的计算平台所能达到的理论性能上限E是多少”这个问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。