s
小写,是Floating Point Operations的缩写(s表复数),指浮点运算数,理解计算量。可以用来衡量算法/模型的复杂度。这里硬件主要是指CPU和GPU, 计算机的计算能力主要依靠这两类硬件的支持, 下面以本地开发机的例子说明一下如何计算CPU和GPU的FLOPS。
处理器核数和主频都能用 lscpu
查到.
但是每周期服点运算次数要根据CPU支持的指令集来看
查一下机器的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
首先通过nvidia-smi -L
查询显卡型号, 可以看出这个T4的卡.
(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/
一般采用的度量方式是模型推断时浮点运算的次数 ( FLOPs
),即模型理论计算量。
这是间接一个衡量模型时间复杂度的指标, 实际上我们真正关心的是模型的速度(时延)。
而且同一FLOPs 在不同的平台或者MAC以及网络并行度下, 模型的速度也可能不一样。
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()
使用方法:
## 指定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)
模型的参数量是指模型含有多少参数,直接决定模型的大小,也影响推断时对内存的占用量,单位通常为 M
。由于模型的参数大都用float类型, 所以模型大小一般是参
数量的4倍, 这也是我们经常在论文中看到有人直接用模型大小表示模型的复杂度进行对比的原因.
模型参数量的分析是为了了解内存占用情况,内存带宽其实比 FLOPs
更重要, 目前的计算机结构下,单次内存访问比单次运算慢得多的多,
所以一般用内存访问次数(也叫 MAes)来衡量模型的空间复杂度。
# 直接使用summary参考参数量
model.summary()
《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 删除。