前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >模型复杂度衡量方案

模型复杂度衡量方案

原创
作者头像
Johns
修改2022-06-30 10:23:18
2K0
修改2022-06-30 10:23:18
举报
文章被收录于专栏:代码工具代码工具

1. 基本概念

  • FLOPS:注意全大写,是floating point operations per second的缩写,指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。
  • MFLOPS(megaFLOPS):等于每秒一佰万(=10^6)次的浮点运算。
  • GFLOPS(gigaFLOPS):等于每秒拾亿(=10^9)次的浮点运算。
  • TFLOPS(teraFLOPS):等于每秒万亿(=10^12)次的浮点运算。
  • PFLOPS(petaFLOPS):等于每秒千万亿(=10^15)次的浮点运算。
  • EFLOPS(exaFLOPS):等于每秒百亿亿(=10^18)次的浮点运算。
  • FLOPs:注意 s 小写,是Floating Point Operations的缩写(s表复数),指浮点运算数,理解计算量。可以用来衡量算法/模型的复杂度。
  • MACs:是乘加运算(Multiplication and Accumulation)的缩写,相当于2次浮点运算,硬件支持乘加指令可加快计算速度。 一般地可以认为 MACs=2FLOPs。
  • MAes:是内存访问次数(memory accesse)的简称。 一般地, 模型的复杂度主要是由模型的计算量(时间/计算复杂度)模型的参数量(空间复杂度)共同决定的。

2. 硬件的FLOPS

这里硬件主要是指CPU和GPU, 计算机的计算能力主要依靠这两类硬件的支持, 下面以本地开发机的例子说明一下如何计算CPU和GPU的FLOPS。

2.1 计算CPU的FLOPS

处理器核数和主频都能用 lscpu 查到.

但是每周期服点运算次数要根据CPU支持的指令集来看

image.png
image.png

查一下机器的CVM规格: 云服务器实例规格CPU处理器参数详解 – 腾讯云,

我的机器CVM是S5的规格, 这个规格的机器支持AVX-512指令集,

然后通过intel官方查到处理器系列的AVX-512 FMA Units是2,这个意思是可以单个CPU周期可以同时执行2条512bit 加法和2条512bit 乘法。

通过下面的公式:

CPU单周期双精度浮点计算能力=2(FMA数量)*2(同时加法和乘法)*512/64(双精度)

CPU单周期双精度浮点计算能力=2(FMA数量)*2(同时加法和乘法)*512/32(单精度)

求得:

单精度下每周期浮点运算次数=512*2*2/32=64

双精度下每周期浮点运算次数=512*2*2/64=32

故:

单精度机器FLOAS =102.5G64=1600GFLOPS = 1.6 TFLOPS

双精度机器FLOAS =102.5G32=1600GFLOPS = 0.8 TFLOPS

2.2 计算GPU的FLOPS

首先通过nvidia-smi -L 查询显卡型号, 可以看出这个T4的卡.

代码语言:shell
复制
 (base) [root@VM-117-232-centos ~]# nvidia-smi -L
  GPU 0: GRID T4-8C (UUID: GPU-29c3d783-7771-11ec-9551-44a4bb577152)

然后到官网查一下这个卡的性能情况: https://www.nvidia.com/en-us/data-center/tesla-t4/

image.png
image.png

3. 模型的计算量

一般采用的度量方式是模型推断时浮点运算的次数 ( FLOPs ),即模型理论计算量。

这是间接一个衡量模型时间复杂度的指标, 实际上我们真正关心的是模型的速度(时延)。

而且同一FLOPs 在不同的平台或者MAC以及网络并行度下, 模型的速度也可能不一样。

  • 不同框架下Flops工具支持情况: | 框架 | 工具名称| 特点| | :--- | :--- | :---| | tensorflow1.x | profiler | 同时包括FLOPS统计和参数量统计, 但是主要针对的是keras模型| | tensorflow2.x | 不支持, 目前可以使用tf1.x的profiler | 同上 | | pytorch| thop或者ptflops或者OpCounter | 使用简单, 同时包括FLOPS统计和参数量统计 |
  • Tensorflow 2.x目前还没有直接支持Flops计算的特性, 我们只能使用tensorflow1.x的api来统计.
image.png
image.png
代码语言:python
复制
import tensorflow as tf
from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2_as_graph
from argparse import ArgumentParser

def get_flops(model):
    concrete = tf.function(lambda inputs: model(inputs))
    concrete_func = concrete.get_concrete_function(
        [tf.TensorSpec([1, *inputs.shape[1:]]) for inputs in model.inputs])
    frozen_func, graph_def = convert_variables_to_constants_v2_as_graph(concrete_func)
    with tf.Graph().as_default() as graph:
        tf.graph_util.import_graph_def(graph_def, name='')
        run_meta = tf.compat.v1.RunMetadata()
        opts = tf.compat.v1.profiler.ProfileOptionBuilder.float_operation()
        flops_stat = tf.compat.v1.profiler.profile(graph=graph, run_meta=run_meta, cmd="op", options=opts, )
        return flops_stat.total_float_ops


class flops_analysis(object):
    def __init__(self):
        arg_parser = ArgumentParser(description='Parse args')

        arg_parser.add_argument('--model_path',
                                help='Specify the saved_model path',
                                type=str,
                                dest='model_path')
        self.args = arg_parser.parse_args()

    def run(self):
        model = tf.keras.models.load_model(self.args.model_path)
        flops = get_flops(model)
        print("The FLOPs is:{}".format(flops), flush=True)


if __name__ == '__main__':
    flops_analysis = flops_analysis()
    flops_analysis.run()

使用方法:

代码语言:python
复制
## 指定saved_model地址
model = tf.keras.models.load_model("/Users/guirong/go/src/dcn3_bt_2/models_new/trained/origin_model/")
flops = get_flops(model)
print("The FLOPs is:{}".format(flops), flush=True)

4. 模型的参数量

模型的参数量是指模型含有多少参数,直接决定模型的大小,也影响推断时对内存的占用量,单位通常为 M 。由于模型的参数大都用float类型, 所以模型大小一般是参

数量的4倍, 这也是我们经常在论文中看到有人直接用模型大小表示模型的复杂度进行对比的原因.

模型参数量的分析是为了了解内存占用情况,内存带宽其实比 FLOPs 更重要, 目前的计算机结构下,单次内存访问比单次运算慢得多的多,

所以一般用内存访问次数(也叫 MAes)来衡量模型的空间复杂度。

代码语言:txt
复制
# 直接使用summary参考参数量
model.summary()

5. 参考链接

《TF 2.0 Feature: Flops calculation》: https://github.com/tensorflow/tensorflow/issues/32809#issuecomment-780983302

《Tensorflow Profiler使用指引》:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/core/profiler/g3doc/profile_model_architecture.md

《TensorFlow Model Analysis》: https://www.tensorflow.org/tfx/guide/tfma

《Roofline Model与深度学习模型的性能分析》:https://zhuanlan.zhihu.com/p/34204282

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 基本概念
  • 2. 硬件的FLOPS
    • 2.1 计算CPU的FLOPS
      • 2.2 计算GPU的FLOPS
      • 3. 模型的计算量
      • 4. 模型的参数量
      • 5. 参考链接
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档