gpt4 book ai didi

tensorflow - 如何计算 tensorflow 中tfprof的触发器?

转载 作者:行者123 更新时间:2023-12-03 00:36:58 26 4
gpt4 key购买 nike

我如何从tfprof获取flops的数量,我的代码如下:

def calculate_flops():
# Print to stdout an analysis of the number of floating point operations in the
# model broken down by individual operations.
param_stats = tf.contrib.tfprof.model_analyzer.print_model_analysis(
tf.get_default_graph(),
tfprof_options=tf.contrib.tfprof.model_analyzer.
TRAINABLE_VARS_PARAMS_STAT_OPTIONS)
print(param_stats)

但结果显示flops = 0。我如何计算失败次数。我可以举个例子吗?

最佳答案

首先,截至目前,tfprof.model_analyzer.print_model_analysis已弃用并且 tf.profiler.profile应根据官方文档使用。

鉴于我们知道 FLOP 的数量,我们可以通过测量前向传递的运行时间并除以FLOP/run_time来获得前向传递的FLOPS(每秒FLOP)

让我们举一个简单的例子。

g = tf.Graph()
sess = tf.Session(graph=g)
with g.as_default():
A = tf.Variable(initial_value=tf.random_normal([25, 16]))
B = tf.Variable(initial_value=tf.random_normal([16, 9]))
C = tf.matmul(A,B, name='output')
sess.run(tf.global_variables_initializer())
flops = tf.profiler.profile(g, options=tf.profiler.ProfileOptionBuilder.float_operation())
print('FLOP = ', flops.total_float_ops)

输出8288 。但为什么我们会得到 8288而不是预期结果 7200=2*25*16*9 [a]?答案就在张量 A 的方式中和B已初始化。使用高斯分布进行初始化会导致一些失败。更改 A 的定义和B通过

    A = tf.Variable(initial_value=tf.zeros([25, 16]))
B = tf.Variable(initial_value=tf.zeros([16, 9]))

给出预期输出7200 .

通常,网络的变量在其他方案中使用高斯分布进行初始化。大多数时候,我们对初始化 FLOP 不感兴趣,因为它们在初始化期间完成一次,并且在训练或推理期间不会发生。那么,如何在不考虑初始化 FLOP 的情况下获得确切的 FLOP 数量

使用 pb 卡住图表 .

以下代码片段说明了这一点:

import tensorflow as tf
from tensorflow.python.framework import graph_util

def load_pb(pb):
with tf.gfile.GFile(pb, "rb") as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
with tf.Graph().as_default() as graph:
tf.import_graph_def(graph_def, name='')
return graph

# ***** (1) Create Graph *****
g = tf.Graph()
sess = tf.Session(graph=g)
with g.as_default():
A = tf.Variable(initial_value=tf.random_normal([25, 16]))
B = tf.Variable(initial_value=tf.random_normal([16, 9]))
C = tf.matmul(A, B, name='output')
sess.run(tf.global_variables_initializer())
flops = tf.profiler.profile(g, options = tf.profiler.ProfileOptionBuilder.float_operation())
print('FLOP before freezing', flops.total_float_ops)
# *****************************

# ***** (2) freeze graph *****
output_graph_def = graph_util.convert_variables_to_constants(sess, g.as_graph_def(), ['output'])

with tf.gfile.GFile('graph.pb', "wb") as f:
f.write(output_graph_def.SerializeToString())
# *****************************


# ***** (3) Load frozen graph *****
g2 = load_pb('./graph.pb')
with g2.as_default():
flops = tf.profiler.profile(g2, options = tf.profiler.ProfileOptionBuilder.float_operation())
print('FLOP after freezing', flops.total_float_ops)

输出

FLOP before freezing 8288
FLOP after freezing 7200
<小时/>

[a] 对于乘积 AB,矩阵乘法的 FLOP 通常为 mq(2p -1),其中 A[m, p]B[p, q]但 TensorFlow 由于某种原因返回 2mpq。安issue已打开了解原因。

关于tensorflow - 如何计算 tensorflow 中tfprof的触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47387561/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com