计算模型的计算量,参数量,访存量

一、计算量

        计算量是模型所需的计算次数,反映了模型对硬件计算单元的需求。计算量一般用 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说的是 :模型在一个计算平台的限制下,到底能达到多快的浮点计算速度。更具体的来说,Roof-line Model 解决的,是“计算量为A且访存量为B的模型在算力为C且带宽为D的计算平台所能达到的理论性能上限E是多少”这个问题。

本文参考了:深度学习模型大小与模型推理速度的探讨 - 知乎 (zhihu.com)

猜你喜欢

转载自blog.csdn.net/qq_42019881/article/details/130843952