10.1.3.9. 计算量工具

10.1.3.9.1. 计算量的定义

计算量是用来评估神经网络大小的常用工具。在常见的计算量工具中一般只统计两种操作的计算量,一个是卷积相关,另一个是全连接相关的。这两种都是和乘加计算相关的。

以常见的 torch.nn.Conv2d 为例,输入数据的形状为 bs * c_in * w_in * h_in ,输出数据的形状为 bs * c_out * w_out * h_out ,卷积核的大小为 f 。则该 Conv2d 的计算量为 2 * bs * f * f * c_in * c_out * w_out * h_out2 表示加法计算量和乘法计算量各一半。

torch.nn.Linear 的情况里,输入数据的神经元个数为 c_in ,输出数据的神经元个数为 c_out 。其实这种全连接层可以作为一个特殊的卷积层,输入输出的大小均为 1x1 ,卷积核大小也是 1x1 。则全连接层的计算量为 bs * (c_in * c_out + c_out) ,需要注意是这里乘法和加法的计算量并不完全一致。

注意

量化模型和QAT模型和对应的浮点模型的计算量是完全一致的。

10.1.3.9.2. 计算量工具的使用方法

目前计算量工具支持统计计算量的op有三种,分别为torch.nn.Conv2dtorch.nn.Linear 以及 torch.nn.ConvTranspose2d

python3 tools/calops.py --config ${CONFIG_PATH} --method hook/fx

其中 config 中影响计算量的主要key是 test_model (或者 model ),以及 test_inputsmodel 相关的决定了计算量工具需要检查的模型,而 test_inputs 决定了输入的大小,除此之外,输入形状还可以通过 --input-shape B,C,H,W 的输入参数决定。

这里需要注意的是,其实计算量工具也可以支持matmul,使用方法是–method的时候选择fx。不过这个方法要求模型本身能够支持fx才可以。

10.1.3.9.3. 常见分类模型的计算量(输入大小为1x3x224x224

network

OPS(G)

mobilenetv1 (alpha=1.0)

0.57

mobilenetv2 (alpha=1.0)

0.31

resnet18

1.81

resnet50

3.86

vargnetv2

0.36

efficientnetb0

0.39

10.1.3.9.4. 说明

一般有两种情况使用calops会出现结果不对或者计算错误。

  1. 使用hook的method,但模型含有matmul或者其他明确不覆盖的算子。

  2. 使用fx的method,但模型本身不支持fx,或者含有其他明确不覆盖的算子。